Developers
Instagram Parse API
POST a public Instagram post URL, get back JSON with direct media URLs and metadata — the same pipeline that powers this site, exposed as an endpoint. Subscriptions and quotas run through our RapidAPI listing.
Found /api/parse in DevTools?
That endpoint is the website's own internal API. It is rate-limited per visitor IP, its response shape can change without notice, and calling it from your code will start failing the moment we tune either. The integration surface is POST /api/v1/parse — versioned, authenticated through RapidAPI, and stable: we treat its schema as a contract.
Request
One endpoint, JSON in, JSON out. Your exact gateway host, key header and ready-to-paste snippets in nine languages are generated on the RapidAPI listing page after subscribing (the free tier needs no card).
POST /api/v1/parse
Content-Type: application/json
{ "url": "https://www.instagram.com/reel/DbB4is3D0GM" }Response
{
"ok": true,
"cached": false,
"type": "reel",
"notice": "Media URLs are signed by Instagram, expire roughly 108 hours after issue…",
"medias": [
{
"url": "https://scontent-…cdninstagram.com/…mp4?…",
"kind": "video_only",
"quality": "1080p",
"format": "mp4",
"width": 1080,
"height": 1920,
"bitrate": 3374.3,
"hasAudio": true,
"audioUrl": "https://scontent-…cdninstagram.com/…m4a?…"
}
],
"metadata": {
"author": "nasa",
"caption": "…",
"thumbnail": "https://…",
"timestamp": "2026-07-18T14:02:11.000Z"
}
}Two things integrators trip on. First: video_only items carry a separate audioUrl — Instagram serves Reels as split DASH streams, so you mux the pair (ffmpeg -c copy is enough) or you ship silent video. Why, in detail. Second: the returned URLs are signed by Instagram, lapse roughly 108 hours after issue, and can be refused when fetched from a different network than the one that requested them — download promptly and re-parse rather than caching URLs. The signature, decoded.
Coverage, with measured numbers
Publishing our own success rates is unusual for this category; we'd rather you price retries on real numbers than discover them in production. Measured on live traffic, 2026-07-29 to 08-03:
| URL shape | Supported | Observed success |
|---|---|---|
| /reel/ · /reels/ | yes | ~89% |
| /p/ | yes | ~50% — Instagram declines anonymous post requests far more often than reels |
| /tv/ | yes | ~20%, low volume |
| /stories/ · highlights · profiles | rejected | 0 of 24 observed — expired or auth-gated; we refuse rather than bill you for it |
Errors
Every failure carries retryable so your client knows whether another call can possibly help.
| error | HTTP | retryable | meaning |
|---|---|---|---|
| CONTENT_UNAVAILABLE | 422 | no | Private, deleted, or no downloadable media. A retry cannot change this. |
| UNKNOWN / PARSE_ERROR | 422 | yes | Instagram declined this anonymous request. The same URL often resolves on a later attempt. |
| RATE_LIMITED | 422 | yes | Instagram-side throttling on the exit pool. Back off before retrying. |
| UNSUPPORTED_SHAPE | 422 | no | Stories, Highlights and profile URLs are rejected up front rather than billed for a near-certain failure. |
| SERVICE_BUSY | 429 | yes | Our upstream capacity is saturated. Honour the Retry-After header. |
| INVALID_URL / INVALID_JSON | 400 | no | Malformed body, or not an instagram.com URL. |
| UNAUTHORIZED | 401 | no | Request did not arrive through RapidAPI. |
Limits we keep on purpose
Public content only — the API holds no Instagram session and never will, which is exactly why private accounts, Stories and Highlights are out of scope. We parse and return URLs; media bytes flow from Instagram's CDN to you, not through us. Not affiliated with Instagram or Meta.