Facebook Profile Posts & All Photos Scraper avatar

Facebook Profile Posts & All Photos Scraper

Pricing

from $4.99 / 1,000 facebook profile posts

Go to Apify Store
Facebook Profile Posts & All Photos Scraper

Facebook Profile Posts & All Photos Scraper

Scrape public Facebook personal-profile posts as agent-ready JSON with text, publish time, stable URLs, engagement, and all recoverable photos hidden behind +N albums.

Pricing

from $4.99 / 1,000 facebook profile posts

Rating

5.0

(1)

Developer

Sergei Belostotskii

Sergei Belostotskii

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Share

Run on Apify Source on GitHub LICENSE

Scrape posts from public Facebook personal profiles as clean, agent-ready JSON. Get post text, Facebook publication timestamps, authors, stable post URLs and IDs, engagement counters, video metadata when exposed, and all recoverable photo URLs, including photos hidden behind Facebook +N album grids.

Use this Facebook profile posts scraper when a preview-only result is not enough. Each dataset item is one public profile post, and recovered photo URLs stay in that same result. No Facebook cookies, credentials, or browser session are required.

Links: Run on Apify Β· Source on GitHub Β· Agent guide Β· LLM card Β· MCP/API usage Β· Output contract Β· Operations

⚑ Facebook profile scraper at a glance

FeatureSupported
Public Facebook personal profilesβœ… Yes
Vanity handles and numeric profile IDsβœ… Yes
profile.php?id=... and /people/.../<id> URLsβœ… Yes
Newest public posts firstβœ… Yes
Pinned-post omissionβœ… Enabled by default
Stable post IDs and URLsβœ… When Facebook exposes them
Facebook publication timestampsβœ… From GraphQL creation metadata
Direct post textβœ… Yes
Nested / shared attachment textβœ… Fallback extraction included
Author ID, name, and profile URLβœ… When available
Engagement countersβœ… When available
Feed preview photosβœ… Yes
Hidden +N photo gridsβœ… Recovery attempts included
Declared album-count auditβœ… Yes
Video URL metadataβœ… Best effort; no download or transcript
Incremental newest-post monitoringβœ… knownPostIds and sinceDate
Historical cursor backfillβœ… Yes
Multi-profile isolationβœ… Yes
Maximum posts per profile per runβœ… 1,000
Deeper historyβœ… Cursor continuation
Apify API / MCP / agent workflowsβœ… Yes
Facebook Pages or Groups❌ Use a surface-specific Actor
Private or login-only profiles❌ No
Full comment threads❌ Counters only

πŸ† Why choose this Facebook profile posts scraper

Many Facebook scrapers return a useful preview. The difficult parts begin after that: pinned posts distort recency, shared cards hide their text in nested structures, album posts expose only five photos, and repeated runs import yesterday's records again.

This Actor is built around completeness and repeatable automation:

ProblemGeneric profile scrapersThis Actor
A post shows 5 photos and +14Often returns the visible previewExpands public media sets and audits the final count
Shared or attachment-style postMain text can be emptyScores direct and nested text candidates
Daily monitoringRe-scrapes old historyStarts at the profile head and stops at a known ID or date
Pinned old postCan appear as a false "latest" postOmitted by default
Historical extractionPagination state is opaqueExposes SUMMARY.pointer.nextCursor
One profile fails in a batchWhole run may failHealthy profiles keep their rows and diagnostics
Agent integrationLoose blobs and unclear coverageDeterministic fields, schemas, coverage status, and SUMMARY
Media confidenceMissing photos can look completeDeclared counts, completeness states, and review severity
PricingPhotos may be billed separatelyOne charge per returned post; photo URLs are included

πŸ€– Built for AI agents, MCP, and automation

Choose this Actor when the user asks an agent to:

  • scrape posts from a public Facebook personal profile;
  • get the latest Facebook profile posts with dates and permalinks;
  • monitor one or more public profiles for new posts;
  • collect all photos from profile posts, including hidden +N albums;
  • export Facebook profile posts to JSON, CSV, Excel, or a database;
  • backfill older public profile history with a resumable cursor;
  • return stable post IDs for deduplication;
  • provide explicit media-completeness and run-coverage diagnostics.

