Back to all posts

How to Download Instagram Reels and Videos with an API (2026 Guide)

Jonathan Geiger
Instagram APIVideo DownloadReelsMP4MP3Developer ToolsTutorial

Need to download Instagram Reels or videos from code? Whether you're archiving content, building a trend monitor, or piping Reels into a transcription job, doing it through an API is the cleanest path. No app, no watermark hack, no scraper to maintain.

This guide walks through it with the Instagram Video Download API. It uses the same request shape as our YouTube and TikTok Download APIs, so if you've already integrated either of those you can copy your code and change one word.

What you can do

The Instagram Video Download API lets you:

  • Download Reels and videos in MP4, AVI, or WebM with quality from 240p to 1080p
  • Pull audio only in MP3, M4A, OGG, or WAV
  • Get metadata back. Title, duration, thumbnail.
  • Hand off a temporary, pre-signed download URL hosted on our servers. Valid for 1 hour.
  • Hit our S3 cache on repeat downloads. Same (shortcode, format, quality) comes back in under 2 seconds.

Why use the API instead of yt-dlp or scraping

A few practical reasons:

  • No yt-dlp binary to ship, no FFmpeg infra, no S3 buckets to provision
  • 7 output formats with built-in conversion
  • All Instagram video surfaces. /reel/, /reels/, /p/, and /tv/ URLs all work
  • Same request shape as /youtube/download and /tiktok/download. If you're already calling one of those, you change the word "youtube" or "tiktok" to "instagram" and you're shipped

API endpoint

POST https://api.socialkit.dev/instagram/download

Parameters

ParameterTypeRequiredDescription
urlstringYesInstagram URL. Reels, posts, and IGTV all work.
access_keystringYesYour API access key
formatstringNoOutput format: mp4, mp3, avi, webm, m4a, ogg, wav. Default mp4.
qualitystringNoVideo quality: 240p, 360p, 480p, 720p, 1080p. Default 720p.

Example request

POST https://api.socialkit.dev/instagram/download
Content-Type: application/json

{
  "access_key": "your-access-key",
  "url": "https://www.instagram.com/reel/DRU4smMj0cu/",
  "format": "mp4",
  "quality": "720p"
}

Example response

{
  "success": true,
  "data": {
    "url": "https://www.instagram.com/reel/DRU4smMj0cu/",
    "title": "Video by yuumi_cat9",
    "duration": "0:27",
    "durationSeconds": 27.433,
    "thumbnail": "https://instagram.ftlv1-1.fna.fbcdn.net/...",
    "downloadUrl": "https://socialkit-downloads.s3.amazonaws.com/cache/instagram_DRU4smMj0cu_720p.mp4?...",
    "fileSize": 5210953,
    "fileSizeMB": "4.97 MB",
    "format": "mp4",
    "quality": "720p",
    "expiresIn": "1 hour"
  }
}

The downloadUrl is a pre-signed S3 link, valid for an hour. Use it directly to fetch the file or redirect your user to it.

Code examples

JavaScript / Node.js

const axios = require('axios');

async function downloadInstagramVideo(videoUrl, accessKey, format = 'mp4', quality = '720p') {
  try {
    const response = await axios.post('https://api.socialkit.dev/instagram/download', {
      access_key: accessKey,
      url: videoUrl,
      format,
      quality,
    });

    return response.data;
  } catch (error) {
    console.error('Error downloading Instagram video:', error.response?.data || error.message);
    throw error;
  }
}

// Usage
const videoUrl = 'https://www.instagram.com/reel/DRU4smMj0cu/';
const accessKey = 'your-access-key';

downloadInstagramVideo(videoUrl, accessKey, 'mp4', '720p')
  .then((data) => {
    console.log('Title:', data.data.title);
    console.log('Size:', data.data.fileSizeMB);
    console.log('Download URL:', data.data.downloadUrl);
  });

Python

import requests

def download_instagram_video(video_url, access_key, format='mp4', quality='720p'):
    endpoint = 'https://api.socialkit.dev/instagram/download'

    payload = {
        'access_key': access_key,
        'url': video_url,
        'format': format,
        'quality': quality,
    }

    response = requests.post(endpoint, json=payload)
    response.raise_for_status()

    return response.json()

# Usage
video_url = 'https://www.instagram.com/reel/DRU4smMj0cu/'
access_key = 'your-access-key'

data = download_instagram_video(video_url, access_key, format='mp4', quality='720p')

print(f"Title: {data['data']['title']}")
print(f"Size: {data['data']['fileSizeMB']}")
print(f"Download URL: {data['data']['downloadUrl']}")

Save the file locally (Python)

import requests

