Instagram Hashtag API

Collect the posts under an Instagram hashtag in hashtag, each with text, media_type, like_count, view_count and the author's follower count, for $0.56 per 1,000 calls.

  • Up to 100 posts per call
  • Pass reels for short videos
  • No Instagram login needed

API health

24h health
63%
24h average time
15.48 s
  • Healthy / normal
  • Available
  • Limited
  • Mostly down
Limited

Last 24 hours

Last 30 days

  1. 1Request

    POST /api/v1/social
    {
      "platform": "instagram",
      "action": "hashtag",
      "params": {
        "hashtag": "photography"
      }
    }
  2. 2JSON response

    {
      "results": [
        {
          "text": "📸@••• 
    
    @••• 
    @••• 
    
    #photography #hobbymodel #jewelry #tattoo #quarry",
          "post_id": "DdvvbQ1ufeL",
          "media_type": "image",
          "like_count": 0
        },
        …
      ],
      "count": 30
    }
  3. 3Rows

    textpost_idmedia_typelike_count
    📸@••• @••• @••• #photography #hobbymodel #jewelry #tattoo #quarryDdvvbQ1ufeLimage0
    ✨..♠️❤️..✨ #instareels #viralpost #malvan #instagram #photographyDdvva9EEUmpimage0
  4. 4CSV

    instagram-hashtag-sample.csv post_id,url,text,media_type,like_count,comment_count,view_count,author_username,author_name,posted_at,location,id,image_url,video_url,author_id,width,height,is_comments_disabled,author_follower_count,hashtags,top_comments,platform

A request with hashtag (no #) and optional results_type and limit goes in. One response returns the posts under that tag, and these become table rows and a CSV file.

What data you get

The table shows rows from a real call for photography, captured September 26, 2026 at 08:56 (UTC), that returned 30 rows. Gray bars mark removed personal information (••• in the CSV). Your own calls return these fields as listed in the field reference.

post_idurltextmedia_typelike_countcomment_countview_countauthor_usernameauthor_nameposted_atlocationidimage_urlvideo_urlauthor_idwidthheightis_comments_disabledauthor_follower_counthashtagstop_commentsplatform
DdvvbQ1ufeLhttps://www.instagram.com/p/DdvvbQ1ufeL/📸@••• @••• @••• #photography #hobbymodel #jewelry #tattoo #quarryimage00null2026-09-26T09:43:53+00:00Aschaffenburg, Germanynullnullnullnullnullnullnullnull["photography","hobbymodel","jewelry"]nullinstagram
Ddvva9EEUmphttps://www.instagram.com/p/Ddvva9EEUmp/✨..♠️❤️..✨ #instareels #viralpost #malvan #instagram #photographyimage00null2026-09-26T09:43:48+00:00Malvan , Sindhudurgnullnullnullnullnullnullnullnull["instareels","viralpost","malvan"]nullinstagram

Use cases

  • Topic research

    Read text and like_count under a hashtag to see what people post and which posts draw engagement.

  • Campaign hashtag tracking

    Pull posts for a campaign tag and use posted_at to see what is new.

  • Find creators

    Read author_username and author_follower_count to find creators who post under a tag.

  • Short videos only

    Set results_type to reels to get only the Reels under the hashtag.

Hashtag Search vs EveryInfra

Here is how Instagram's official Hashtag Search and EveryInfra hashtag compare on query volume, rows per request and author fields.

ComparedHashtag SearchEveryInfra
Query volume"You can query a maximum of 30 unique hashtags on behalf of an Instagram Business or Creator Account within a rolling, 7 day period."One call queries one hashtag and costs $0.000556, billed per call.
Rows per request"Responses are paginated with a maximum limit of 50 results per page."limit is 1 to 100 and defaults to 30. One call returns at most 100 rows, and there is no page parameter.
Author fields"You cannot request the username field on returned media objects."Each row has author_username, author_name and author_follower_count.

Quotes are from Meta's developer documentation, checked 2026-11-09. Official sources: Hashtag Search (updated 2026-08-17) · IG Hashtag Top Media (updated 2026-08-17)

Limits and gotchas

  • hashtag is required, without the #, and is a tag word rather than an account handle. tag is a compatibility input; if both are sent, hashtag wins.
  • Leave out results_type for regular posts, or pass reel or reels for short videos. You cannot pass posts explicitly, and any other value returns 422.
  • limit is an integer from 1 to 100 and defaults to 30; larger values return 422 before any charge.
  • There is no page parameter. One call returns at most 100 rows and can return fewer than limit.
  • The rows are a batch of posts under the tag. On its own, the sample does not measure the total volume of a trend.
  • author_follower_count and view_count are null when not disclosed; that is not 0. hashtags and top_comments are absent when there is nothing to show.

Pricing

You pay $0.000556 per call, not per row, and one call reads up to 100 posts. Failed calls and empty results are not charged.

CallsCost
10,000$5.56
100,000$55.56
1,000,000$555.56

Totals use the list price per call.

Code samples

#
bash
curl -X POST 'https://api.everyinfra.com/api/v1/social' \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "platform": "instagram",
  "action": "hashtag",
  "params": {
    "hashtag": "photography"
  }
}'

