Instagram Posts API: posts, reels, captions and transcripts as JSON

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.

Buy credits

Use cases

Endpoints and cost

EndpointWhat it returnsCredits/callUSD/call (Freelance plan)
/v1/instagram/postPost/Reel Info1$0.0017
/v1/instagram/user_posts_plusPosts1$0.0017
/v1/instagram/user_tagged_postsUser Tagged Posts1$0.0017
/v1/instagram/media_captions_plusTranscript1$0.0017

Endpoint details

/v1/instagram/post

Post/Reel Info 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.

ParameterTypeRequiredDescription
urlstringyesInstagram post or reel URL
regionstringno2 letter country code to set the proxy in
trimbooleannoSet to true to get a trimmed response
download_mediabooleannoSet 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_countbooleannoSet to false to omit `video_play_count` and skip its additional fetch for a faster response. Defaults to true.
cache_max_agestringnoIf 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_plus

Posts 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.

ParameterTypeRequiredDescription
handlestringyesInstagram handle
require_play_countsbooleannoOnly 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
trimbooleannoSet to true to get a trimmed response
next_max_idstringnoCursor to get next page of results.

/v1/instagram/user_tagged_posts

User Tagged Posts 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.

ParameterTypeRequiredDescription
user_idstringyesNumeric Instagram user ID.
next_cursorstringnoCursor returned by the previous response.

/v1/instagram/media_captions_plus

Transcript 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.

ParameterTypeRequiredDescription
urlstringyesInstagram post or reel URL
allow_long_transcriptionbooleannoPaid 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_agestringnoIf 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).

Example: curl

curl -H "X-Scapi-Key: $SCAPI_KEY" "https://api.scrapall.bipsport.com/scapi/v1/instagram/post"

Example: Python

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())

FAQ

How do I get Instagram post data with an API?

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.

Can I list all posts of an account?

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.

Can I get the posts an account is tagged in?

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.

Can I get a transcript of an Instagram reel?

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.

How is it billed?

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.

How do I pay and get my API key?

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.

How many credits does one call use?

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.

Get an API key and credits

Full reference: all instagram endpoints.