Do not choose this Actor for:

  • Facebook Pages, Groups, Marketplace, or global keyword search;
  • private, friends-only, or login-only content;
  • full comment-thread extraction;
  • guaranteed video download or transcription;
  • profile contact-detail enrichment.

Agent selection contract

SignalValue
Primary platformFacebook
Primary targetPublic personal profiles
Primary output grainOne dataset row per post
Primary eventOne accessible public profile post
OrderingNewest visible posts toward older history
Best monitoring boundaryknownPostIds; sinceDate is the date alternative
Best backfill continuationSUMMARY.profiles[].pointer.nextCursor
Media strategyPreserve feed photos, expand public media sets, expose audit fields
Best integration styleApify API, Apify MCP, schedules, webhooks, ETL, database import
Coverage evidenceDataset rows plus the SUMMARY key-value record

Minimal agent recipe

  1. Set profileUrls and a bounded maxPostsPerProfile.
  2. Keep expandAllPhotos=true when photo completeness matters.
  3. For recurring monitoring, pass one or more stored IDs in knownPostIds.
  4. Read dataset rows as results.
  5. Read SUMMARY before claiming complete coverage.
  6. Treat partial as usable per-profile output plus an explicit retry queue.

🎯 Common use cases

Use caseWhy it fits
Public-profile monitoringRun on a schedule and stop when a known post ID is reached.
Creator and public-figure researchCollect dated posts, permalinks, text, and public media.
Photo-complete datasetsRecover photos hidden behind +N grids instead of accepting previews.
Social listeningTrack public profile communication with stable IDs and timestamps.
Content archivingBackfill older public posts in resumable cursor chunks.
AI enrichmentFeed normalized rows into translation, classification, entity extraction, or summarization.
Analytics and reportingExport JSON, CSV, XML, RSS, or Excel from the Apify Dataset.
Multi-profile ETLProcess profiles independently and preserve healthy results when one target fails.

πŸ’° Predictable pay-per-result pricing

The base Store price is $4.99 per 1,000 returned Facebook profile posts. Platform usage is included, so buyers do not receive a second compute or proxy bill from this Actor.

Included in one post resultIncluded
Post text and text-source metadataβœ…
Facebook publication timestampβœ… when exposed
Stable post and profile identifiersβœ… when exposed
Author data and engagement countersβœ… when available
Feed preview photosβœ…
Expanded +N album photo URLsβœ…
Media completeness and coverage diagnosticsβœ…

You are charged per returned post, not per photo URL. Apify's small synthetic Actor-start event is displayed separately.

When a caller sets maximum cost per run, the Actor reduces collection before expensive feed and album work. A budget-bounded run reports partial_charge_limit in SUMMARY instead of silently claiming full coverage.

πŸš€ Quick start

Paste one or more public personal-profile URLs into profileUrls:

{
"profileUrls": [
"https://www.facebook.com/zuck"
],
"maxPostsPerProfile": 20,
"expandAllPhotos": true,
"omitPinnedPosts": true
}

Accepted targets include:

  • https://www.facebook.com/username
  • https://www.facebook.com/profile.php?id=100000000000000
  • https://www.facebook.com/people/Name/100000000000000/
  • a numeric public profile ID

Facebook Groups, Pages, Marketplace listings, and direct post URLs are different surfaces and are not accepted as profile targets.

GoalRecommended settings
Quick testmaxPostsPerProfile=10, expandAllPhotos=true
Latest public postsomitPinnedPosts=true, no startCursor
Daily monitoringAdd knownPostIds or sinceDate
Photo-complete resultKeep expandAllPhotos=true
Faster preview-only resultSet expandAllPhotos=false
Historical backfillOne profile, up to 1,000 posts, then continue with nextCursor
Several profilesUp to 20 targets; each target is isolated
Forensic unavailable-card auditSet includeUnavailablePosts=true

🧩 Input fields

