Facebook Posts Search Scraper avatar

Facebook Posts Search Scraper

Pricing

from $3.60 / 1,000 public post saveds

Go to Apify Store
Facebook Posts Search Scraper

Facebook Posts Search Scraper

Find public Facebook posts by keyword, phrase or hashtag. Export post text, author details, dates, engagement and media with date and location filters.

Pricing

from $3.60 / 1,000 public post saveds

Rating

5.0

(1)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

260

Total users

98

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Find public Facebook posts by keyword, phrase or hashtag with Facebook Post Search Scraper, then export their text, authors, publication dates, engagement and media.

This Facebook post search scraper returns Facebook’s search results, with date filters, recent-post selection and city or place-ID filtering. No Facebook account or cookies are required.

Search relevance can include the author and related context, so each row distinguishes literal text matches from author-name matches.

Quick start

Enter a query and a small result limit, then run the Actor:

{ "query": "coffee shop", "resultsCount": 20, "searchType": "top" }

After the run, open the dataset and export JSON, CSV or Excel. JSON preserves nested authors, reactions and attachments. CSV users can select the nested columns they need in Apify’s export settings.

The maximum is 200 unique posts per run. The Actor can return fewer when Facebook exhausts its available results. Public search is not an exhaustive archive of every matching post.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

What you get

  • Original post IDs and Facebook permalinks.
  • Post text, publication timestamps and public author details.
  • Reaction totals and available reaction breakdowns, comment counts and share counts.
  • Photo and video attachments, image URLs and available video URLs and durations.
  • Public outbound links, source ranking and collection time.

Media-only posts can have no text. Missing counts stay null. A missing count is not represented as zero.

Who is it for?

  • Brand researchers: review public posts mentioning a brand and check why each result matched.
  • Campaign analysts: collect discussions within a chosen date window for your own review.
  • Research teams: build a repeatable dataset of public posts with links back to their sources.

How you can use the data

Review public brand mentions

Keep the matching evidence with each post. Search for a brand or phrase, then review postText, matchEvidence and the source link together. Facebook can return results associated with an author's name or other context, so a search hit does not always mean the phrase appears in the post itself.

Study a topic over time

Collect a bounded set of posts for your research period. Apply a date window, export the posts and organize the returned dates in your own report. Facebook's recent-post selection is not a promise of strict chronological order. A location filter describes an association with a place, not proof of where an author lives.

Maintain a research sheet

Compare scheduled exports in your own workflow. Save each dataset and use postId to identify posts already in your sheet. Separate scheduled runs are independent collections, so your workflow handles comparisons between them. The Automation and integrations section below explains how to schedule those runs.

Input settings

Recent hashtag posts

{ "query": "#coffee", "resultsCount": 20, "searchType": "latest" }

Posts within a date range

{ "query": "bronco", "resultsCount": 20, "startDate": "2025-01-01", "endDate": "2025-01-31" }

Posts associated with a city

{ "query": "coffee", "resultsCount": 10, "location": "London, United Kingdom" }

An exact Facebook place ID

{ "query": "coffee", "resultsCount": 10, "location": "106078429431815" }

More input settings

FieldMeaning
queryRequired keyword, phrase or hashtag, from 1 to 100 characters.
resultsCountMaximum unique posts, from 1 to 200. Default 20.
searchTypetop uses native relevance. latest selects Facebook’s recent-post filter.
startDateOptional inclusive publication date, YYYY-MM-DD.
endDateOptional inclusive publication date, YYYY-MM-DD.
locationQualified city name, region name or numeric Facebook place ID.
maxRunSecondsMaximum processing time, from 30 to 600 seconds. Default 110. Reaching the budget returns successful partial results. The platform timeout also reserves time for saving state and shutdown.
Connection (proxyConfiguration)Standard Apify Proxy by default. Explicit saved settings, including Direct, take precedence. See field help for managed groups and country.

Standard Apify Proxy is used when no connection setting is supplied. To connect directly, set proxyConfiguration to { "useApifyProxy": false }. Facebook may rate-limit direct cloud connections. Residential proxy is used only when explicitly selected.

Existing integrations may include keyword and results_limit alongside the canonical fields when their values agree exactly. search_type: "posts" is also accepted. Use searchType for ranking. Conflicting values fail before searching. Prefer the canonical fields in new integrations.

Date limits apply to the returned post or share, rather than the date of an attached original. Invalid dates, reversed ranges and unsupported inputs fail before searching or charging.

