TikTok Photo Scraper – Images, Captions & Stats avatar

TikTok Photo Scraper – Images, Captions & Stats

Pricing

from $1.00 / 1,000 results

Go to Apify Store
TikTok Photo Scraper – Images, Captions & Stats

TikTok Photo Scraper – Images, Captions & Stats

Extract public TikTok photo posts from URLs. Get ordered image links and dimensions, captions, engagement, creator details, music, hashtags, and mentions in one row per post.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

ScrapingMonkey

ScrapingMonkey

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Collect the images and context behind a public TikTok photo post. TikTok Photo Scraper returns the ordered photo URLs, dimensions, caption, music, creator details, and available engagement figures from a full /photo/ link.

A photo post stays in one dataset row, with image lists kept in their original order. No TikTok login or cookies are required, and each result includes its source input and status.

At a glanceDetails
πŸ“₯ InputFull TikTok /@username/photo/ID URLs
πŸ“€ OutputOrdered image URLs, dimensions, caption, engagement, creator, music, and tags
πŸ” Login requiredNo
⚑ ProcessingUp to 5 photo posts concurrently with automatic retries
πŸ’Ύ DeliveryOne dataset row per unique valid photo-post ID

What the TikTok photo post scraper extracts πŸ”Ž

The Actor retrieves the photo collection exposed for each requested post and keeps its images together. It also captures the text, sound, and creator context needed to understand the collection.

  • Post ID, canonical URL, caption, publication time, and reported creation region
  • Ordered image URLs, available alternative URLs, width, and height
  • The first photo as the image cover
  • Views, likes, comments, shares, and saves when exposed
  • Creator profile details and available audience counts
  • Music metadata, hashtags, mentions, and source-provided content or interaction flags

The result contains links to images. It does not download image files or convert a photo post into a video.

How to scrape TikTok photo post details πŸš€

  1. Copy the full URL of a public TikTok photo post.
  2. Paste it into inputList; add other photo links as separate items.
  3. Start the Actor and check the dataset's status column.
  4. Export the photo URLs and the accompanying caption or metrics.
{
"inputList": [
"https://www.tiktok.com/@qq.mm.pp/photo/7479037796326362385"
]
}

The address must contain /photo/. Short share links, /video/ links, profile URLs, and bare numeric IDs are not supported.

TikTok photo post data fields and output πŸ“¦

Field groupIncluded data
PostID, canonical URL, caption, type, creation date, and region
Photo collectionOrdered main and alternative image URLs with dimensions
CoverThe first photo's URL, alternatives, width, and height
Engagement and creatorAvailable post metrics, creator identity, bio, account flags, and counts
Music and text tagsSound details, hashtags, mentions, labels, and interaction flags

Complete illustrative success item; these fictional values show the output structure and are not a live result:

{
"input": "https://www.tiktok.com/@trailjournal/photo/7523456789012345678",
"status": "success",
"image_cover.url": "https://example.com/trail-view.jpg",
"url": "https://www.tiktok.com/@trailjournal/photo/7523456789012345678",
"id": "7523456789012345678",
"type": "photo",
"description": "Morning trail with @trailguide #hiking",
"created_at": "2023-11-14T22:13:20Z",
"create_time": 1700000000,
"location_created": "US",
"statistics.views": 42700,
"statistics.likes": 2860,
"statistics.comments": 64,
"statistics.shares": 118,
"statistics.saves": 390,
"author.avatar_large": "https://example.com/trail-journal-large.jpg",
"author.avatar_medium": "https://example.com/trail-journal-medium.jpg",
"author.avatar_thumb": "https://example.com/trail-journal-thumb.jpg",
"author.username": "trailjournal",
"author.name": "Trail Journal",
"author.profile_url": "https://www.tiktok.com/@trailjournal",
"author.id": "7123456789012345678",
"author.sec_uid": "",
"author.bio": "Weekend walks and practical trail notes.",
"author.region": "US",
"author.is_verified": false,
"author.is_private": false,
"author.followers": 18400,
"author.following": 126,
"author.likes": 286000,
"author.videos_count": 94,
"author.friends_count": 28,
"music.id": "7423456789012345678",
"music.title": "Morning Walk",
"music.author_name": "Trail Journal",
"music.author_username": "trailjournal",
"music.album": "",
"music.duration": 24,
"music.is_original": true,
"music.is_commerce": false,
"music.is_author_artist": false,
"music.cover_large": "https://example.com/morning-walk-large.jpg",
"music.cover_medium": "https://example.com/morning-walk-medium.jpg",
"music.cover_thumb": "https://example.com/morning-walk-thumb.jpg",
"music.play_url": "https://example.com/morning-walk.mp3",
"images.url": [
"https://example.com/trail-view.jpg",
"https://example.com/trail-map.jpg"
],
"images.urls": [
[
"https://example.com/trail-view.jpg",
"https://example.com/trail-view-alt.jpg"
],
[
"https://example.com/trail-map.jpg"
]
],
"images.width": [
1200,
1200
],
"images.height": [
800,
800
],
"image_cover.urls": [
"https://example.com/trail-view.jpg",
"https://example.com/trail-view-alt.jpg"
],
"image_cover.width": 1200,
"image_cover.height": 800,
"video.id": "",
"video.cover": "",
"video.origin_cover": "",
"video.dynamic_cover": "",
"video.play_url": "",
"video.download_url": "",
"video.width": 0,
"video.height": 0,
"video.duration": 0,
"video.ratio": "",
"video.format": "",
"video.bitrate": 0,
"video.encoded_type": "",
"video.video_quality": "",
"video.volume_info.loudness": 0,
"video.volume_info.peak": 0,
"video.volume_info.loudness_range": 0,
"video.bitrates": [],
"subtitles": [],
"hashtags.id": [
"54321"
],
"hashtags.name": [
"hiking"
],
"hashtags.description": [
""
],
"hashtags.profile_url": [
"https://www.tiktok.com/tag/hiking"
],
"hashtags.cover_large": [
""
],
"hashtags.cover_medium": [
""
],
"hashtags.cover_thumb": [
""
],
"mentions.user_id": [
"7223456789012345678"
],
"mentions.sec_uid": [
""
],
"mentions.username": [
"trailguide"
],
"mentions.profile_url": [
"https://www.tiktok.com/@trailguide"
],
"mentions.start": [
19
],
"mentions.end": [
30
],
"is_photo": true,
"is_ad": false,
"is_aigc": false,
"aigc_label_type": 0,
"is_original_item": true,
"is_official_item": false,
"is_secret": false,
"for_friends": false,
"duet_enabled": false,
"stitch_enabled": false,
"share_enabled": true,
"comments_enabled": true,
"comment_status": 0,
"collected": false,
"diversification_labels": [
"Travel",
"Outdoors"
],
"suggested_words": [
"Hiking"
]
}

