You can read public Instagram posts with four REST calls: one post or reel by URL or shortcode, the paginated post feed of a handle, the posts in the Tagged tab of a user, and an AI speech-to-text transcript of a video post or reel. Every call returns JSON and only needs one API key header, so you do not need a Meta app, a Graph API token or a business account.
| Endpoint | What it returns | Credits/call | USD/call (Freelance plan) |
|---|---|---|---|
/v1/instagram/post | Post/Reel Info | 1 | $0.0017 |
/v1/instagram/user_posts_plus | Posts | 1 | $0.0017 |
/v1/instagram/user_tagged_posts | User Tagged Posts | 1 | $0.0017 |
/v1/instagram/media_captions_plus | Transcript | 1 | $0.0017 |
/v1/instagram/postPost/Reel Info 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Instagram post or reel URL |
region | string | no | 2 letter country code to set the proxy in |
trim | boolean | no | Set to true to get a trimmed response |
download_media | boolean | no | 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 | boolean | no | Set to false to omit `video_play_count` and skip its additional fetch for a faster response. Defaults to true. |
cache_max_age | string | no | 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). |
Sample response (trimmed):
{
"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/v1/instagram/user_posts_plusPosts 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
handle | string | yes | Instagram handle |
require_play_counts | boolean | no | 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 |
trim | boolean | no | Set to true to get a trimmed response |
next_max_id | string | no | Cursor to get next page of results. |
/v1/instagram/user_tagged_postsUser Tagged Posts 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
user_id | string | yes | Numeric Instagram user ID. |
next_cursor | string | no | Cursor returned by the previous response. |
/v1/instagram/media_captions_plusTranscript 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Instagram post or reel URL |
allow_long_transcription | boolean | no | 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 mod |
cache_max_age | string | no | 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). |
curl -H "X-Scapi-Key: $SCAPI_KEY" "https://api.scrapall.bipsport.com/scapi/v1/instagram/post"import os, requests
r = requests.get("https://api.scrapall.bipsport.com/scapi/v1/instagram/post",
headers={"X-Scapi-Key": os.environ["SCAPI_KEY"]})
print(r.json())Call the post endpoint with the public post or reel URL, or its shortcode, and your API key in the header. The JSON response includes the caption text, the like count and other post metadata. Set include_play_count to also get the play count of a reel.
Yes. The user posts endpoint takes a handle and returns a paginated feed of public posts, including reels, photos, videos and carousels. Pass next_max_id from the previous response to load older posts.
Yes. The tagged posts endpoint takes a user_id and returns up to 10 public posts per page from the Tagged tab, with cursor pagination.
Yes. The transcript endpoint generates AI speech-to-text for a video post or reel by URL and returns a transcripts array. Long videos need allow_long_transcription to be enabled.
Each successful call is billed from your credit balance, with no Meta API approval. The exact cost per endpoint is shown in the cost table on this page.
Open the Buy page, pick the Freelance plan and pay in USDT on TRC20 or ERC20. The key is shown once, right after the payment is confirmed on-chain.
The cost table on this page lists credits per call for each endpoint. The Freelance plan is $45 for 27,000 credits per 30 days.
Full reference: all instagram endpoints.