Facebook Search API and MCP — Find Pages, Posts and Reels by Keyword
Send a keyword — and optionally a location — and this source searches Facebook for pages, profiles, posts or reels. Page results carry the page profile fields (intro, followers, rating, contacts where shown); post and reel results carry the text and engagement.
- You send
- A keyword, an optional location and a search type
- You get back
- Matching pages, profiles, posts or reels
- Coverage
- Public Facebook pages, profiles, posts and reels that Facebook's search returns.
- Price
- 10 points per returned result, up to 1,000 per request — $10 per 1,000
- Billed per result actually returned, capped by max_items. A search that matches nothing costs nothing.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Searching by hand | Type a term, scroll, copy what comes up | Free, and slow | Fine for one search, not for a city-by-city list |
| Meta's Graph API | App review and permissions | Free, gated | Public page search is heavily restricted |
| NeuralVerge | One request per keyword | $10 per 1,000, misses not billed | Returns what Facebook's search returns — keyword matching is loose, so expect some off-target results |
What you get back
Every field in the example response below.
| Field | Type | Description |
|---|---|---|
query | string | The keyword searched. |
location | string | The location the search was narrowed to, if any. |
search_type | string | pages, pages-google, profiles, posts or reels. |
total_items | number | How many results came back. |
items[].result_type | string | What the result is: page, profile, post or reel. |
items[].id | string | Facebook's ID for the result. |
items[].name | string | Page or profile name. |
items[].url | string | Link to the page, profile, post or reel. |
items[].intro | string | null | Page intro text, for page results. |
items[].followers | number | null | Followers, where search shows them. |
items[].is_verified | boolean | Whether the page is verified. |
Example response
A real response, as returned.
{
"session_id": "32d761e9-b344-4032-aa89-d06dd58fac4d",
"kind": "facebook_search",
"query": "coffee roaster",
"location": "Portland",
"search_type": "pages",
"max_items": 2,
"partial": false,
"machine": {
"total_items": 2,
"items": [
{
"result_type": "page",
"id": "100057940755013",
"name": "Portland",
"url": "https://www.facebook.com/PortlandBelgium",
"intro": "🍾✨ 'CHAMPAIN' out NOW 💫🍾 https://linktr.ee/portlandsounds ☼ @Portlandsounds ☼",
"followers": null,
"email": null,
"phone": null,
"is_verified": true,
"source_url": "https://www.facebook.com/search/top?q=coffee%20roaster%20Portland"
},
{
"result_type": "page",
"id": "100068645211226",
"name": "East Portland Coffee Roasters",
"url": "https://www.facebook.com/people/East-Portland-Coffee-Roasters/100068645211226/",
"intro": "24-hour single origin coffee roasters, at the corner of Division and 79th, right across from Portland Community College. Great food and drinks besides!",
"followers": null,
"email": null,
"phone": null,
"is_verified": false,
"source_url": "https://www.facebook.com/search/top?q=coffee%20roaster%20Portland"
}
],
"errors": []
},
"total_points": 20
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
This endpoint is synchronous: the call blocks until the lookup completes and returns the records directly. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever it collected so far — re-run with a smaller max_items for a complete result. query is required. Optional: location (e.g. New York), search_type (pages, pages-google, profiles, posts or reels; default pages), max_items (1-1,000, default 20).
curl -X POST https://api.neuralverge.ai/functions/v1/run-facebook-search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "coffee roaster", "location": "Portland", "search_type": "pages", "max_items": 20 }'What teams use it for
Where this field shows up in an actual workflow.
Build a list of businesses of a type in a city, then pull their contacts.
Search posts or reels for a brand, product or topic to see what's being published.
Find every page in a niche you didn't know about.
Let an agent find the right page before it reads posts or reviews.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Public Facebook pages, profiles, posts and reels that Facebook's search returns.
Read at request time.
This source returns publicly visible content, which can include the names and words of private individuals. Use it for legitimate business purposes under your own lawful basis, honour deletion and opt-out requests, and check the acceptable use policy for what is out of bounds. Every record is stamped with the URL it was read from and a session id you can trace.
- —Keyword matching is loose — in the sample above, a band named Portland comes back for 'coffee roaster' in Portland. Filter results downstream.
- —Search results carry fewer fields than a full page lookup; contacts and follower counts are often empty until you resolve the page.
- —Results and their order reflect Facebook's own search ranking.
Questions, answered
Yes — every Data Source endpoint, including this one, is synchronous: the lookup runs inside the request and the result comes back in the same response, no polling. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever records it collected so far — re-run with a smaller max_items to get a complete result instead of a partial one.
Related sources
Try facebook search on your own data
One request format across every source in the catalog.