The table and JSON share the same flat keys. images.url, images.width, and images.height are aligned lists: their first values describe the first image, and so on. images.urls keeps an inner list of alternative URLs for each image. Hashtag and mention lists follow the same positional rule within their own group.

Success rows use empty strings, 0, false, or empty lists for unavailable values. A missing metric can therefore appear as zero. Video fields may be empty for photo posts; video.download_url is empty, and subtitles and video.bitrates remain empty lists in the current output. A failed result keeps input and status and sets the photo-post data fields to null.

Input requirements and coverage βš™οΈ

ParameterTypeRequiredRules
inputListarray of stringsYesAt least one full TikTok /@username/photo/numeric-ID URL; no fixed batch-size maximum

HTTP and HTTPS links on tiktok.com or its subdomains are accepted. The username segment allows 1–24 letters, digits, periods, or underscores. Trailing slashes and query parameters are allowed; output uses a canonical URL.

The returned content must contain photos. A video behind a photo URL is treated as a failed result. Valid requests are deduplicated by post ID, while invalid input entries are saved individually. There are no image-count or pagination settings.

TikTok photo post use cases 🎯

Keep each post's image sequence and caption together when comparing storytelling, layout, and calls to action.

Campaign reporting

Attach engagement figures and creator details to submitted photo-post links without manually copying each metric.

Visual content catalogues

Index image URLs and dimensions alongside the post ID so a review system can retrieve the correct image in sequence.

Caption and sound analysis

Compare the descriptions, hashtags, mentions, and music used across a selected set of photo posts.

Pricing and billable photo post rows πŸ’°

Check the Actor's Pricing tab for the current pricing model and rate.

Under dataset-item pricing, each saved success or failed row can be billable. Valid duplicate requests are processed once; invalid entries can each save a failed row. Automatic retries do not independently create extra dataset rows.

A collection with several images remains one result row. Image alternatives, tags, and mentions do not add separate rows.

TikTok Photo Details Scraper API and integrations πŸ”Œ

Use the Actor ID from the API tab as $ACTOR_ID and your Apify token as $APIFY_TOKEN.

curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"inputList":["https://www.tiktok.com/@qq.mm.pp/photo/7479037796326362385"]}'

The request starts a run. Retrieve its dataset after completion, or connect an Apify schedule and webhook to repeat collection and trigger downstream work. Export to JSON, CSV, or Excel, or send selected fields to Google Sheets, Make, Zapier, or your own application.

Reliability and limits ⚠️

Up to five photo posts are processed concurrently. Temporary request failures are retried; unavailable posts and unresolved requests become failed rows so other valid inputs can continue.

The image list reflects what TikTok exposes to the Actor. Removed, private, region-restricted, or embed-disabled posts may be inaccessible. Image and music URLs can expire. Missing metrics or settings use defaults, so interpret them alongside the post's availability rather than treating every zero as a measured count.

Frequently asked questions ❓

Will each photo become a separate row?

No. One photo post produces one row, with ordered lists for its images and dimensions.

No. This Actor requires a full /photo/ URL and verifies that the returned post contains photos.

Are alternative image URLs preserved?

Yes. images.urls keeps the available alternatives grouped by image; images.url contains the first available URL for each image.

Does it download the images?

No. It returns image references and dimensions. Download or archive permitted assets separately if your workflow needs files.

Is the soundtrack included?

Music metadata and a playback URL are returned when exposed. The Actor does not create a slideshow video or generate a transcript.

For help with a result, share the run ID and a safe public example input through the Actor's support channel. Keep tokens and other credentials out of support messages.

Use public data and media within the permissions and obligations that apply to your project, including privacy and copyright requirements.