Output data

This shortened example shows fields from an observed public result:

{
"postId": "122328142718011695",
"publishedAt": "2026-08-24T18:50:56Z",
"postText": "Monday called… and said you need a Moody Cat pick-me-up. 🐱☕️💗",
"author": {
"id": "61550350854900",
"name": "Moody Cat Coffee Shop"
},
"reactionsCount": 53,
"commentsCount": 7,
"sharesCount": 5,
"searchQuery": "coffee shop"
}

Counts and availability can change after collection. The full dataset also includes the post permalink, timestamps, media, ranking and match evidence.

More output fields

FieldDescription
postId, urlStable source post identifier and permalink.
postTextSource text. Null for posts without available text.
timestamp, publishedAtPublication time as milliseconds since Unix epoch and UTC ISO date-time.
authorPublic ID, name, profile URL, profile picture and raw source entity type. The entity type is not an inferred account category.
reactionsCount, reactionsTotal reactions and the available named reaction counts. A breakdown may not include every reaction type.
commentsCount, sharesCountAvailable engagement totals. Null if the source omits them.
attachmentsMedia ID, type, permalink and available image URL, dimensions, caption, video URL and duration.
attachments[].enrichmentStatusFor video detail lookup: complete or unavailable. Base post data remains available if optional media details cannot be retrieved.
externalUrlsDeduplicated public links from the post and its attachments.
privacySource visibility description when present.
sharedPostSeparate original-post identity when the result is a reshare.
searchQuery, rank, sourcePageQuery and position in this collected native result sequence.
matchEvidenceWhether the literal query appears in post text or the author name. Native relevance can use other context.
searchLocationResolved location input, ID, name and resolution method when a location was requested.
collectedAtUTC collection timestamp.

Post permalinks can use the exact numeric source post ID when Facebook omits the separate link. Photo permalinks can be formed from the public photo ID when the source omits a separate link. Media download links may expire. Download permitted media promptly if you need a durable copy.

Export Facebook post search data on a schedule

Save a tested input as an Apify task and attach a schedule in your account. Use date windows to control the collection period, then deduplicate successive exports by postId.

Search ranking and visibility can change between runs. A post newly returned by a search is not necessarily newly published. Use publishedAt to distinguish those events.

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Pricing

The result event is charged once per unique post saved to the dataset. Duplicate results are not charged again. There is no separate Actor fee for a successful location lookup or available video enrichment.

Apify platform usage and any proxy use follow your plan.

A failed run may contain posts that have already been saved and charged. The Actor preserves useful output when a later request fails, so check the run status and summary before treating a dataset as complete.

See the live Pricing tab for current rates and discounts.

Tips for best results

  • Use a precise location. Provide a qualified city name, region or exact Facebook place ID when you need a location filter.
  • Check why each result matched. Review matchEvidence alongside the post text and source link to distinguish literal matches from author-name or contextual matches.
  • Sort returned dates when order matters. Facebook's recent-post selection does not guarantee strict chronological order. Your spreadsheet or assistant can sort the collected publication dates.

Limits and caveats

The Actor collects public results available without a Facebook login. It does not collect private posts, private-group content, restricted comments or a complete author timeline.

A transient connection timeout and an explicit rate limit each receive at most one retry on the current connection. If a standard managed connection remains rate-limited, the Actor may refresh that connection at most twice while continuing the same search. Explicit Residential or Unblocker connections do not receive these additional attempts. Direct connections stay direct. The selected groups, country, search filters and total processing budget remain unchanged. Access restrictions, unavailable public results, malformed source responses and processing deadlines can stop a run. Previously saved rows remain in the dataset. RUN-SUMMARY reports the final status, saved count, pages, warnings and whether work remains.

Reaching the configured processing budget is a successful partial stop: Apify reports SUCCEEDED, while RUN-SUMMARY reports status: "time_limit_reached", completion: "partial", stopReason: "processing_time_budget" and pending: true. saved is the number of posts actually saved and billed. requested is the maximum requested. A partial stop does not mean the search was exhausted, even when no posts were saved. Independent network timeouts, Facebook rejections, malformed responses and storage/billing failures remain errors. The default platform timeout is 150 seconds. At least 30 seconds, or 10% of a longer platform timeout, are reserved for shutdown, so the effective processing budget can be shorter than maxRunSeconds.

