20 endpoints.
- GET /v1/instagram/audio_reels
- GET /v1/instagram/basic_profile
- GET /v1/instagram/post
- GET /v1/instagram/post_comment_replies
- GET /v1/instagram/user
- GET /v1/instagram/user_post_count
- GET /v1/instagram/reels_trending
- GET /v1/instagram/search
- GET /v1/instagram/search_hashtag
- GET /v1/instagram/search_popular
- GET /v1/instagram/search_profiles
- GET /v1/instagram/user_embed
- GET /v1/instagram/user_highlight_detail
- GET /v1/instagram/user_highlights
- GET /v1/instagram/user_reels
- GET /v1/instagram/user_tagged_posts
- GET /v1/instagram/media_captions_plus
- GET /v1/instagram/post_comments_plus
- GET /v1/instagram/reels_search_plus
- GET /v1/instagram/user_posts_plus
GET /v1/instagram/audio_reels
Get Reels By Audio Id
Fetches the reels Instagram exposes for an audio page like instagram.com/reels/audio/{audio_id}/. Pass the audio_id from that URL. Use cursor from the previous response to request the next page when Instagram returns one.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
audio_id required | query | string | The audio id from the Instagram audio page URL. |
next_cursor | query | string | Pagination cursor returned by Instagram from the previous response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/audio_reels?audio_id=1392969992841787" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/audio_reels?audio_id=1392969992841787", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/audio_reels?audio_id=1392969992841787",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"reels": [
{
"gen_ai_chat_with_ai_cta_info": null,
"collaborator_edit_eligibility": false,
"number_of_qualities": 6,
"related_ads_pivots_media_info": "USER_NOT_IN_TEST_GROUP",
"is_artist_pick": false,
"translated_langs_for_autodub": [],
"subtype_name_for_rest": "XDTClipsMedia",
"is_eligible_for_poe": false,
"original_lang_for_translations": "en",
"eligible_insights_entrypoints": "NONE",
"igbio_product": null,
"hidden_likes_string_variant": -1,
"is_social_ufi_disabled": false,
"boost_unavailable_reason": null,
"boost_unavailable_identifier": null,
"boost_unavailable_reason_v2": [],
"client_cache_key": "MzkxNDQ4MzYyNDQ0NjgzOTU0NQ==.3",
"can_reply": false,
"photo_of_you": false,
"media_attributions_data": [],
"can_view_more_preview_comments": false,
"mezql_token": "",
"has_tagged_users": false,
"is_eligible_content_for_post_roll_ad": false,
"is_cutout_sticker_allowed": false,
"...": "80 more fields"
}
],
"next_cursor": "Gsbyq....",
"has_more": true
}GET /v1/instagram/basic_profile
Basic Profile
Fetches a lightweight Instagram profile summary by user ID, returning username, full name, biography, profile picture URL, verification status, follower count, following count, media count, and account privacy and type. Ideal for quick lookups or enrichment when you already have the numeric user ID. Use this when speed matters and you do not need posts. It skips the post-fetching and enrichment calls made by Profile, so it is usually faster. Response times can vary.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
user_id | query | string | Instagram user id |
cache_max_age | query | string | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). Otherwise, scrape a live result (1 credit). See the Caching page for details. one of: 1d, 3d, 7d, 14d, 30d |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/basic_profile" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/basic_profile", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/basic_profile",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"friendship_status": null,
"gating": null,
"is_memorialized": false,
"is_private": false,
"has_story_archive": null,
"supervision_info": null,
"is_regulated_c18": false,
"regulated_news_in_locations": [],
"bio_links": [],
"linked_fb_info": null,
"text_post_app_badge_label": "zuck",
"show_text_post_app_badge": true,
"username": "zuck",
"text_post_new_post_count": null,
"pk": "314216",
"live_broadcast_visibility": null,
"live_broadcast_id": null,
"profile_pic_url": "https://instagram.fpoz4-1.fna.fbcdn.net/v/t51.2885-19/550234512_18532404670058217_8758519395071163708_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6...",
"hd_profile_pic_url_info": {
"url": "https://instagram.fpoz4-1.fna.fbcdn.net/v/t51.2885-19/550234512_18532404670058217_8758519395071163708_n.jpg?efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nb..."
},
"is_unpublished": false,
"latest_reel_media": 0,
"has_profile_pic": null,
"profile_pic_genai_tool_info": [],
"biography": "I build stuff",
"full_name": "Mark Zuckerberg",
"...": "31 more fields"
}GET /v1/instagram/post
Post/Reel Info
Fetches detailed metadata for a single Instagram post or reel by shortcode or URL. Returns caption text, like count, comment count, video URL, video play count, video duration, display images, owner info, tagged users, carousel sidecar children when applicable, and the published time in `data.xdt_shortcode_media.created_at` as an ISO 8601 UTC date. The original Unix timestamp remains available in `data.xdt_shortcode_media.taken_at_timestamp`. Play counts are Instagram-only views and exclude cross-posted Facebook views. Set `include_play_count=false` to omit the play count and skip its additional fetch for a faster response. Play counts can sometimes be inaccurate.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
url required | query | string | Instagram post or reel URL |
region | query | string | 2 letter country code to set the proxy in |
trim | query | boolean | Set to true to get a trimmed response |
download_media | query | boolean | Set to true to download the video/images and get back permanent Supabase URLs. Costs 10 credits if media is found, 1 credit otherwise. |
include_play_count | query | boolean | Set to false to omit `video_play_count` and skip its additional fetch for a faster response. Defaults to true. |
cache_max_age | query | string | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). Otherwise, scrape a live result (1 credit). See the Caching page for details. one of: 1d, 3d, 7d, 14d, 30d |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/post?url=example" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/post?url=example", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/post?url=example",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"data": {
"xdt_shortcode_media": {
"id": "3657869083548472514",
"shortcode": "DLDXI0fylTC",
"typename": "XDTGraphVideo",
"thumbnail_src": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-15/509601086_18503874985017172_8563682873145552176_n.jpg?stp=c0.469.1206.1206a_dst-jpg_e35_s640x640_sh0.0...",
"display_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-15/509601086_18503874985017172_8563682873145552176_n.jpg?stp=dst-jpg_e35_p1080x1080_sh0.08_tt6&_nc_ht=sco...",
"video_url": "https://scontent-iad3-2.cdninstagram.com/o1/v/t16/f2/m86/AQPIiBLJBqG6YM9FzeabZmQkGTo94LpWkFoXGZJKZzy1TmBaeQneYOCvLLIE9oatPQwWEFvodXRGHTKQmyBOxJfo3Ubjavdoyaju...",
"has_audio": true,
"accessibility_caption": null,
"video_view_count": 0,
"video_play_count": 425901,
"product_type": "clips",
"video_duration": 84.666,
"clips_music_attribution_info": {
"artist_name": "jane",
"song_name": "Original audio",
"uses_original_audio": true,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "3011705342342322"
},
"is_video": true,
"owner": {
"id": "21393171",
"username": "jane",
"is_verified": true,
"profile_pic_url": "https://scontent-iad3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-iad3-2.cd...",
"blocked_by_viewer": false,
"restricted_by_viewer": null,
"followed_by_viewer": false,
"full_name": "Jane Williamson",
"has_blocked_viewer": false,
"is_embeds_disabled": false,
"is_private": false,
"is_unpublished": false,
"requested_by_viewer": false,
"pass_tiering_recommendation": true,
"edge_owner_to_timeline_media": {
"count": 1599
},
"edge_followed_by": {
"count": 1565363
}
},
"edge_media_to_caption": {
"edges": [
{
"node": "{...}"
}
]
},
"edge_media_to_parent_comment": {
"count": 299,
"page_info": {
"has_next_page": true,
"end_cursor": "{\"server_cursor\": \"QVFBbUdFZ185QlVSSVF4S1ZwTjV0SUZidGp6ZDNGeDV2eWQwbTY0bkw4U3pQLWVFaXU0MUI3UnRJMGJxOF96S3hYWVBHZmpyaFB5VlkwSV9aLUFNMTROeQ==\", \"is_server_curs..."
},
"edges": [
{
"node": "{...}"
}
]
},
"edge_media_preview_comment": {
"count": 299,
"edges": [
{
"node": "{...}"
}
]
},
"taken_at_timestamp": 1750272151,
"is_ad": false,
"edge_media_preview_like": {
"count": 22926,
"edges": []
},
"is_affiliate": false,
"is_paid_partnership": false,
"location": null
}
}
}GET /v1/instagram/post_comment_replies
Comment Replies
Retrieves the public replies to a specific Instagram comment. Pass the post or reel URL and the parent comment's `id` from the Comments endpoint. Returns reply text, timestamps, engagement counts, parent comment ID, and user details. Paginate with `cursor` when `has_more` is true.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
url required | query | string | The Instagram post or reel URL |
comment_id required | query | string | The parent comment ID from the Comments endpoint |
next_cursor | query | string | The cursor to get more replies. Get `cursor` from the previous response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comment_replies?url=https://www.instagram.com/reel/C8rKmYvsrck&comment_id=18038110327814211" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comment_replies?url=https://www.instagram.com/reel/C8rKmYvsrck&comment_id=18038110327814211", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comment_replies?url=https://www.instagram.com/reel/C8rKmYvsrck&comment_id=18038110327814211",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"comments": [
{
"id": "18277034998224667",
"text": "@username Thanks for the reply!",
"comment_like_count": null,
"child_comment_count": 0,
"created_at": "2024-06-28T06:20:32.000Z",
"parent_comment_id": "18038110327814211",
"user": {
"id": "25621023419",
"pk": "25621023419",
"username": "username",
"is_verified": false,
"profile_pic_url": "https://instagram.fosu2-2.fna.fbcdn.net/....jpg"
}
}
],
"next_cursor": null,
"has_more": false
}GET /v1/instagram/user
Profile
After recent Instagram changes, fetching creator metadata and posts requires several requests to Instagram, so this endpoint can be slower. If you only need profile details without posts, use Basic Profile with the numeric userId for a usually faster lookup. Retrieves comprehensive public Instagram profile information including biography, bio links, follower and following counts, verification status, and profile picture URLs. Private profiles also return all available public profile metadata through the same existing data.user mapper: ID, username, full name, biography and bio links/entities, website/linkshim, standard/HD profile photos, verification, business/professional/category information, public contact fields when Instagram returns them, and counts, without exposing private posts. The response and unchanged status, success, error, message, and billing rules are described below. Also returns recent timeline posts with engagement metrics such as likes, comments, and video view counts, plus a list of related profiles. Useful for account overview, audience analysis, or discovering similar creators. Video play counts are separate from video view counts. Profile-pinned videos may have video_play_count=null when their count is not found in a short recent-Reels scan; available pinned counts are kept and non-pinned videos require numeric plays. Use /v1/instagram/post with an individual post or reel URL for a deeper play-count lookup. Instagram may return media_count as null or return only the current post batch in edge_owner_to_timeline_media.count. Use Profile Post Count when you specifically need the total number of posts. An explicit rendered age gate (for example, You must be 21 years old or over to see this profile. Log in to continue.) returns HTTP 403, success=true, age_restricted=true, error=forbidden, errorStatus=403, and message=Profile is age restricted, without charging credits. This means Instagram identified an existing profile but requires an age-verified login to view it; we do not bypass the gate. It applies to GET, trimmed GET, and POST handle requests. The age_restricted field is omitted when age gating has not been explicitly confirmed; its absence is not proof that the account has no age limit. For GET handle requests, Profile is private means Instagram returned is_private=true. Account doesn't exist means the handle lookup returned no matching account, not confirmed deletion. The historical Profile is restricted placeholder was used for reported content with no public timeline items. Its handler compatibility branch remains, but the current metadata-first pipeline no longer infers restriction from an empty timeline alone; it retains matching metadata as a partial HTTP 200. These placeholders return HTTP 200, success=true, error=not_found, errorStatus=404, and userId=null, and cost one credit. An explicitly rendered generic audience restriction returns HTTP 404 with Profile is restricted and zero credits charged; it does not confirm an age limit. Profile is unavailable on Instagram also returns an uncharged HTTP 404 and does not identify privacy, deletion, or age gating. HTTP 500 with Shoot, IG is blocking us. Try again and it should work. is an uncharged upstream failure, not a confirmed account restriction. Do not label generic login prompts or unavailable responses as age-restricted. ### Profile access response contract The confirmed-state success flag is intentionally restored to true: success means we determined the profile state, not that the profile exists or its content is publicly retrievable. HTTP 403/404 and zero-credit billing remain unchanged. Actual retrieval failures remain success=false. HTTP status, JSON field names/types, error values, message values, and credit behavior are compatibility-sensitive. We preserve them on existing endpoint versions; incompatible changes require an explicitly versioned contract and advance notice. See the [response-contract changelog](/#response-contract-changelog). **Confirmed age gate — HTTP 403, zero credits.** For this profile endpoint, branch on errorStatus === 403 && age_restricted === true. The flag means Instagram explicitly rendered an age-verification gate, not a generic login prompt. It is omitted otherwise; omission does not mean false. It does not identify country/region restrictions. ```json { "success": true, "": 100, "": 0, "handle": "example_profile", "userId": null, "age_restricted": true, "error": "forbidden", "errorStatus": 403, "message": "Profile is age restricted" } ``` **Explicit audience restriction — HTTP 404, zero credits.** This is different from an age gate and from an unavailable profile. There is currently no structured age/region reason field for this case: use HTTP 404, error=not_found, and the exact message below. Do not invent a reason or treat every 404 as a deleted account. ```json { "success": true, "": 100, "": 0, "handle": "example_profile", "userId": null, "error": "not_found", "errorStatus": 404, "message": "Profile is restricted" } ``` **Confirmed unavailable page — HTTP 404, zero credits.** Instagram reports the profile as unavailable. This does not establish whether it was deleted, renamed, suspended, or hidden. This response intentionally has no handle, userId, or age_restricted field. ```json { "success": true, "": 100, "": 0, "error": "not_found", "errorStatus": 404, "message": "Profile is unavailable on Instagram" } ``` **Legacy GET placeholders — HTTP 200, one credit.** These still exist. A JSON errorStatus of 404 is not the HTTP status. HTTP 200 and success=true alone do not prove usable profile data. The three legacy messages are preserved exactly: **Private profile public metadata.** Private profiles return all available public profile metadata through the existing data.user shape: ID, username, full name, biography, bio links/entities, external website/linkshim, standard/HD profile photos, verification, privacy, business/professional/category information, public contact fields when Instagram returns them, and counts. Full GET and POST handle requests use the complete existing public-profile user mapper; its fields and defaults remain unchanged except that unknown or unusable private follower/following counts are null, while a real 0 is preserved. The count paths remain data.user.edge_followed_by.count (followers) and data.user.edge_follow.count (following). GET trim=true uses the existing public-profile trim field list, retaining name, biography, bio links/entities, external_url, profile photos, privacy/verification, business/professional flags, category_name, business_address_json, and counts. Full-only fields such as external_url_linkshimmed, business_email, and business_phone_number are omitted from trimmed GET. POST handle requests ignore trim and return the full mapped user, as before. Full metadata means all mapped profile fields, not raw Instagram internals, private posts, or an age-gate bypass. Public contact information is not guaranteed; unavailable values keep the public mapper's existing defaults. Age-restricted responses are unchanged. Every preexisting top-level field is retained: HTTP 200, userId=null, error=not_found, errorStatus=404, message=Profile is private, and the one-credit charge stay unchanged. POST handle requests keep success=false instead of GET's success=true. The example below shows representative metadata fields, not the exhaustive full mapper output or the trimmed field set. The ID, name, links, photos, handle, and credit balance are synthetic; the counts 560 and 4675 are illustrative and can change. Private GET response (representative full-response metadata): ```json { "success": true, "": 99, "": 1, "handle": "example_profile", "userId": null, "error": "not_found", "errorStatus": 404, "message": "Profile is private", "data": { "user": { "id": "12345", "username": "example_profile", "full_name": "Example Profile", "biography": "An example profile. https://example.org/", "bio_links": [ { "title": "Website", "url": "https://example.org/", "lynx_url": "https://example.org/linkshim", "link_type": "external" } ], "fb_profile_biolink": null, "biography_with_entities": { "raw_text": "An example profile. https://example.org/", "entities": [] }, "external_url": "https://example.org/", "external_url_linkshimmed": "https://example.org/linkshim", "profile_pic_url": "https://example.org/profile.jpg", "profile_pic_url_hd": "https://example.org/profile-hd.jpg", "is_verified": false, "is_business_account": false, "is_professional_account": false, "category_name": null, "business_category_name": null, "overall_category_name": null, "category_enum": null, "business_address_json": {}, "business_contact_method": "UNKNOWN", "business_email": null, "business_phone_number": null, "should_show_category": false, "should_show_public_contacts": false, "is_private": true, "edge_followed_by": { "count": 560 }, "edge_follow": { "count": 4675 } } } } ``` Historical restricted-result compatibility branch (not the current empty-timeline policy): ```json { "success": true, "": 99, "": 1, "handle": "example_profile", "userId": null, "error": "not_found", "errorStatus": 404, "message": "Profile is restricted" } ``` No matching account from the handle lookup (not proof of deletion): ```json { "success": true, "": 99, "": 1, "handle": "example_profile", "userId": null, "error": "not_found", "errorStatus": 404, "message": "Account doesn't exist" } ``` These legacy handler branches are retained, but the active metadata-first pipeline no longer emits the heuristic restricted result merely because the timeline is empty; it returns useful matching metadata as a partial HTTP 200 instead. GET trim=true retains the same state-envelope rules. POST handle requests retain a historical difference: these HTTP-200 placeholders have success=false instead of true; they still cost one credit. The POST restricted-placeholder condition is data.user === null, while GET uses userId === null. The explicit 403/404 responses above apply to both methods. A flag-only legacy restricted scraper result is different again: POST can pass through success=true, handle, userId=null, message=Profile is restricted, and isRestricted=true without error/errorStatus. Legacy POST userId requests use a separate compatibility path and are not covered by the handle contract. **Endpoint scope.** /v1/instagram/user/posts and /v2/instagram/user/posts also return the uncharged 403 forbidden age-gate message, but do not include age_restricted, handle, or userId in that error body. Their explicit restricted-profile 404 says Profile is private, not Profile is restricted. Do not copy this profile endpoint's envelope to /v1/instagram/post or /v1/tiktok/profile; those contracts are separate. Ambiguous upstream failures are not evidence of a missing or restricted account.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
handle required | query | string | Instagram handle |
trim | query | boolean | Set to true to get a trimmed response |
cache_max_age | query | string | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). Otherwise, scrape a live result (1 credit). See the Caching page for details. one of: 1d, 3d, 7d, 14d, 30d |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user?handle=jane" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user?handle=jane", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user?handle=jane",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"data": {
"user": {
"biography": "Building .com | The easiest way to get public social media data at scale",
"bio_links": [
{
"title": "",
"lynx_url": "https://l.instagram.com/?u=https%3A%2F%2Fx.com%2Fadrian_horning_&e=AT0KAd0qSCzNTxgxhgbcBgpBfjdbmbmY2tBez0k8r-ykg_husVDislRpwV7hphrBf5oKxgE2JMWF43ZAkx4abc9zz8...",
"url": "https://x.com/adrian_horning_",
"link_type": "external"
}
],
"biography_with_entities": {
"raw_text": "Building .com | The easiest way to get public social media data at scale",
"entities": []
},
"external_url": "https://x.com/adrian_horning_",
"edge_followed_by": {
"count": 24555
},
"fbid": "17841402777077586",
"edge_follow": {
"count": 110
},
"full_name": "Adrian Horning",
"id": "2700692569",
"is_business_account": true,
"is_professional_account": true,
"business_address_json": {
"city_name": "Austin, Texas",
"city_id": 106224666074625,
"latitude": 30.26759,
"longitude": -97.74299,
"street_address": null,
"zip_code": null
},
"category_name": "Entrepreneur",
"is_private": false,
"is_verified": false,
"profile_pic_url": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/430086429_362220943449758_2621012714660517106_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-1.cd...",
"profile_pic_url_hd": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/430086429_362220943449758_2621012714660517106_n.jpg?stp=dst-jpg_s320x320_tt6&_nc_ht=scontent-lga3-1.cd...",
"username": "adrianhorning",
"edge_felix_video_timeline": {
"count": 0,
"page_info": {
"has_next_page": false,
"end_cursor": null
},
"edges": []
},
"edge_owner_to_timeline_media": {
"count": 90,
"page_info": {
"has_next_page": true,
"end_cursor": "QVFCY2E4Q1ZqQVBHdnBsUGMtVWlZZ2I3Qm9uOFdSSlZLS0NvdWVuQ05TQzR5T1hkSDM4cXVjTThsM1lQcXhsaWVyM2hQX0VoUzVYaHN3MmdRdmJGU0hENw=="
},
"edges": [
{
"node": "{...}"
}
]
},
"edge_media_collections": {
"count": 0,
"page_info": {
"has_next_page": false,
"end_cursor": null
},
"edges": []
},
"edge_related_profiles": {
"edges": [
{
"node": "{...}"
}
]
}
}
}
}GET /v1/instagram/user_post_count
Profile Post Count
Returns the post count shown on a public Instagram profile. Use this endpoint when Profile returns media_count as null or edge_owner_to_timeline_media.count contains only the current batch size. This endpoint makes a separate Instagram profile-page request so it does not add latency to the main Profile endpoint. Full values such as 12,345 Posts return the exact integer with is_estimated set to false. For profiles with more than 10,000 posts, Instagram may expose only a compact value such as 12K Posts or 1.2M Posts. Set allow_estimated=true to return the scaled integer with is_estimated set to true. Estimated counts are opt-in: when allow_estimated is omitted or false, the endpoint returns an uncharged 422 response explaining that exact precision is unavailable. If Instagram omits the count entirely, the endpoint returns an error without deducting a credit.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
handle required | query | string | Instagram handle |
allow_estimated | query | boolean | Set to true to return scaled estimates when Instagram abbreviates counts for profiles with more than 10,000 posts. Defaults to false; false or omitted returns an uncharged 422 when only an estimate is available. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_post_count?handle=lifestyleperfume" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_post_count?handle=lifestyleperfume", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_post_count?handle=lifestyleperfume",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"handle": "lifestyleperfume",
"media_count": 2774,
"is_estimated": false
}GET /v1/instagram/reels_trending
Trending Reels
Discovers reels through Instagram's public Popular pages and current featured topics, with pagination handled internally. Each reel's actual publication timestamp is checked: posts older than seven days, posts with unavailable dates, and unavailable posts are excluded. Results are deduplicated within each response and ordered by available play counts. This is recent popular-Reels discovery, not Instagram's official global trending ranking or a measure of view growth. Returns up to 12 reels, and repeated calls can overlap. Returns `reels` with shortcode, URL, caption, publication date, media URLs, available engagement counts, and user info. Missing engagement counts may be null. Successful requests cost one credit; if Instagram supplies too few verified recent reels, the endpoint returns an uncharged 503 rather than including older posts.
Parameters
No parameters.
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_trending" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_trending", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_trending",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"reels": [
{
"id": "4000819054877393649",
"pk": "4000819054877393649",
"shortcode": "DeFw7uwlMLx",
"url": "https://www.instagram.com/reel/DeFw7uwlMLx/",
"caption": "Impatiently waiting for #UFC335...\n\nThe countdown is on to @CharlesDoBronxs vs @DiegoLopesMMA\n\n[ LIVE DEC 12 on @ParamountPlus ]",
"taken_at": "2026-10-04T23:00:03.000Z",
"media_type": 2,
"product_type": "clips",
"video_url": "https://scontent.cdninstagram.com/example.mp4",
"video_versions": [
{
"type": 101,
"url": "https://scontent.cdninstagram.com/example.mp4"
}
],
"image_url": "https://scontent.cdninstagram.com/example.jpg",
"image_versions2": {
"additional_candidates": {
"first_frame": {
"url": "https://scontent.cdninstagram.com/example.jpg"
}
},
"candidates": [
{
"url": "https://scontent.cdninstagram.com/example.jpg",
"height": 1920,
"width": 1080
}
]
},
"original_width": 1080,
"original_height": 1920,
"has_audio": true,
"like_count": 423127,
"comment_count": 1623,
"view_count": 5112349,
"ig_play_count": null,
"clips_details": {
"music_info": null,
"original_sound_info": {
"audio_asset_id": "28770083305965221",
"original_audio_title": "Original audio",
"ig_artist": {
"username": "ufc",
"id": "22832340"
},
"is_explicit": false,
"should_mute_audio": false,
"consumption_info": {
"should_mute_audio_reason": "",
"is_trending_in_clips": false
},
"audio_filter_infos": null
}
},
"user": {
"id": "17841401450200356",
"pk": "22832340",
"username": "ufc",
"full_name": "UFC",
"profile_pic_url": "https://scontent.cdninstagram.com/example.jpg",
"is_verified": true,
"is_private": false
}
}
]
}GET /v1/instagram/search
Search Instagram
Use this for Instagram-native account, hashtag, or place lookup. It returns ranked users, hashtags, places, and keyword suggestions from Instagram itself. It is not Google-indexed, does not require an Instagram login, returns one page only, and does not return posts. For an Instagram-curated topic page with posts, use /v1/instagram/search/popular. For the same native account results in a profile-only response, use /v1/instagram/search/profiles.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
query required | query | string | The username, hashtag, place, or keyword to search for. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/search?query=nike" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/search?query=nike", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/search?query=nike",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"data": {
"query": "nike",
"users": [
{
"position": 0,
"id": "13460080",
"username": "nike",
"full_name": "Nike",
"is_verified": true,
"profile_pic_url": "https://instagram.example.com/nike.jpg"
}
],
"hashtags": [
{
"position": 2,
"id": "17841562978125529",
"name": "nikewomen",
"media_count": 2036828,
"search_result_subtitle": null
}
],
"places": [
{
"position": 51,
"id": "715603272",
"name": "Nike",
"title": "Nike",
"subtitle": "",
"facebook_places_id": "106068296090172"
}
],
"keywords": [],
"rank_token": "a6e9cded-6c3e-41be-a6b1-9fa5295a30d5"
}
}GET /v1/instagram/search_hashtag
Search Hashtag Posts
Use this when you know the exact hashtag and want Google-indexed public Instagram posts or reels, optional date filters, and pagination. It returns post details such as caption, engagement, owner, and post time. Results are best-effort and not a complete Instagram-native hashtag feed. For an Instagram-curated topic page with generated context and suggested terms, use /v1/instagram/search/popular. Pass media_type=reels to only return reels. Cursors are limited to pages 1 through 11; cursor 12 or greater returns a 400 response.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
hashtag required | query | string | The hashtag to search for. Include or omit the #. |
date_posted | query | string | Only return Google-indexed posts found in this relative window. one of: last-hour, last-day, last-week, last-month, last-year |
media_type | query | string | Use all to search public posts and reels, or reels to only return reels. Defaults to all. one of: all, reels |
next_cursor | query | string | The cursor returned by the previous response. It is the next Google results page number and cannot exceed 11; cursor 12 or greater returns a 400 response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/search_hashtag?hashtag=makeup" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/search_hashtag?hashtag=makeup", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/search_hashtag?hashtag=makeup",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"hashtag": "funnydogs",
"media_type": "all",
"posts": [
{
"id": "3714950709444987377",
"typename": "XDTGraphVideo",
"shortcode": "DOOJ_zSjcnx",
"url": "https://www.instagram.com/reel/DOOJ_zSjcnx/",
"caption": "Well we tried to be subtle… #funnydogs #funny #whiteboxer #australianshepherd",
"thumbnail_src": "https://scontent-ord5-2.cdninstagram.com/v/t51.82787-15/542212527_18130644664455761_8262846918103190683_n.jpg?stp=c0.509.1312.1312a_dst-jpg_e35_s640x640_sh2....",
"display_url": "https://scontent-ord5-2.cdninstagram.com/v/t51.82787-15/542212527_18130644664455761_8262846918103190683_n.jpg?stp=dst-jpg_e35_p1080x1080_sh2.08_tt6&_nc_ht=sc...",
"video_url": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/AQNG_gCzevxl8xiNB2lVRlcV8c3o3r2ZyeLeWfaY4eaHdyRX3_Z1mty2jrHuH5Z66vTC5SXrhmpdG5re9MNyf1jCtWVyPKAWQFQ03...",
"has_audio": false,
"accessibility_caption": null,
"product_type": "clips",
"video_duration": 65.733,
"clips_music_attribution_info": {
"artist_name": "_layla_the_boxer",
"song_name": "Original audio",
"uses_original_audio": true,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "1303301604923923"
},
"is_video": true,
"owner": {
"id": "13582495760",
"username": "_layla_the_boxer",
"is_verified": true,
"profile_pic_url": "https://scontent-ord5-3.cdninstagram.com/v/t51.2885-19/420493539_1460561894498614_4791883467164866946_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6...",
"full_name": "Layla the Boxer",
"is_private": false,
"is_unpublished": false,
"follower_count": 1369176,
"post_count": 1184
},
"taken_at": "2025-09-05T12:51:42.000Z",
"is_ad": false,
"like_count": 35854,
"is_affiliate": false,
"is_paid_partnership": false,
"location": null,
"comment_count": 1263,
"comments": [
{
"id": "18099897668494530",
"text": "😂😅🤣😍❤️🥰",
"owner": {
"id": "70821489119",
"is_verified": false,
"profile_pic_url": "https://scontent-ord5-3.cdninstagram.com/v/t51.2885-19/466368394_545365701466258_2087161965910224562_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6I...",
"username": "jesshman66"
},
"like_count": 0,
"created_at": "2026-01-25T13:33:43.000Z"
}
]
}
],
"next_cursor": "2"
}GET /v1/instagram/search_popular
Popular Search
Use this to explore an Instagram topic and the posts Instagram curates for it. It scrapes the public /popular/{query} page without requiring an Instagram login. The first page returns the topic title, numeric total media count, Instagram's generated description and sources, suggested terms, posts, and an opaque cursor. Pass that cursor with the same query to fetch more posts. Later pages return query, posts, cursor, and has_more only. For an exact hashtag through Google-indexed results, use /v1/instagram/search/hashtag. For reels only, use /v2/instagram/reels/search. Each successful request costs 1 credit.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
query required | query | string | The Popular topic to search for. |
next_cursor | query | string | The opaque cursor returned by the previous response. Use it with the same query to fetch the next page of posts. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/search_popular?query=basketball" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/search_popular?query=basketball", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/search_popular?query=basketball",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"query": "basketball",
"title": "Basketball",
"total_media_count": 8800000,
"description": {
"plain_text": "James Naismith invented basketball in December 1891 in Springfield, Massachusetts as an indoor winter activity.",
"source_uris": [
"https://en.wikipedia.org/wiki/Outline_of_basketball"
],
"linked_terms": []
},
"suggested_terms": [
"the tallest basketball player"
],
"posts": [
{
"id": "POLARIS_3892957342260916992",
"shortcode": "DYGkBO3NfMA",
"url": "https://www.instagram.com/reel/DYGkBO3NfMA/",
"type": "reel",
"caption": "😂😂 #meta #pov #hooper #basketball",
"display_url": "https://instagram.example.com/basketball-cover.jpg",
"video_url": "https://instagram.example.com/basketball-video.mp4",
"view_count": 11993988,
"owner": {
"id": "17841409679275910",
"username": "lukaceo",
"is_verified": false,
"profile_pic_url": "https://instagram.example.com/lukaceo-profile.jpg"
}
}
],
"next_cursor": "opaque-cursor-from-response",
"has_more": true
}GET /v1/instagram/search_profiles
Search Instagram Profiles
Use this for Instagram-native profile lookup. It returns every account in Instagram's first ranked native result set, then performs bounded best-effort enrichment for the first 10 accounts to preserve the previous profile fields such as biography, bio links, account flags, and follower/following/media counts. Results after the first 10 retain native ID, username, full name, verification status, profile photo, and URL, while unavailable detail fields are null or empty. It does not search Google-indexed bios or captions, Google title/description fields are null, and pagination is not supported. For users, hashtags, places, and keyword suggestions together, use /v1/instagram/search.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
query required | query | string | The profile name or username to search for. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/search_profiles?query=fitness coach" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/search_profiles?query=fitness coach", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/search_profiles?query=fitness coach",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"query": "hormozi",
"profiles": [
{
"id": "7547682342",
"username": "hormozi",
"full_name": "Alex Hormozi",
"biography": null,
"bio_links": [],
"external_url": null,
"is_private": null,
"is_verified": true,
"is_business_account": null,
"is_professional_account": null,
"category_name": null,
"profile_pic_url": "https://scontent.cdninstagram.com/v/t51.82787-19/example.jpg",
"follower_count": null,
"following_count": null,
"media_count": null,
"url": "https://www.instagram.com/hormozi/",
"matched_from": "profile",
"google_title": null,
"google_description": null
}
],
"next_cursor": null
}GET /v1/instagram/user_embed
Embed HTML
Returns the raw HTML embed snippet for an Instagram user's profile widget. The response contains a single html string that can be inserted into a webpage to render an embeddable Instagram profile card. Requires the user's handle as input.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
handle required | query | string | Instagram handle |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_embed?handle=jane" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_embed?handle=jane", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_embed?handle=jane",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"html": "<!DOCTYPE html>\n<html lang=\"en\" id=\"facebook\" class=\"no_js\">\n<head><meta charset=\"utf-8....."
}GET /v1/instagram/user_highlight_detail
Highlights Details
Fetches the full contents of a specific Instagram story highlight album by its ID. Returns the highlight's cover image, title, user info, and an items array containing each story with its media type, image or video URLs, dimensions, timestamp, and sticker/interactive element data. Useful for archiving or analyzing individual highlight reels.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | query | string | The ID of the highlight to get details for |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlight_detail" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlight_detail", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlight_detail",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"id": "highlight:18067016518767507",
"latest_reel_media": 1745272279,
"seen": null,
"can_reply": false,
"can_gif_quick_reply": true,
"can_reshare": true,
"reel_type": "highlight_reel",
"ad_expiry_timestamp_in_millis": null,
"is_cta_sticker_available": null,
"app_sticker_info": null,
"should_treat_link_sticker_as_cta": null,
"pool_refresh_ttl_in_sec": null,
"can_react_with_avatar": false,
"cover_media": {
"cropped_image_version": {
"width": 150,
"height": 150,
"url": "https://scontent-dub4-1.cdninstagram.com/v/t51.2885-15/479737232_1405856350793820_7928432152706230890_n.jpg?stp=c0.202.640.640a_dst-jpg_e15_s150x150_tt6&_nc_...",
"scans_profile": ""
},
"crop_rect": [
0
],
"media_id": "3574665805209826888_21393171",
"full_image_version": null,
"upload_id": null
},
"user": {
"pk": "21393171",
"pk_id": "21393171",
"full_name": "Jane Williamson",
"is_private": false,
"strong_id": "21393171",
"id": "21393171",
"username": "jane",
"is_verified": true,
"profile_pic_id": "3583980709961915639_21393171",
"profile_pic_url": "https://scontent-dub4-1.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-dub4-1.cd...",
"interop_messaging_user_fbid": 119713162748634,
"transparency_product_enabled": false
},
"items": [
{
"pk": "3565907942018983442",
"id": "3565907942018983442_21393171",
"is_visual_reply_commenter_notice_enabled": true,
"like_and_view_counts_disabled": false,
"is_post_live_clips_media": false,
"is_reshare_of_text_post_app_media_in_ig": false,
"is_reel_media": true,
"fbid": "17968033766718273",
"device_timestamp": 1739309362129426,
"caption_is_edited": false,
"strong_id": "3565907942018983442_21393171",
"is_quicksnap_recap": false,
"deleted_reason": 0,
"mezql_token": "",
"imported_taken_at": 1739305646,
"should_request_ads": false,
"is_terminal_video_segment": false,
"integrity_review_decision": "pending",
"client_cache_key": "MzU2NTkwNzk0MjAxODk4MzQ0Mg==.3",
"comment_threading_enabled": true,
"is_unified_video": false,
"commerciality_status": "not_commercial",
"caption_position": 0,
"has_privately_liked": false,
"filter_type": 0,
"...": "62 more fields"
}
],
"is_nux": false,
"title": "GRWM chats",
"created_at": 1743889595,
"is_pinned_highlight": false,
"prefetch_count": 0,
"media_count": 25,
"media_ids": [
"3565907942018983442"
],
"is_converted_to_clips": false,
"disabled_reply_types": [
"story_remix_reply"
],
"...": "4 more fields"
}GET /v1/instagram/user_highlights
Story Highlights
Lists all story highlight albums for an Instagram user. Each highlight includes its ID, title, cover thumbnail URL, and owner info with username and profile picture. Accepts either a user_id or handle; providing user_id yields faster responses. If Instagram explicitly blocks handle lookup, age restrictions return HTTP 403 with message 'Profile is age restricted'; restricted profiles return HTTP 404 with message 'Profile is restricted'; confirmed unavailable profiles return HTTP 404 with message 'Profile is unavailable on Instagram'. These responses keep success: true to indicate a confirmed profile state, include an error field, and charge no credits. Check the HTTP status and error field, not success alone.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
user_id | query | string | Instagram user id. Use for faster response times. |
handle | query | string | Instagram handle. Use user_id for faster response times. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlights" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlights", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_highlights",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"highlights": [
{
"typename": "GraphHighlightReel",
"id": "18067016518767507",
"cover_media": {
"thumbnail_src": "https://scontent-atl3-1.cdninstagram.com/v/t51.2885-15/479737232_1405856350793820_7928432152706230890_n.jpg?stp=c0.248.640.640a_dst-jpg_e15_tt6&_nc_ht=sconte..."
},
"cover_media_cropped_thumbnail": {
"url": "https://scontent-atl3-1.cdninstagram.com/v/t51.2885-15/479737232_1405856350793820_7928432152706230890_n.jpg?stp=c0.202.640.640a_dst-jpg_e15_s150x150_tt6&_nc_..."
},
"owner": {
"typename": "GraphUser",
"id": "21393171",
"profile_pic_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-atl3-2.cd...",
"username": "jane"
},
"title": "GRWM chats"
}
]
}GET /v1/instagram/user_reels
Reels
Returns a paginated list of a user's public Instagram reels (short-form videos). Each reel includes its shortcode, play count, like count, comment count, video versions with download URLs, thumbnail image, owner info, and the published time in `items[].media.created_at` as an ISO 8601 UTC date. With `trim=true`, use `items[].created_at`. The original Unix timestamp remains available as `taken_at`. Note that reel captions are not returned by this endpoint. Play counts are Instagram-only views and exclude cross-posted Facebook views. Supports cursor-based pagination via max_id; providing a user_id instead of a handle yields faster responses. Pinned reels are not included. Use the post detail endpoint to get reel captions. Play counts can sometimes be inaccurate.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
user_id | query | string | Instagram user id. Use this for faster response times. |
handle | query | string | Instagram handle. Use user_id for faster response times. |
require_play_counts | query | boolean | Only the literal query value 'true' enables this check. It requires a numeric, nonnegative play_count on every returned Reel, in both full responses (items[].media.play_count) and trim=true responses (items[].play_count); a real 0 is valid. A missing, null, nonnumeric or negative play_count returns HTTP 503 without charging credits instead of a paid partial success. It does not require ig_play_count or view counts. With the default false, counts remain best-effort: usable reels are still billable even with missing play counts. This checks presence and numeric validity; it does not guarantee count accuracy or agreement with Instagram Insights. Retrying does not guarantee that Instagram will return the missing counts. Why counts can be missing. |
trim | query | boolean | Set to true for a trimmed down version of the response |
max_id | query | string | Max id to get more reels. Get 'max_id' from previous response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_reels" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_reels", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_reels",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"items": [
{
"id": "3641924023820356866_21393171",
"code": "DKKtpqaxg0C",
"taken_at": 1748371310,
"created_at": "2025-05-27T18:41:50.000Z",
"caption": {
"bit_flags": 0,
"created_at": 1748371312,
"created_at_utc": 1748371312,
"did_report_as_spam": false,
"is_ranked_comment": false,
"pk": "18079986955772842",
"share_enabled": false,
"content_type": "comment",
"media_id": "3641924023820356866",
"status": "Active",
"type": 1,
"user_id": "21393171",
"strong_id": "18079986955772842",
"text": "Summer brings out all the girlies, soda, and global warming!!!🤗☀️\n\n#states #utah #idaho #california #oregon #newyork #minnesota #arizona #alaska #girlies #ja...",
"user": {
"pk": "21393171",
"pk_id": "21393171",
"id": "21393171",
"full_name": "Jane Williamson",
"is_private": false,
"is_unpublished": false,
"strong_id": "21393171",
"fbid_v2": "17841400515130334",
"username": "jane",
"is_verified": true,
"profile_pic_id": "3583980709961915639_21393171",
"profile_pic_url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-2.cd..."
},
"is_covered": false,
"private_reply_status": 0
},
"view_count": 1685367,
"ig_play_count": 1685367,
"comment_count": 1096,
"like_count": 71768,
"display_uri": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-15/501064973_18499642795017172_3156358348692457402_n.jpg?stp=c0.469.1206.1206a_dst-jpg_e35_s1080x1080_sh0...",
"user": {
"fbid_v2": "17841400515130334",
"feed_post_reshare_disabled": false,
"full_name": "Jane Williamson",
"id": "21393171",
"is_private": false,
"is_unpublished": false,
"pk": "21393171",
"pk_id": "21393171",
"show_account_transparency_details": true,
"strong_id": "21393171",
"third_party_downloads_enabled": 2,
"account_type": 3,
"account_badges": [],
"fan_club_info": {
"autosave_to_exclusive_highlight": null,
"connected_member_count": null,
"fan_club_id": null,
"fan_club_name": null,
"has_created_ssc": null,
"has_enough_subscribers_for_ssc": null,
"is_fan_club_gifting_eligible": null,
"is_fan_club_referral_eligible": null,
"is_free_trial_eligible": null,
"largest_public_bc_id": null,
"subscriber_count": null,
"fan_consideration_page_revamp_eligiblity": null
},
"has_anonymous_profile_picture": false,
"hd_profile_pic_url_info": {
"height": 1024,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?_nc_ht=scontent-lga3-2.cdninstagram.com&_nc_cat=1&...",
"width": 1024
},
"hd_profile_pic_versions": [
{
"height": 320,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s320x320_tt6&_nc_ht=scontent-lga3-2.cd...",
"width": 320
}
],
"is_verified": true,
"profile_pic_id": "3583980709961915639_21393171",
"profile_pic_url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-2.cd...",
"transparency_product_enabled": false,
"username": "jane",
"is_embeds_disabled": false,
"eligible_for_text_app_activation_badge": false
},
"owner": {
"fbid_v2": "17841400515130334",
"feed_post_reshare_disabled": false,
"full_name": "Jane Williamson",
"id": "21393171",
"is_private": false,
"is_unpublished": false,
"pk": "21393171",
"pk_id": "21393171",
"show_account_transparency_details": true,
"strong_id": "21393171",
"third_party_downloads_enabled": 2,
"account_type": 3,
"account_badges": [],
"fan_club_info": {
"autosave_to_exclusive_highlight": null,
"connected_member_count": null,
"fan_club_id": null,
"fan_club_name": null,
"has_created_ssc": null,
"has_enough_subscribers_for_ssc": null,
"is_fan_club_gifting_eligible": null,
"is_fan_club_referral_eligible": null,
"is_free_trial_eligible": null,
"largest_public_bc_id": null,
"subscriber_count": null,
"fan_consideration_page_revamp_eligiblity": null
},
"has_anonymous_profile_picture": false,
"hd_profile_pic_url_info": {
"height": 1024,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?_nc_ht=scontent-lga3-2.cdninstagram.com&_nc_cat=1&...",
"width": 1024
},
"hd_profile_pic_versions": [
{
"height": 320,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s320x320_tt6&_nc_ht=scontent-lga3-2.cd...",
"width": 320
}
],
"is_verified": true,
"profile_pic_id": "3583980709961915639_21393171",
"profile_pic_url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-19/482782944_496357423346018_5818268903424754264_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-2.cd...",
"transparency_product_enabled": false,
"username": "jane",
"is_embeds_disabled": false,
"eligible_for_text_app_activation_badge": false
},
"image_versions2": {
"additional_candidates": {
"first_frame": {
"height": 1136,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-15/501249811_1047509020812730_1368766689877144056_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMS...",
"width": 640
},
"igtv_first_frame": {
"height": 1136,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-15/501249811_1047509020812730_1368766689877144056_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMS...",
"width": 640
},
"smart_frame": {
"height": 1920,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t15.5256-10/502085875_1788049852055333_7728247084856383096_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMS...",
"width": 1080
}
},
"candidates": [
{
"height": 2144,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-15/501064973_18499642795017172_3156358348692457402_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNM...",
"width": 1206
}
],
"scrubber_spritesheet_info_candidates": {
"default": {
"file_size_kb": 467,
"max_thumbnails_per_sprite": 105,
"rendered_width": 96,
"sprite_height": 1246,
"sprite_urls": [
"https://scontent-lga3-2.cdninstagram.com/v/t51.2885-15/501930551_1739874873569815_2195383679016609522_n.jpg?_nc_ht=scontent-lga3-2.cdninstagram.com&_nc_cat=1..."
],
"sprite_width": 1500,
"thumbnail_duration": 0.8703142857142857,
"thumbnail_height": 178,
"thumbnail_width": 100,
"thumbnails_per_row": 15,
"total_thumbnail_num_per_sprite": 105,
"video_length": 91.383
}
}
},
"url": "https://www.instagram.com/reel/DKKtpqaxg0C/"
}
],
"max_id": "QVFEWFlDdGNOamdwbVdNM2pLY1NJRndSZ2tCbWp6WDV0TWxaYl9WNVktZU1BTUxWMlg1c2JFenNDanJVZ2NudWFjR28zRG93a3ByTExXaHJMbTA0aVJBZg=="
}GET /v1/instagram/user_tagged_posts
User Tagged Posts
Returns up to 10 public posts per page from an Instagram user's Tagged tab. Each item is a flat post object with its shortcode, caption, media type, engagement counts, media URLs, and owner details. Keep passing the returned cursor to fetch additional pages until has_more is false.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
user_id required | query | string | Numeric Instagram user ID. |
next_cursor | query | string | Cursor returned by the previous response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_tagged_posts?user_id=325734299" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_tagged_posts?user_id=325734299", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_tagged_posts?user_id=325734299",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"posts": [
{
"pk": "3953402310668919030",
"code": "DbdTnSdoSD2",
"media_type": 1,
"caption": {
"pk": "18139631029604360",
"text": "You get the best of both worlds ig"
},
"comment_count": 0,
"like_count": 3,
"view_count": null,
"user": {
"pk": "13320148665",
"id": "13320148665",
"username": "oceanecosplay"
},
"url": "https://www.instagram.com/p/DbdTnSdoSD2/"
}
],
"next_cursor": "3953374600788032611",
"has_more": true
}GET /v1/instagram/media_captions_plus
Transcript
Generates AI speech-to-text for an Instagram video post or reel. Returns a transcripts array containing each video's id, shortcode, and text; no speech can produce null entries. Each result also includes transcripts[].transcript_with_timestamp: an array of {start: number, end: number, text: string} sentence/phrase segments, or null when speech or timing is unavailable. Times are seconds relative to each individual video, not the combined carousel. AI timings are approximate, not word-perfect. The existing text remains plain text. No new parameter is required, and pricing is unchanged. By default, successful AI transcription of videos up to 120 seconds (two minutes, inclusive) costs a flat 1 credit per request. Over 120 seconds, videos cannot be AI-transcribed by default. Set allow_long_transcription=true to opt into paid AI with no fixed duration cap: ALL successful AI transcriptions in this mode cost 10 credits per started minute, including short videos: 10 * ceil(duration_seconds / 60). For example, 177 seconds costs 30 credits and an opted-in 60 seconds costs 10 credits. Empty AI results and errors cost 0 credits for AI transcription. For carousels, default pricing stays flat 1 credit per request. With allow_long_transcription=true, sum 10 * ceil(duration_seconds / 60) for each successfully transcribed video, rather than rounding the combined duration; images and empty video transcripts have no AI fee. These routes remain synchronous. Allow at least 30 seconds on your client. Paid long transcription can exceed resource limits or timeouts, so successful transcription of long videos is not guaranteed.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
url required | query | string | Instagram post or reel URL |
allow_long_transcription | query | boolean | Paid opt-in, enabled only by the literal query value 'true' (allow_long_transcription=true). Defaults to false when omitted; other values do not enable paid mode. By default, successful AI transcription of videos up to 120 seconds (two minutes, inclusive) costs a flat 1 credit per request. Over 120 seconds, videos cannot be AI-transcribed by default. Set allow_long_transcription=true to opt into paid AI with no fixed duration cap: ALL successful AI transcriptions in this mode cost 10 credits per started minute, including short videos: 10 * ceil(duration_seconds / 60). For example, 177 seconds costs 30 credits and an opted-in 60 seconds costs 10 credits. Empty AI results and errors cost 0 credits for AI transcription. This flag does not force AI and does not enable transcription or AI fallback by itself. Keep get_transcript=true or use_ai_as_fallback=true where required by the endpoint. Returned native captions still cost 1 credit on dedicated transcript routes, even for long videos with this flag; on detail routes they leave the base price unchanged. These routes remain synchronous. Allow at least 30 seconds on your client. Paid long transcription can exceed resource limits or timeouts, so successful transcription of long videos is not guaranteed. |
cache_max_age | query | string | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). Otherwise, scrape a live result (By default, successful AI up to 120 seconds costs a flat 1 credit per request; over 120 seconds requires allow_long_transcription=true, which bills ALL successful AI at 10 credits per started minute, including short videos; empty AI results and errors cost 0 credits). See the Caching page for details. one of: 1d, 3d, 7d, 14d, 30d |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/media_captions_plus?url=example" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/media_captions_plus?url=example", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/media_captions_plus?url=example",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"transcripts": [
{
"id": "3597267389859272809",
"shortcode": "DHsD6HGqJhp",
"text": "Let's fry up the perfect bunzel. Beautiful. Everybody, shh. The perfect bunzel. Let me show you my bunzel. When it comes down to bunzel, we make it the cris...",
"transcript_with_timestamp": null
}
]
}GET /v1/instagram/post_comments_plus
Comments
Retrieves comments on a public Instagram post or reel. Each comment includes the comment text, creation timestamp, reply count when Instagram provides it, and commenter details such as username, user ID, verification status, and profile picture URL. `child_comment_count` can be null when Instagram does not expose the count publicly. Set `include_replies=true` to fetch the first page of replies for every returned comment. This adds `replies`, `replies_cursor`, and `has_more_replies` to each comment. Successful pages with `comments: []` cost 0 credits, even with `include_replies=true`. Pages with comments cost 1 credit, or 15 credits with `include_replies=true`, even if no replies are returned. Errors are not charged. This option is much slower than a normal comments request and may time out at 29 seconds. Supports cursor-based pagination to load additional comment pages. You should expect ~90% success rate.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
url required | query | string | The URL of the post or reel to get comments from |
include_replies | query | boolean | Set to true to include replies for every returned comment. Costs 15 credits when comments are returned, even if no replies are found; successful pages with no comments cost 0 credits. This is much slower and may time out at 29 seconds. |
next_cursor | query | string | The cursor to get more comments. Get 'cursor' from previous response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comments_plus?url=https://www.instagram.com/reel/DOq6eV6iIgD" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comments_plus?url=https://www.instagram.com/reel/DOq6eV6iIgD", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/post_comments_plus?url=https://www.instagram.com/reel/DOq6eV6iIgD",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"comments": [
{
"id": "18051843701642870",
"text": "\"...but who wants to know people who don't love animals anyway?\". ❤️",
"created_at": "2025-09-16T17:03:04.000Z",
"comment_like_count": 0,
"child_comment_count": 0,
"replies": [],
"replies_cursor": null,
"has_more_replies": false,
"user": {
"is_verified": false,
"id": "46773599357",
"pk": "46773599357",
"is_unpublished": null,
"profile_pic_url": "https://scontent-dfw5-1.cdninstagram.com/v/t51.2885-19/542013919_18051324464559358_4060586438619554592_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI...",
"username": "catherina_thijs",
"fbid_v2": "17841446780736699"
}
}
],
"next_cursor": "AQHSpoi6HyDbzYRMzrD........."
}GET /v1/instagram/reels_search_plus
Search Reels
Use this when you only want Google-indexed Instagram reels matching a keyword or phrase, with optional date filters and pagination. It returns reel media, engagement, owner, location, and audio details. Results are best-effort rather than a complete Instagram-native search. For Instagram-curated topic posts, use /v1/instagram/search/popular. For an exact hashtag across posts and reels, use /v1/instagram/search/hashtag. Pages 1 through 11 are supported; page 12 or greater returns a 400 response.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
query required | query | string | The keyword to search for |
date_posted | query | string | Google-indexed date window. Recent hour/day filters are not supported because Google does not index Instagram reels reliably enough in those windows. one of: last-week, last-month, last-year |
page | query | number | The page number to return. Must be between 1 and 11; page 12 or greater returns a 400 response. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_search_plus?query=dogs" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_search_plus?query=dogs", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/reels_search_plus?query=dogs",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"reels": [
{
"id": "3723045213787686915",
"typename": "XDTGraphVideo",
"shortcode": "DOq6eV6iIgD",
"url": "https://www.instagram.com/reel/DOq6eV6iIgD/",
"caption": "Dogs are family 💙\n\nI met Rocco, a little rescue Chihuahua all the way from Mexico 🇲🇽🐾 \n\nHe’s looked after by a lovely lady who’s always had dogs, but when sh...",
"thumbnail_src": "https://scontent-sjc3-1.cdninstagram.com/v/t51.2885-15/550186015_17890754136343371_4563383710172988045_n.jpg?stp=c0.280.720.720a_dst-jpg_e15_s640x640_tt6&_nc...",
"display_url": "https://scontent-sjc3-1.cdninstagram.com/v/t51.2885-15/550186015_17890754136343371_4563383710172988045_n.jpg?stp=dst-jpg_e15_tt6&_nc_ht=scontent-sjc3-1.cdnin...",
"video_url": "https://scontent-sjc3-1.cdninstagram.com/o1/v/t2/f2/m86/AQPtJA5EnMaKK-MNttf3RtYeQCVd-RvC7-juqeJiRkM3tKOkES_-1_ejsPDHgHGZ-xl4in8i3l38K12FlyUWKsieKzs2fGzo1GYOY...",
"has_audio": false,
"accessibility_caption": null,
"product_type": "clips",
"video_duration": 75.7,
"clips_music_attribution_info": {
"artist_name": "Oliver Max",
"song_name": "Smiling Heart",
"uses_original_audio": false,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "1711608879787237"
},
"is_video": true,
"owner": {
"id": "70127159370",
"username": "fetchmycamera_",
"is_verified": true,
"profile_pic_url": "https://scontent-sjc3-1.cdninstagram.com/v/t51.2885-19/464124732_886472936919742_2388131534569981752_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6I...",
"full_name": "Mark | Dog Photographer & Storyteller",
"is_private": false,
"is_unpublished": false,
"follower_count": 188406,
"post_count": 117
},
"taken_at": "2025-09-16T16:56:45.000Z",
"is_ad": false,
"like_count": 3487,
"is_affiliate": false,
"is_paid_partnership": false,
"location": {
"id": "110103980565013",
"has_public_page": true,
"name": "Central Park, New York City",
"slug": "central-park-new-york-city",
"address_json": "{\"street_address\": \"5th Avenue & 59th Street - Grand Army Plaza\", \"zip_code\": \"10019\", \"city_name\": \"New York, New York\", \"region_name\": \"\", \"country_code\": ..."
},
"comment_count": 90,
"comments": [
{
"id": "17987217557879174",
"text": "😍",
"owner": {
"id": "59201694781",
"is_verified": false,
"profile_pic_url": "https://scontent-sjc3-1.cdninstagram.com/v/t51.2885-19/487953757_1207254180975255_6791368254609466885_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6...",
"username": "bslattt_official"
},
"like_count": 0,
"created_at": "2025-11-14T17:34:59.000Z"
}
]
}
]
}GET /v1/instagram/user_posts_plus
Posts
Returns a paginated feed of a user's public Instagram posts, including reels, photos, videos, and carousels. Each item includes media type, shortcode, caption text, like count, comment count, play count, video URLs, image URLs, tagged users, and the published time in `items[].created_at` as an ISO 8601 UTC date. When supplied by Instagram, the media-level `fbid` is also returned. The original Unix timestamp remains available in `items[].taken_at`. Play counts reflect Instagram-only views and exclude cross-posted Facebook views. Supports cursor-based pagination via next_max_id for scrolling through the full timeline. ### Profile access errors These confirmed handle-resolution states on /v1/instagram/user/posts and /v2/instagram/user/posts return success=true even with HTTP 403/404. A confirmed state is a completed lookup, not a scraper failure. This approved boolean correction does not change status codes, messages, fields, or zero-credit billing. Actual retrieval failures remain success=false. Preserve each endpoint's response contract; see the [response-contract changelog](/#response-contract-changelog). A confirmed age gate returns HTTP 403 and zero credits. Unlike /v1/instagram/profile, these routes do not include age_restricted, handle, or userId in this error response: ```json { "success": true, "": 100, "": 0, "error": "forbidden", "errorStatus": 403, "message": "Profile is age restricted" } ``` An explicit restricted-profile error returns HTTP 404 and zero credits, with the exact message Profile is private: ```json { "success": true, "": 100, "": 0, "error": "not_found", "errorStatus": 404, "message": "Profile is private" } ``` An explicitly confirmed unavailable profile returns HTTP 404 and zero credits: ```json { "success": true, "": 100, "": 0, "error": "not_found", "errorStatus": 404, "message": "Profile is unavailable on Instagram" } ``` These are the explicit handle-resolution error branches, not a blanket description of every historical 404 fallback. The v2 route also retains legacy success=true HTTP-404 bodies (Posts not found, Account doesn't exist, or Profile is restricted). They differ in fields and legacy behavior from the explicit confirmed-state responses above; success=true alone does not distinguish them. No age-vs-region reason field is exposed. A generic login prompt does not establish age gating, and unavailability does not prove deletion. /v1/instagram/post and /v1/tiktok/profile have separate error contracts. Play counts can sometimes be inaccurate. Access-response examples distinguish confirmed age gates, restrictions, and unavailable profiles; existing legacy responses are retained.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
handle required | query | string | Instagram handle |
require_play_counts | query | boolean | Only the literal query value 'true' enables this check. It requires play_count on each returned video post; a real 0 is valid. It does not require ig_play_count or view counts, or counts on photos. If a required play_count is missing or null, the request returns an error without charging credits instead of a paid partial success. With the default false, counts remain best-effort: usable posts are still billable even with missing play counts. Retrying does not guarantee that Instagram will return the missing counts. Why counts can be missing. |
trim | query | boolean | Set to true to get a trimmed response |
next_max_id | query | string | Cursor to get next page of results. |
Request
curl "https://api.scrapall.bipsport.com/scapi/v1/instagram/user_posts_plus?handle=example" \
-H "X-Scapi-Key: YOUR_API_KEY"const res = await fetch("https://api.scrapall.bipsport.com/scapi/v1/instagram/user_posts_plus?handle=example", {
headers: { "X-Scapi-Key": "YOUR_API_KEY" }
});
const data = await res.json();import requests
r = requests.get(
"https://api.scrapall.bipsport.com/scapi/v1/instagram/user_posts_plus?handle=example",
headers={"X-Scapi-Key": "YOUR_API_KEY"},
)
print(r.json())Response 200 (sample)
{
"items": [
{
"id": "3644028144127958689_59042353222",
"code": "DKSMEpKRd6h",
"media_type": 2,
"taken_at": 1748622051,
"caption": {
"bit_flags": 0,
"created_at": 1748622053,
"created_at_utc": 1748622053,
"did_report_as_spam": false,
"is_ranked_comment": false,
"pk": "17916912093071427",
"share_enabled": false,
"content_type": "comment",
"media_id": "3644028144127958689",
"status": "Active",
"type": 1,
"user_id": "59042353222",
"strong_id": "17916912093071427",
"text": "5 best college baseball regional plays for day 1",
"user": {
"pk": "59042353222",
"pk_id": "59042353222",
"id": "59042353222",
"full_name": "Carson Szeder",
"is_private": false,
"is_unpublished": false,
"strong_id": "59042353222",
"fbid_v2": "17841459076660294",
"username": "carsoncantcode",
"is_verified": true,
"profile_pic_id": "3318246086567523250_59042353222",
"profile_pic_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-3.cd..."
},
"is_covered": false,
"private_reply_status": 0
},
"view_count": 2647,
"ig_play_count": 2643,
"comment_count": 7,
"like_count": 29,
"display_uri": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-15/502710192_1957567931446141_1822523212661288021_n.jpg?stp=c0.248.640.640a_dst-jpg_e15_tt6&_nc_ht=sconte...",
"user": {
"fbid_v2": "17841459076660294",
"feed_post_reshare_disabled": false,
"full_name": "Carson Szeder",
"id": "59042353222",
"is_private": false,
"is_unpublished": false,
"pk": "59042353222",
"pk_id": "59042353222",
"show_account_transparency_details": true,
"strong_id": "59042353222",
"third_party_downloads_enabled": 1,
"account_type": 3,
"account_badges": [],
"fan_club_info": {
"autosave_to_exclusive_highlight": null,
"connected_member_count": null,
"fan_club_id": null,
"fan_club_name": null,
"has_created_ssc": null,
"has_enough_subscribers_for_ssc": null,
"is_fan_club_gifting_eligible": null,
"is_fan_club_referral_eligible": null,
"is_free_trial_eligible": null,
"largest_public_bc_id": null,
"subscriber_count": null,
"fan_consideration_page_revamp_eligiblity": null
},
"has_anonymous_profile_picture": false,
"hd_profile_pic_url_info": {
"height": 633,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=10...",
"width": 633
},
"hd_profile_pic_versions": [
{
"height": 320,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s320x320_tt6&_nc_ht=scontent-lga3-3.cd...",
"width": 320
}
],
"is_verified": true,
"profile_pic_id": "3318246086567523250_59042353222",
"profile_pic_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-3.cd...",
"transparency_product_enabled": false,
"username": "carsoncantcode",
"is_embeds_disabled": false,
"eligible_for_text_app_activation_badge": false
},
"owner": {
"fbid_v2": "17841459076660294",
"feed_post_reshare_disabled": false,
"full_name": "Carson Szeder",
"id": "59042353222",
"is_private": false,
"is_unpublished": false,
"pk": "59042353222",
"pk_id": "59042353222",
"show_account_transparency_details": true,
"strong_id": "59042353222",
"third_party_downloads_enabled": 1,
"can_see_quiet_post_attribution": true,
"account_type": 3,
"account_badges": [],
"fan_club_info": {
"autosave_to_exclusive_highlight": null,
"connected_member_count": null,
"fan_club_id": null,
"fan_club_name": null,
"has_created_ssc": null,
"has_enough_subscribers_for_ssc": null,
"is_fan_club_gifting_eligible": null,
"is_fan_club_referral_eligible": null,
"is_free_trial_eligible": null,
"largest_public_bc_id": null,
"subscriber_count": null,
"fan_consideration_page_revamp_eligiblity": null
},
"has_anonymous_profile_picture": false,
"hd_profile_pic_url_info": {
"height": 633,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=10...",
"width": 633
},
"hd_profile_pic_versions": [
{
"height": 320,
"url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s320x320_tt6&_nc_ht=scontent-lga3-3.cd...",
"width": 320
}
],
"is_verified": true,
"profile_pic_id": "3318246086567523250_59042353222",
"profile_pic_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-3.cd...",
"transparency_product_enabled": false,
"username": "carsoncantcode",
"is_embeds_disabled": false,
"eligible_for_text_app_activation_badge": false
},
"image_versions2": {
"additional_candidates": {
"first_frame": {
"height": 1136,
"url": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-15/502608920_587032841104047_520039248454188749_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMSVB...",
"width": 640
},
"igtv_first_frame": {
"height": 1136,
"url": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-15/502608920_587032841104047_520039248454188749_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMSVB...",
"width": 640
},
"smart_frame": null
},
"candidates": [
{
"height": 1136,
"url": "https://scontent-lga3-2.cdninstagram.com/v/t51.2885-15/502710192_1957567931446141_1822523212661288021_n.jpg?stp=dst-jpg_e15_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMS...",
"width": 640
}
],
"scrubber_spritesheet_info_candidates": {
"default": {
"file_size_kb": 388,
"max_thumbnails_per_sprite": 105,
"rendered_width": 96,
"sprite_height": 1246,
"sprite_urls": [
"https://scontent-lga3-3.cdninstagram.com/v/t51.2885-15/502708871_1436358334024784_3923116580658609450_n.jpg?_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=1..."
],
"sprite_width": 1500,
"thumbnail_duration": 0.6866666666666666,
"thumbnail_height": 178,
"thumbnail_width": 100,
"thumbnails_per_row": 15,
"total_thumbnail_num_per_sprite": 105,
"video_length": 72.1
}
}
},
"product_type": "clips",
"music_details": null,
"is_paid_partnership": false,
"video_sticker_locales": [
"en"
],
"video_versions": [
{
"bandwidth": null,
"height": 852,
"type": 101,
"url": "https://scontent-lga3-1.cdninstagram.com/o1/v/t16/f2/m86/AQMBOiKBGQDTEPcTzw51q2K7ixLiwkfCual2hfLfJ11K3C6bAOlgqWAEIP4284QXb_Uk-TXekJvIUeAfv--ZX6PWX0s1LbCaDn13...",
"width": 480
}
],
"video_duration": 72.1,
"has_audio": true,
"url": "https://www.instagram.com/p/DKSMEpKRd6h/"
}
],
"next_max_id": "3639831059405682409_59042353222",
"num_results": 12,
"more_available": true,
"user": {
"pk": "59042353222",
"pk_id": "59042353222",
"full_name": "Carson Szeder",
"is_private": false,
"is_active_on_text_post_app": true,
"strong_id": "59042353222",
"profile_grid_display_type": "default",
"id": "59042353222",
"username": "carsoncantcode",
"is_verified": true,
"profile_pic_id": "3318246086567523250_59042353222",
"profile_pic_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.2885-19/431903885_797859762202050_7017850157267325892_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lga3-3.cd..."
}
}