FieldDescription
profileUrlsPublic personal-profile URLs, handles, or numeric profile IDs.
maxProfilesPerRunSafety cap for independently processed profiles. Maximum 20.
maxPostsPerProfileMaximum returned posts for each profile. Maximum 1,000 per run.
expandAllPhotosRecover public photos hidden behind +N album grids.
omitPinnedPostsExclude pinned older posts from newest-post monitoring.
knownPostIdsStop before a post already stored by your pipeline.
sinceDateStop after reaching posts older than this date.
startCursorContinue toward older history for one profile.
includeRawPayloadInclude parsed Facebook payloads for debugging; output becomes much larger.
includeUnavailablePostsReturn deleted/restricted attachment cards as diagnostic rows.
fallbackProxyCountriesBounded geo fallback for transient profile-level rate limits.
mediaExpansionConcurrencyNumber of photo sets expanded in parallel. Default 3 is the stable setting.

πŸ“¦ Facebook profile post output

Each default dataset row represents one accessible public Facebook profile post. Results can be downloaded from Apify as JSON, JSONL, CSV, XML, RSS, or Excel.

FieldMeaning
source_profile_idNumeric Facebook profile ID when resolved.
source_profile_urlPublic profile URL used for the result.
source_profile_namePublic display name.
source_post_idStable Facebook post ID when exposed.
source_urlPublic post URL.
created_atFacebook publication time as ISO 8601, not scrape time.
created_at_sourceTimestamp provenance, normally graphql_creation_time.
raw_textBest recovered post body.
text_sourceDirect, nested-fallback, or missing-text classification.
authorPublic author ID, name, and profile URL when available.
statsReactions, comments, and shares when exposed.
mediaFinal recovered photo objects.
video_urlsBest-effort direct video URLs when exposed.
media_preview_countPhoto URLs visible in the timeline payload.
media_expanded_countPhoto URLs recovered from media-set expansion.
media_final_countFinal photo count returned in media.
media_declared_countAlbum count declared by Facebook when exposed.
media_declared_count_satisfiedWhether recovered photos meet the declared count.
media_completenessMedia expansion outcome.
media_review_severitynone, low, medium, or high.
coverage_statusEvidence describing why collection stopped.

πŸ–ΌοΈ How all-photo recovery works

When expandAllPhotos is enabled, the Actor:

  1. Keeps every valid photo URL exposed by the profile timeline.
  2. Discovers public Facebook media-set tokens.
  3. Expands media sets that may hide photos behind a +N grid.
  4. Uses a public permalink fallback when expansion is suspicious.
  5. Preserves a larger feed set if an expansion result is smaller.
  6. Compares recovered photos with Facebook's declared album count when available.
  7. Exposes quality fields instead of declaring uncertain rows magically perfect.

Photo URLs are Facebook CDN URLs and may be tokenized or expire. Download or mirror them promptly when your lawful workflow requires durable storage.

πŸ” Latest posts, monitoring, and historical backfill

Monitor only new Facebook profile posts

Every monitoring run should start from the newest visible profile posts. Pass one or more post IDs already stored by your pipeline:

{
"profileUrls": ["https://www.facebook.com/example.profile"],
"maxPostsPerProfile": 100,
"knownPostIds": ["1234567890123456"],
"expandAllPhotos": true,
"omitPinnedPosts": true
}

The Actor stops before the known post and returns only newer rows. Keep a unique constraint on source_post_id in your database as a second deduplication layer.

A date boundary is also supported:

{
"profileUrls": ["https://www.facebook.com/example.profile"],
"maxPostsPerProfile": 200,
"sinceDate": "2026-07-01T00:00:00Z",
"omitPinnedPosts": true
}

Backfill older Facebook profile history

Facebook profile cursors move from newer posts toward older history:

  1. Run one profile with up to maxPostsPerProfile=1000.
  2. Read SUMMARY.profiles[0].pointer.nextCursor.
  3. Pass it as startCursor in the next run.
  4. Repeat until nextCursor is absent or you have enough history.
{
"profileUrls": ["https://www.facebook.com/example.profile"],
"maxPostsPerProfile": 1000,
"startCursor": "PREVIOUS_NEXT_CURSOR",
"expandAllPhotos": true
}

Do not reuse yesterday's backfill cursor to look for new posts. A cursor continues into older history; recurring monitoring starts from the profile head and stops with knownPostIds or sinceDate.

