
Congress Stock Trades Scraper
scrape.ly/store/querystone/congress-trades-scraperNewsBusiness
3 monthly users

Scrape posts from public Facebook pages and profiles: text, timestamps, reactions, comments and shares counts, media, and links for brand monitoring and research.
Public Facebook posts, reactions, and media — from the page itself, without opening a browser.
Built for social teams, analysts, and agencies who need a repeatable feed of public page and profile posts in one dataset.
captionText is onThe actor talks to Facebook over HTTP. There is no browser to start, so a page of posts does not pay for a render.
It is meant to run on Scrapely. A residential proxy is attached inside the run. You do not paste a session cookie.
A page that only returns a login page fails the run. Other pages in that run are still stored when Facebook sent them. The dataset does not get an error row, and the missing page is not treated as delivered.
Empty fields stay off the item. A real 0 or false stays. Nothing is filled in to make a post look complete.
{
"resultsLimit": 20,
"startUrls": [
{
"url": "https://www.facebook.com/humansofnewyork/"
}
]
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"facebookUrl": "https://www.facebook.com/humansofnewyork",
"postId": "1652080019816314",
"url": "https://www.facebook.com/reel/2141054613462232/",
"inputUrl": "https://www.facebook.com/humansofnewyork/",
"pageName": "humansofnewyork",
"timestamp": 1789849138,
"time": "2026-09-19T20:18:58.000Z",
"text": "Henry might be the nicest shopkeeper in NYC. You can visit his Army and Navy Bags store at 177 E Houston.",
"user": {
"id": "100050429952420",
"name": "Humans of New York",
"profileUrl": "https://www.facebook.com/humansofnewyork",
"profilePic": "https://scontent.fhan19-1.fna.fbcdn.net/…"
},
"facebookId": "100050429952420",
"topLevelUrl": "https://www.facebook.com/100050429952420/posts/1652080019816314",
"likes": 19467,
"comments": 788,
"shares": 702,
"reactionLikeCount": 12756,
"reactionLoveCount": 6271,
"reactionCareCount": 426,
"reactionHahaCount": 8,
"reactionWowCount": 3,
"reactionSadCount": 3,
"topReactionsCount": 6,
"feedbackId": "ZmVlZGJhY2s6MTY1MjA4MDAxOTgxNjMxNA==",
"viewsCount": 361894,
"videoPostViewCount": 361894,
"media": [
{
"__typename": "Video",
"thumbnail": "https://scontent.fhan19-1.fna.fbcdn.net/…",
"accent_color": "FF79092A",
"photo_image": {
"uri": "…"
},
"url": "https://www.facebook.com/reel/2141054613462232/",
"id": "2141054613462232",
"liveViewerCount": 0
}
]
}
| Field | What it does |
|---|---|
startUrls | Required. Public Facebook page, profile, post, or reel URLs. |
resultsLimit | Maximum posts to keep per page. Ignored for a direct post URL. Default 20. |
captionText | When true, include transcript text if Facebook already sent it with the post. Default false. |
onlyPostsNewerThan | Keep posts from this time forward. YYYY-MM-DD, a partial ISO timestamp, or a relative value such as 1 day or 2 months. |
onlyPostsOlderThan | Keep posts from this time backward. Same date formats. |
{
"startUrls": [{ "url": "https://www.facebook.com/humansofnewyork/" }],
"resultsLimit": 20
}
Personal profiles that are not public, and pages that answer with a login wall, do not return posts.
Each post is one dataset item. Fields appear only when the page payload had them.
| Field | What it is |
|---|---|
facebookUrl | Page or profile the post came from |
inputUrl | URL you submitted |
pageName | Page slug |
postId | Post id |
url | Permalink |
topLevelUrl | facebook.com/{id}/posts/{postId} when both ids exist |
time, timestamp | Publish time, ISO and Unix |
timeCreated, timestampCreated | Backdated creation time, when it differs |
text, textReferences | Caption and the entities Facebook attached to it |
user | id, name, profileUrl, profilePic |
facebookId | Author id |
collaborators | Tagged collaborators, when the list is not empty |
likes, comments, shares | Reaction total, comment count, share count |
topReactionsCount | How many reaction types Facebook listed |
reactionLikeCount, reactionLoveCount, reactionHahaCount, reactionWowCount, reactionSadCount, reactionAngryCount, reactionCareCount | Counts for the reaction types present on the post |
media | thumbnail, __typename, photo_image, url, id, ocrText when present |
link, previewTitle, previewDescription, previewSource, previewTarget | External link preview |
actionLink | Call-to-action link_display, title, url |
isVideo | True when an attachment is a video |
viewsCount, videoPostViewCount, liveViewerCount | Video and live counts Facebook sent |
feedbackId | Feedback id |
sharedPost | The original post, mapped the same way, when this post is a share |
paidPartnership | Boolean, only when Facebook sent one |
pageAdLibrary | id and is_business_page_active from the page |
topComments | Comments already included with the post: text and author |
captionText | Transcript text, only when captionText was requested and Facebook sent it |
A page that only returns a login page does not add a row, and the run fails. Nothing is invented in its place.
Pay per result, plus platform usage (compute and proxy traffic) at the normal rates.
| Event | When it is charged | Price |
|---|---|---|
| Post | Each post saved to the dataset | $0.0045 ($4.50 per 1,000 posts) |
| Date filter applied | Each saved post, only when onlyPostsNewerThan or onlyPostsOlderThan is set | $0.0008 |
Example: 1,000 posts ≈ $4.50 in event fees plus platform usage; with a date filter ≈ $5.30. In our tests a 20-post run used about $0.005 of platform usage. If you set a maximum charge for the run, the scraper stops cleanly when it is reached and keeps every post it already saved.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayRequiredFacebook URLs
Public Facebook page URLs, e.g. https://www.facebook.com/humansofnewyork/. Personal profiles can't be scraped.
resultsLimitintegerOptionaldefault 20Results amount
How many posts to scrape per page. For example, if set to 5, the scraper extracts up to 5 posts from each page. Ignored for direct post URLs.
Narrow down which posts are returned.
onlyPostsNewerThanstringOptionalPosts newer than
Scrape posts from the provided date to the present day (or date set in 'Older than'). The date should be in YYYY-MM-DD absolute format or in relative format, e.g., 1 day, 2 months, 3 years. The JSON input also supports adding time units (UTC timezone): Full or partial ISO timestamp (e.g., `2025-09-23T10:02:01`) as absolute time and relative time, e.g., `1 hour` or `2 minutes`.
onlyPostsOlderThanstringOptionalPosts older than
Only posts published before this date. Accepts YYYY-MM-DD, a full ISO timestamp (UTC, e.g. 2025-09-23T10:02:01) or a relative value such as 1 day, 2 months or 3 hours.
captionTextbooleanOptionaldefault falseInclude video transcript
Extract video transcript (if available).
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| facebookUrl | string | null | URL of the Facebook page or profile the post was scraped from. |
| postId | string | null | Facebook post ID. |
| url | string | null | URL of the Facebook post. |
| time | string | null | Date and time the post was published, in ISO 8601 format. |
| timestamp | number | null | Unix timestamp of when the post was published. |
| timeCreated | string | null | Original creation date if the post was backdated, in ISO 8601 format. |
| timestampCreated | number | null | Unix timestamp of the original post creation date if backdated. |
| text | string | null | Text content of the post. |
| textReferences | array | null | Entities referenced in the post text (pages, profiles). |
| user | object | null | Author of the post. |
| pageName | string | object | Page or profile name, as a plain string or an object with page details. |
| collaborators | array | null | Collaborators tagged in the post. |
| likes | number | null | Total number of reactions on the post. |
| comments | number | null | Number of comments on the post. |
| shares | number | null | Number of times the post was shared. |
| topReactionsCount | number | null | Total count of top reactions on the post. |
| reactionLikeCount | number | null | Number of Like reactions. |
| reactionLoveCount | number | null | Number of Love reactions. |
| reactionHahaCount | number | null | Number of Haha reactions. |
| reactionWowCount | number | null | Number of Wow reactions. |
| reactionSadCount | number | null | Number of Sad reactions. |
| reactionAngryCount | number | null | Number of Angry reactions. |
| reactionCareCount | number | null | Number of Care reactions. |
| media | array | null | Media attachments (photos, videos) included in the post. |
| link | string | null | External link included in the post. |
| actionLink | object | null | Call-to-action link attached to the post. |
| previewTitle | string | null | Title of a link preview attached to the post. |
| previewDescription | string | null | Description of a link preview attached to the post. |
| previewSource | string | null | Source domain of the link preview. |
| previewTarget | object | null | Target object of the link preview. |
| isVideo | boolean | null | Whether the post contains a video attachment. |
| viewsCount | number | null | Number of video views (for video posts). It is the number that matches the view count numbers you see on Facebook. This view is counted once the video has been watched for at least 1 second. |
| videoPostViewCount | number | null | Number of views on the video post. This view is counted once the video has been watched for at least 3 seconds. |
| liveViewerCount | number | null | Number of viewers of a live video. |
| feedbackId | string | null | Facebook feedback ID associated with the post. |
| sharedPost | object | null | The original post data if this post is a share. |
| paidPartnership | boolean | null | Whether the post is a paid partnership. |
| topComments | array | null | Top comments on the post. |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Date filter applied | One saved post when a date filter (onlyPostsNewerThan or onlyPostsOlderThan) is set | $0.0008 |
| Post | One Facebook post saved to the dataset | $0.0045 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/facebook-posts-scraper').call({
"startUrls": [
{
"url": "https://www.facebook.com/humansofnewyork/"
}
],
"resultsLimit": 20,
"onlyPostsNewerThan": "2024-01-01",
"onlyPostsOlderThan": "2024-12-31",
"captionText": false
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/facebook-posts-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/facebook-posts-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Recent posts of a public Facebook page within a date window.
Page posts including video transcript text.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.