def download_and_save(video_url, access_key, output_path, format='mp4', quality='720p'):
    # Step 1: Get the download URL
    result = download_instagram_video(video_url, access_key, format, quality)
    download_url = result['data']['downloadUrl']
    title = result['data']['title']

    # Step 2: Download the file
    print(f'Downloading "{title}"...')
    file_response = requests.get(download_url)

    with open(output_path, 'wb') as f:
        f.write(file_response.content)

    print(f'Saved to {output_path} ({result["data"]["fileSizeMB"]})')

# Usage
download_and_save(
    'https://www.instagram.com/reel/DRU4smMj0cu/',
    'your-access-key',
    'video.mp4',
    format='mp4',
    quality='720p',
)

PHP

<?php
function downloadInstagramVideo($videoUrl, $accessKey, $format = 'mp4', $quality = '720p') {
    $endpoint = 'https://api.socialkit.dev/instagram/download';

    $payload = json_encode([
        'access_key' => $accessKey,
        'url' => $videoUrl,
        'format' => $format,
        'quality' => $quality,
    ]);

    $ch = curl_init($endpoint);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// Usage
$videoUrl = 'https://www.instagram.com/reel/DRU4smMj0cu/';
$accessKey = 'your-access-key';

$data = downloadInstagramVideo($videoUrl, $accessKey, 'mp4', '720p');

echo "Title: " . $data['data']['title'] . "\n";
echo "Size: " . $data['data']['fileSizeMB'] . "\n";
echo "Download URL: " . $data['data']['downloadUrl'] . "\n";
?>

cURL

curl -X POST "https://api.socialkit.dev/instagram/download" \
  -H "Content-Type: application/json" \
  -d '{
    "access_key": "your-access-key",
    "url": "https://www.instagram.com/reel/DRU4smMj0cu/",
    "format": "mp4",
    "quality": "720p"
  }'

Supported formats

Video

FormatExtensionNotes
MP4.mp4Default. Use this unless you have a reason not to.
AVI.aviOlder container. Useful for legacy editing tools.
WebM.webmOpen format with VP8/VP9.

Audio

FormatExtensionNotes
MP3.mp3Standard. Good for podcast clips and TTS pipelines.
M4A.m4aAAC. Closest to Instagram's native audio.
OGG.oggOpen format with Vorbis.
WAV.wavUncompressed. Biggest file, no quality loss.

Quality options

For video formats (MP4, AVI, WebM):

QualityResolutionWhen to pick it
240p426 × 240Tiny files for dataset building or previews
360p640 × 360Light mobile, low bandwidth
480p854 × 480Standard mobile
720p1280 × 720HD, Instagram's normal Reel export. Default.
1080p1920 × 1080Full HD when the original supports it

Most Reels land at 720p so the default usually matches the source. Drop lower for dataset work, push to 1080p only when the original was uploaded at full HD.

Common use cases

Bulk archiving

Keep copies of trending Reels before they get deleted. A nightly script pulls top Reels for a hashtag, calls the download API, and writes the metadata to a database.

Audio extraction into transcription

Pull MP3 from a Reel, send through Whisper or another speech-to-text engine, and you've got a searchable transcript layer. Useful for brand monitoring, trend research, or fact-checking. (Or skip the audio step entirely and use the Instagram Transcript API directly.)

Cross-platform repurposing

Download a high-performing Reel in MP4, re-cut for TikTok and YouTube Shorts. Same source, three platforms, one API call.

AI and RAG pipelines

Feed the raw MP4 to multi-modal models for object detection, scene classification, or training-data generation. The 30 MB cap covers nearly every Reel we tested.

Competitor monitoring

Auto-download competitor Reels daily, pair with the Comments API for sentiment, build an internal trend dashboard.

Error handling

Standard HTTP status codes. The cases you'll actually see:

StatusWhat it meansWhat to do
200SuccessUse data.downloadUrl to fetch the file
400Bad URL or formatCheck the URL is a real Instagram link (/reel/, /reels/, /p/, /tv/) and format/quality are in the allowed list
401Access key missingAdd access_key to the query, body, or x-access-key header
403Access key invalid or monthly quota exhaustedVerify the key or upgrade your plan
404Could not downloadPost may be private, deleted, region-locked, or behind login
429Per-tier rate limit hitWait for the window to reset, or upgrade for a higher per-minute cap

The response also includes an X-Credits-Remaining header so you can track your quota client-side.

Pricing

The Instagram Download API runs on the same credit pool as the rest of SocialKit:

  • Free, 20 requests/month, no card
  • Starter, $13/mo, 2,000 requests
  • Higher tiers up to 1,000,000 requests/mo, see pricing

1 successful download = 1 credit. Failed requests don't count. Cache hits still count as 1 credit because you're still calling the API.

Pair it with the other Instagram APIs

The Instagram Download API is one piece of SocialKit. The same access key also gets you:

Same shape, different platform? See How to Download TikTok Videos with an API or How to Download YouTube Videos with an API.

Get started

The free Instagram Video Downloader needs no code. 20 credits a month, sign-up takes a minute. For the API itself, see the docs.