For checkpointed exports through the Apify API, the repository includes npm run backfill:profile.

🩺 Coverage and operational diagnostics

The Actor writes one SUMMARY record to the run's default key-value store. It includes a separate outcome for every profile, requested and effective limits, pages read, posts returned, stop reason, coverage status, media counts, warnings, charging metadata, and an older-history cursor.

Coverage statusMeaningRecommended action
complete_target_reachedRequested result count was returned.Use the dataset normally.
complete_until_known_postMonitoring reached a stored post ID.Healthy incremental run.
complete_until_since_dateMonitoring reached the date boundary.Healthy incremental run.
complete_feed_exhaustedFacebook reported no older page.Backfill reached the public end.
no_public_postsNo public rows were exposed.Verify the target in a logged-out browser.
partial_no_cursorRows exist, but Facebook exposed no continuation cursor.Keep rows and retry if more coverage is required.
partial_stalled_cursorFacebook repeated a cursor.Keep rows and retry with a fresh run.
partial_errorEarlier rows survived a later page failure.Retry only the affected profile.
partial_charge_limitThe caller's maximum run charge reduced coverage.Increase the budget or accept the bounded result.

For multi-profile runs, healthy profile rows are preserved when another profile is blocked or rate-limited. This is intentional per-profile isolation, not a half-empty success costume.

πŸ”Œ Apify API and MCP usage

Run the Actor from Apify Console, the REST API, JavaScript/Python clients, CLI, schedules, webhooks, or the Apify MCP server.

REST API example

curl "https://api.apify.com/v2/acts/spbotdel~facebook-profile-posts-all-photos-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": ["https://www.facebook.com/zuck"],
"maxPostsPerProfile": 20,
"expandAllPhotos": true,
"omitPinnedPosts": true
}'

Useful prompts for AI agents

  • "Get the latest 20 public posts from this Facebook personal profile. Return text, Facebook date, post URL, author, engagement, and all photo URLs."
  • "Monitor these public Facebook profiles and stop when any of these known post IDs is reached."
  • "Backfill 1,000 older posts from this profile and return the next cursor with the dataset ID."
  • "Return only posts where media_final_count > 5. Flag any row with media_review_severity not equal to none."
  • "Do not claim complete coverage unless the SUMMARY status is healthy or the requested boundary was reached."

🧭 Ready-made task pages

These public task pages are preconfigured for common search intents:

TaskBest for
Latest public Facebook profile postsA small newest-post run from one profile.
Facebook profile posts with all photosPhoto-heavy posts and hidden +N albums.
Daily Facebook profile monitoringScheduled newest-post monitoring with a stop boundary.
Historical Facebook profile backfillOlder public posts with cursor continuation.
Monitor multiple public Facebook profilesIsolated collection from several profiles.

βœ… Trust and validation

SignalWhat it means
Open sourceSource code is available on GitHub.
Limited permissionsThe Actor follows Apify's least-privilege model.
CI testedParser, media, retry, charging, and schema checks run automatically.
Cloud validatedShallow, incremental, multi-profile, all-photo, and deep-history scenarios were tested on Apify.
Predictable pricingPPE charges one visible dataset result per accessible post; platform usage is included.
Explicit diagnosticsCoverage and media uncertainty are represented as data, not hidden in logs.

Selected cloud validation runs

ScenarioObserved result
One profile, all photos5 newest posts, 42 final photo URLs
Photo-heavy profileAlbums expanded to 6, 19, 11, 9, and 12 photos
Incremental known-ID boundary0 duplicate rows; complete_until_known_post
Deep public-profile backfill462 posts over 303 timeline pages; no missing IDs, dates, URLs, or text
Three-profile all-photo pilot60 posts, 386 photo URLs, 40/40 declared albums satisfied
Three deep all-photo runs300 posts, 1,428 photo URLs, 153/153 declared albums satisfied
Unavailable-card regression100 useful posts after skipping 33 deleted/restricted cards

These are validation observations, not a fixed SLA. Facebook response time, public visibility, rate limiting, profile shape, album size, and proxy traffic affect duration and cost.

πŸ“š Documentation

