Instagram Hashtag Scraper

Output

One row per post, written to your dataset. Every field below is always present — optional ones come back as null rather than disappearing, so a missing value never breaks your schema.

FieldMeaning
shortcode
string · always present
Instagram's own short code for the post. Unique, and the key this actor deduplicates on.
url
string · always present
The canonical post URL, built from the shortcode.
takenAt
string · always present
When the post was published, ISO 8601 in UTC.
takenAtTimestamp
integer · always present
The same instant as epoch seconds, so a row sorts and compares without parsing.
caption
string or null
The caption text, or null when the post has none.
hashtags
array of string
Every hashtag in the caption, lowercased and deduplicated, without the leading #.
likeCount
integer or null
Likes at the time of reading. Null means the count was not available — never confuse it with 0, which means zero likes.
commentCount
integer or null
Comments at the time of reading. Null and 0 mean different things, as above.
ownerUsername
string or null
The account that posted, or null when Instagram did not return it.
mediaType
string — one of image, video, carousel, unknown
What the post is. In practice the hashtag feed serves images and carousels; see the note under this table.
isVideo
boolean
True only for a standalone video post. See the note under this table before filtering on it.
containsVideo
boolean
True when the post is a video or is a carousel with at least one video slide. This is the field to filter on.
carouselCount
integer or null
How many items the carousel holds, or null when the post is not a carousel.
displayUrl
string or null
The largest still image the feed offered — for a carousel, its cover image. Null when none was available.

Filtering for video: use containsVideo

Instagram's hashtag feed serves images and carousels. A standalone video post does not appear on it — but a carousel can contain a video slide.

So isVideo, which means "this post is a standalone video", is effectively always false here. Filtering on it will find nothing and read as "this hashtag has no video", which is not what it means. containsVideo is the field that answers the question — it is true when the post is a video or holds a video slide.

Each row carries the carousel's cover image in displayUrl; individual slide URLs are not returned.

Null is not zero

likeCount and commentCount come back as null when the count was not available, and as a number — including 0 — when it was. A post whose count is hidden and a post with no likes are different facts, and collapsing them into 0 would silently corrupt any average you compute.

Billing follows this table

A row is charged once it has been written to your dataset, at $0.0005 each. Rows rejected as duplicate, out-of-window, past your limit or unreadable never reach the dataset and are never charged — the run reports how many of each it dropped.