An explicitly empty search, or an exhausted search whose posts all fall outside your date window, can finish with zero rows. RUN-SUMMARY reports source_exhausted, saved and dateFilteredResults. This means no matching posts were found in Facebook’s available results, not that none exist. Access denials, missing search responses, stalled pagination and unexpected network timeouts still fail instead of pretending that the query had no matches.

limit_reached means the Actor saved the number of posts requested by resultsCount. source_exhausted means Facebook explicitly reported no next page for the current anonymous search session. Another session may return a different set of posts. The summary records sourceExhaustedReason: "facebook_has_next_page_false" and the last pagination.hasNextPage value. Incomplete streamed responses, missing pagination flags and pagination errors fail rather than count as exhaustion.

Search results are deduplicated within a run. Restarted execution reuses saved IDs and checkpoints. Separate scheduled runs are independent datasets.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~facebook-post-search-scraper/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data @- <<'JSON'
{
"query": "coffee shop",
"resultsCount": 20,
"searchType": "top"
}
JSON

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/facebook-post-search-scraper').call({
"query": "coffee shop",
"resultsCount": 20,
"searchType": "top"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/facebook-post-search-scraper').call(run_input={'query': 'coffee shop', 'resultsCount': 20, 'searchType': 'top'})
print(client.dataset(run['defaultDatasetId']).list_items().items)

Use with an AI assistant notes

This public Actor uses limited permissions and pay-per-event pricing. Set a small resultsCount when asking an assistant to collect posts, and retrieve records from the run's default dataset. Missing source values remain null or absent as described above.

MCP and AI agents

You can ask your AI assistant to collect data with Facebook Posts Search Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Facebook Posts Search Scraper. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/facebook-post-search-scraper"
}
}
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Facebook Posts Search Scraper by Fetch Cat, or give it the identifier fetch_cat/facebook-post-search-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

Try asking your assistant for the data you need:

  • “Find up to 20 public Facebook posts mentioning LEGO. Show their text, publication dates, source links and why each result matched the search.”

  • “Get up to 10 recent public Facebook posts about coffee associated with London. Include the available engagement counts and sort the returned posts by date for me.”

  • “Collect up to 20 public Facebook posts about electric bikes published between 1 and 30 September 2026. Put them in a research table with their original links and any collection warnings.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

Ranking and location matching

latest means Facebook’s recent-post selection. It does not promise strictly descending timestamps. You can sort collected rows by publishedAt, but that does not make a limited sample an exhaustive chronological feed.

Use a qualified location such as London, United Kingdom or Lisbon, Portugal. The verified local-name variant Milano, Italy is resolved as Milan, Italy. The original input and Facebook’s resolved name remain in searchLocation. A completed, error-free lookup with no geographic matches finishes successfully with zero posts, a visible warning and RUN-SUMMARY reason no_geographic_match. No post search is performed and your location filter is never removed. An ambiguous city name still fails with an explanation; malformed responses, blocking, upstream and transport errors remain failures.

A region such as Alaska selects the first matching city supplied by Facebook. The resolved name and ID appear in searchLocation. Use an exact place ID when that choice matters.

Location filtering follows Facebook’s association of a post with a place. It is not a verified author residence or a radius search.

FAQ

What data can I export with facebook post search scraper?

Public post text, source IDs and links, authors, publication dates, available engagement, media and query provenance. The output field table explains nullable values and optional video details.

Can I run Facebook Posts Search Scraper through an API, schedule, or MCP client?

Yes, when your account has access to the Actor. Use its real input keys with the Apify API, a saved task and schedule, or the official MCP server.

Does it search only hashtags?

No. It accepts ordinary words and phrases as well as hashtags. Search relevance follows Facebook. It is not an exact-text-only filter.

How much does it cost to use Facebook Posts Search Scraper?

You pay for the unique posts saved through the result event. Consult the Pricing tab for current rates, and inspect partial output when a run fails.

  • Facebook Groups Search Scraper — Discover public Facebook group records by keyword and optional location, with available names, group links and displayed counts.
  • Facebook Group Insights Scraper — Collect available public Facebook group About details and member counts from exact group URLs, not group posts.
  • Facebook Pages Scraper — Collect public Facebook Page profiles with available contact fields, audience counts and optional post links.
  • Facebook Posts Scraper — Collect public Facebook post captions, media references and available engagement from supported page, group or post targets.
  • Tweet Scraper — Collect public X post text, author details and available engagement from known profile or post URLs.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