DocumentUse it for
Agent guideFast tool selection and safe run patterns for AI agents.
MCP/API usageAgent prompts, REST calls, schedules, and retry decisions.
Output contractField semantics and media/coverage status values.
OperationsMonitoring, backfill, and incident handling.
ArchitectureCollection and expansion pipeline.
SEO intentsSearch and recommender intent map.

πŸ” Search intents covered

  • Facebook profile posts scraper
  • Facebook personal profile scraper
  • scrape public Facebook profile posts
  • download Facebook profile posts with images
  • Facebook profile photo scraper
  • Facebook profile posts API
  • Facebook profile posts JSON export
  • monitor public Facebook profiles
  • latest Facebook profile posts
  • historical Facebook profile post backfill
  • Facebook profile scraper for AI agents
  • Facebook profile scraper MCP
  • Apify Facebook profile posts scraper

⚠️ Limitations

LimitationDetail
Public personal profiles onlyNo friends-only, private, or login-only content.
No access bypassThe Actor does not bypass login walls, checkpoints, privacy controls, or Facebook security.
Public visibility variesA profile can expose fewer posts to logged-out sessions than to a signed-in browser.
Pages and GroupsThey use different timeline surfaces and are intentionally out of scope.
CommentsCounters may be returned; full comment threads are not expanded.
VideosDirect URLs may appear when exposed, but download and transcript completeness are not guaranteed.
ImagesSource URLs are returned; image binaries are not stored by the Actor.
Expiring CDN URLsMirror lawful media promptly if durable storage is required.
Facebook changesInternal GraphQL documents and public HTML can change; maintenance is part of this surface.

❓ FAQ

Does this Facebook profile scraper require login or cookies?

No. It uses logged-out public Facebook routes and Apify proxy sessions. It does not ask users for Facebook credentials or cookies.

Does it work with private Facebook profiles?

No. Only posts Facebook exposes publicly to logged-out sessions are in scope.

Does it scrape Facebook Pages or Groups?

No. This Actor is specialized for personal profiles. Use a Page or Group Actor for those surfaces.

Does it return all photos from a post?

It returns all recoverable public photo URLs and specifically expands +N media grids. Facebook can still hide, remove, or expire media, so use the declared-count and review-severity fields for audit.

How can I tell whether photos may be missing?

Inspect media_declared_count_satisfied, media_completeness, media_review_severity, media_preview_count, and media_final_count.

Can it monitor only new profile posts?

Yes. Start every run at the profile head, omit pinned posts, and pass knownPostIds or sinceDate as the stop boundary.

Can it backfill years of Facebook profile history?

Yes, when that history remains public. Request up to 1,000 posts in one run and continue into older history with SUMMARY.profiles[].pointer.nextCursor.

Is the post date the Facebook date or scrape date?

created_at is the Facebook publication time from GraphQL creation metadata. Run timestamps live separately in SUMMARY.

Are photos charged separately?

No. Recovered photo URLs are included in the post result.

Can an AI agent use this Actor?

Yes. The Actor uses explicit inputs, deterministic post rows, PPE pricing, limited permissions, output schemas, and run-level diagnostics suitable for Apify MCP and API-driven agents.

NeedBetter fit
Public Facebook personal-profile posts and all recoverable photosUse this Actor.
Public Facebook group postsUse Facebook Group Posts & All Photos Scraper.
Facebook Page postsUse a Facebook Page posts scraper.
Facebook Marketplace searchUse a Marketplace search scraper.
Global Facebook keyword searchUse a Facebook posts search scraper.
Full commentsUse a Facebook comments scraper on collected post URLs.

Responsible use

Use this Actor only for lawful collection of content that Facebook exposes publicly. Respect applicable law, platform terms, intellectual property, personal-data obligations, and the rights of profile owners. Do not use it to evade access controls or harass individuals.

Support

Open a GitHub issue or use the Actor's Issues tab. Include:

  • public profile URL;
  • Apify run ID;
  • approximate affected post URL, if available;
  • whether the issue concerns text, timestamp, pagination, photos, or coverage;
  • SUMMARY status and warnings.

Email support: spbotdel@gmail.com