Instagram Post & Reel Data API
Send a post, reel or carousel URL (or just its shortcode) and receive everything about it as JSON: author, caption, engagement, audio, each slide of a carousel and every available video quality.
Request
GET /v1/media ·
1 credit per successful call
curl "https://api.igramapi.com/v1/media?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FCx1AbCdEfGh%2F" \
-H "Authorization: Bearer YOUR_API_KEY" import requests
response = requests.get(
"https://api.igramapi.com/v1/media?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FCx1AbCdEfGh%2F",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=30,
)
response.raise_for_status()
print(response.json()) const response = await fetch("https://api.igramapi.com/v1/media?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FCx1AbCdEfGh%2F", {
method: "GET",
headers: {
Authorization: "Bearer YOUR_API_KEY",
},
});
if (!response.ok) throw new Error((await response.json()).error.message);
console.log(await response.json()); <?php
$ch = curl_init("https://api.igramapi.com/v1/media?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FCx1AbCdEfGh%2F");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
],
]);
$data = json_decode(curl_exec($ch), true);
print_r($data); Response
{
"shortcode": "Cx1AbCdEfGh",
"media_type": "video",
"video_url": "https://scontent.cdninstagram.com/v/example/clip.mp4",
"thumbnail": "https://scontent.cdninstagram.com/v/example/thumb.jpg",
"slides": [
{
"type": "video",
"url": "https://scontent.cdninstagram.com/v/example/clip.mp4",
"thumbnail": "https://scontent.cdninstagram.com/v/example/thumb.jpg"
}
],
"formats": [
{
"id": "dash-1080p",
"quality": "1080p",
"width": 1080,
"height": 1920,
"bitrate": 2400000,
"codec": "h264",
"size_bytes": 4100000,
"url": "https://scontent.cdninstagram.com/v/example/v1080.mp4",
"audio_url": "https://scontent.cdninstagram.com/v/example/a.mp4"
},
{
"id": "mp4-720p",
"quality": "720p",
"width": 720,
"height": 1280,
"bitrate": 1400000,
"codec": "h264",
"size_bytes": null,
"url": "https://scontent.cdninstagram.com/v/example/v720.mp4",
"audio_url": null
}
],
"caption": "Behind the scenes from today's shoot",
"author": {
"username": "example_creator",
"full_name": "Example Creator",
"profile_picture_url": "https://scontent.cdninstagram.com/v/example/avatar.jpg"
},
"duration": 14.2,
"taken_at": 1761900000,
"play_count": 90400,
"like_count": 5230,
"comment_count": 112,
"reshare_count": 64,
"audio": {
"url": "https://scontent.cdninstagram.com/v/example/song.m4a",
"title": "Original audio",
"artist": "example_creator"
},
"is_paid_partnership": false,
"cached": false
} All values above are made-up examples. Media links are temporary Instagram CDN addresses.
Parameters
| Name | In | Description |
|---|---|---|
url | query | Post or reel URL. Use this or `shortcode`. |
shortcode | query | The code from instagram.com/p/{shortcode}. |
Response fields
| Field | Type | Description |
|---|---|---|
shortcode | string | Post identifier. |
media_type | string | video, image or carousel. |
video_url / thumbnail | string | null | Best video file and cover image (temporary CDN links). |
slides[] | object[] | type, url and thumbnail for each item. |
formats[] | object[] | quality, size, codec, url and optional audio_url per option. |
author | object | username, full_name, profile_picture_url. |
play_count, like_count, comment_count, reshare_count | integer | null | Engagement. |
audio | object | null | url, title and artist. |
URL in, JSON out
Paste any post or reel link. The shortcode is extracted for you.
Every video quality
The formats list shows each available quality, best first. Video-only qualities carry an audio_url to merge.
Carousels handled
Each slide of a carousel is listed in slides with its own type and media link.
Audio and partnership data
Audio title and artist, plus a paid-partnership flag, when the post has them.
One endpoint for posts, reels and carousels
The media_type field tells you whether you received a video, an image or a carousel. Photos return a single slide, videos return a video_url and a formats list, and carousels return one slide per item.
Send either the full URL or only the shortcode. Short links with tracking parameters (for example ?igsh=) are handled.
Choosing a video quality
Qualities up to 720p often arrive as a single file with sound. Higher qualities such as 1080p are published as a video stream plus a separate audio stream. When audio_url is present, send both URLs to the Downloader API and it returns one merged MP4.
Frequently asked questions
Does it work for reels, photos and carousels?
Yes. The same endpoint returns all three, and `media_type` tells them apart.
Why does a quality have an audio_url?
High qualities are delivered as separate video and audio streams. Give both to the Downloader API to get a single MP4 with sound.
Can I read posts from private accounts?
No. A private or deleted post returns an error (`media_unavailable` or `login_required`) and costs nothing.
Do the media links last?
No, Instagram's CDN links expire. Use the Downloader API when you need a link that stays valid for a while.
Errors cost nothing. Any response with a status of 400 or above is refunded, and every error has the same shape. See error handling and credits and rate limits.
Try the Post & Reel Data API free
Create a key and make your first request in minutes. 100 free credits every month.