OpenAPI definition (JSON)Samples read the key from the EVERYINFRA_API_KEY environment variable; copied code never contains your key.

API reference

See the parameters, response fields, errors and billing for hashtag, and copy the page or open it as Markdown for an AI assistant.

POST

AI prompt

#
Please help me write a data collection script with the EveryInfra Instagram Hashtag endpoint (instagram/hashtag).

How the endpoint works:
- Request: POST https://api.everyinfra.com/api/v1/social with the header Authorization: Bearer <API key>. Read the key from the EVERYINFRA_API_KEY environment variable and never hard-code it.
- In the request body, set platform to instagram and action to hashtag, and put the parameters inside params.
- Required parameters:
  - hashtag: Accepts an Instagram hashtag string without the leading # symbol (e.g., coffee) to list associated posts or reels. This parameter requires a hashtag name rather than an account handle.
- Optional parameters:
  - results_type: Selects the content type for discover and hashtag: omit it for regular posts, or pass reel or reels for short videos. posts cannot be passed explicitly, and any other value returns 422. (allowed: reel / reels)
  - tag: Provides compatibility input for the hashtag action, automatically stripping leading # symbols. When both are supplied, hashtag takes precedence. Public requests must still include the required hashtag parameter.
  - limit: The most rows to return in this call, an integer from 1 to 100. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. (default: 30)
- Returns a list of records. Main fields of each record: post_id, url, text, media_type, like_count, comment_count, view_count, author_username, author_name, posted_at, location, id; 21 fields in total, full list at https://api.everyinfra.com/api/v1/social/catalog?platform=instagram.
- Example request body:
{
  "platform": "instagram",
  "action": "hashtag",
  "params": {
    "hashtag": "photography"
  }
}
- Price: $0.56 per 1,000 requests; failed and empty results are not charged.
- For dozens or hundreds of targets, add "mode": "async" to the body: you get a job_id at once and poll GET https://api.everyinfra.com/api/v1/jobs/{job_id} for the result.
- On 422, fix the request using the suggested parameter names and allowed values in the error; on 429 or 503, wait for Retry-After and try again.

Before writing code, ask me which targets I need, how many, which fields, and what output format I want; then confirm the plan and the rough cost with me.

Request parameters

#
NameInTypeRequiredDefaultDescription
AuthorizationheaderstringYes-Bearer followed by your API key. Create it in the console; never put it in a URL or a code repository.
platformbodystringYesinstagramPlatform identifier, fixed value.
actionbodystringYeshashtagCapability identifier, fixed value.
hashtagbody.paramsstringYes-Accepts an Instagram hashtag string without the leading # symbol (e.g., coffee) to list associated posts or reels. This parameter requires a hashtag name rather than an account handle.
results_typebody.paramsstring (enum)No-Selects the content type for discover and hashtag: omit it for regular posts, or pass reel or reels for short videos. posts cannot be passed explicitly, and any other value returns 422. It does not choose the response file format.Allowed valuesreelreels
tagbody.paramsstringNo-Provides compatibility input for the hashtag action, automatically stripping leading # symbols. When both are supplied, hashtag takes precedence. Public requests must still include the required hashtag parameter.
limitbody.paramsinteger (1–100)No30The most rows to return in this call, an integer from 1 to 100. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge.

Response example

#
Captured September 26, 2026 at 08:56 (UTC) by calling this API with the parameters in the code sample above. results and count are that call's real response with personal information (names, handles, avatars, profile links, contact details) removed; the list keeps the first 2. id, billing and quota differ on every call, so only their shape is shown.
json
{  "id": "req_…",  "platform": "instagram",  "action": "hashtag",  "results": [    {      "post_id": "DdvvbQ1ufeL",      "url": "https://www.instagram.com/p/DdvvbQ1ufeL/",      "text": "📸@••• \n\n@••• \n@••• \n\n#photography #hobbymodel #jewelry #tattoo #quarry",      "media_type": "image",      "like_count": 0,      "comment_count": 0,      "author_username": "•••",      "author_name": "•••",      "posted_at": "2026-09-26T09:43:53+00:00",      "location": "Aschaffenburg, Germany",      "hashtags": [        "photography",        "hobbymodel",        "jewelry"      ],      "platform": "instagram"    },    {      "post_id": "Ddvva9EEUmp",      "url": "https://www.instagram.com/p/Ddvva9EEUmp/",      "text": "✨..♠️❤️..✨\n\n#instareels #viralpost #malvan #instagram #photography",      "media_type": "image",      "like_count": 0,      "comment_count": 0,      "author_username": "•••",      "author_name": "•••",      "posted_at": "2026-09-26T09:43:48+00:00",      "location": "Malvan , Sindhudurg",      "hashtags": [        "instareels",        "viralpost",        "malvan"      ],      "platform": "instagram"    }  ],  "count": 30,  "billing": {    "charged": …,    "charged_usd": …,    "balance_after_usd": …,    …  },  "quota": { … }}

Response fields

#

Business data is in results. The table lists the fields a record can contain; values the platform does not show are never made up.

FieldMeaning
post_idKeeps the platform's own meaning
urlLink to the record on the platform.
textBody text with HTML removed, returned in full and never cut short (on a few platforms the list results themselves carry only an excerpt; the platform's field notes say so).
media_typeKeeps the platform's own meaning
like_countLikes. null means the platform or this capability does not disclose it; it is not 0.
comment_countComments. null means not disclosed, not 0.
view_countViews or plays. null means not disclosed, not 0.
author_usernameAuthor's username (@handle), usually usable in URLs.
author_nameAuthor's display name.
posted_atPublish time in ISO 8601, UTC (for example 2026-08-07T12:34:56+00:00). Non-standard strings from the platform are passed through as is, so parse defensively. null means the platform does not disclose it.
locationLocation description passed through as is; the format varies by platform.
idThe record's unique ID on the platform. Unique only within one platform; IDs can repeat across platforms.
image_urlImage link. Capabilities with several images may return an image_urls array.
video_urlKeeps the platform's own meaning
author_idAuthor's unique ID on the platform.
widthKeeps the platform's own meaning
heightKeeps the platform's own meaning
is_comments_disabledKeeps the platform's own meaning
author_follower_countAuthor's follower count. null means not disclosed.
hashtagsHashtags in the text, in order of appearance; absent when there are none.
top_commentsKeeps the platform's own meaning
platformSource platform identifier, the same as platform in the request (for example xiaohongshu, tiktok).

Errors and billing

#
401
Missing or invalid key.
402
Insufficient balance. Top up first.
422
Invalid parameter name or value. Fix it using the suggestions in the error. No charge.
429
Per-minute request limit reached. Wait for Retry-After, then try again.
503
Could not complete. The held charge is returned to your balance. If the outcome is unknown, verify it before you retry.
200 empty
No data. No charge.

Errors

FAQ

What does the Instagram hashtag API return?

It returns the posts under the tag: text, media_type, like_count, view_count and author_follower_count, plus hashtags when present.

How many posts can one call return, and how do I get only Reels?

limit is 1 to 100 and defaults to 30; there is no page parameter. Set results_type to reel or reels for Reels. Leave it out for regular posts.

How much does it cost?

It costs $0.000556 per call, or $0.56 per 1,000 calls, billed per call and not per row. Failed calls and empty results are not charged.

Do I need an Instagram login?

No. You send one EveryInfra API key in the Authorization: Bearer header. No Instagram login or Instagram access token is needed.

What is the difference between hashtag and discover?

Both read posts under a tag. hashtag takes hashtag, answers in the same response and returns up to 100 rows. discover takes keyword, returns a job_id first and returns up to 200 rows.

You can call the other Instagram endpoints with the same key, such as reading a post by its link or an account's Reels.

Our own visit stats are always on. Google Analytics loads only if you choose “Allow analytics”. Privacy policy