Instagram post API
One post or reel in full: links to its pictures and video (one entry per slide of a carousel), caption, owner, time, and the numbers: views, likes, comments, shares, saves, reposts and length. Name it with url, code or id.
GEThttps://storiesfly.com/api/v1/post- Price 1 request
- Answers up to 5 minutes old
Parameters
All parameters go in the query string.
| Name | Type | Sent | Description |
|---|---|---|---|
url | string | one of | Link to the post or reel. Send exactly one of url, code or id. |
code | string | one of | Shortcode of the post: the part after /p/ or /reel/ in its link. Send exactly one of url, code or id. |
id | string | one of | Numeric media id of the post. Send exactly one of url, code or id. |
Example request
Put your own key in the header.
curl "https://storiesfly.com/api/v1/post?code=DcyLOLIEdy7" \
-H "X-Api-Key: sf_live_your_key"const res = await fetch(
"https://storiesfly.com/api/v1/post?code=DcyLOLIEdy7",
{ headers: { "X-Api-Key": process.env.STORIESFLY_KEY } }
);
const data = await res.json();import os
import requests
r = requests.get(
"https://storiesfly.com/api/v1/post",
params={"code": "DcyLOLIEdy7"},
headers={"X-Api-Key": os.environ["STORIESFLY_KEY"]},
)
data = r.json()Example response
{
"id": "3977290773452414139",
"shortcode": "DcyLOLIEdy7",
"url": "https://www.instagram.com/p/DcyLOLIEdy7/",
"owner": {
"id": "7719696",
"username": "arianagrande"
},
"taken_at": 1788350029,
"taken_at_iso": "2026-09-02T11:53:49.000Z",
"caption": "eternal sunshine tour, 2026 。˚ ♡ ∞\nthank you and \ni love you always",
"media_type": "carousel",
"pinned": true,
"thumbnail_url": "https://scontent-lax3-2.cdninstagram.com/v/t51.82787-15/791738291_18778422601039697_8733025742258971552_n.jpg",
"media": [
{
"id": "3977286630464928056",
"type": "image",
"image_url": "https://scontent-lax3-2.cdninstagram.com/v/t51.82787-15/791738291_18778422601039697_8733025742258971552_n.jpg",
"video_url": null,
"width": 2730,
"height": 1820,
"video_duration": null
},
{
"id": "3977286646931788566",
"type": "image",
"image_url": "https://scontent-lax3-2.cdninstagram.com/v/t51.82787-15/791296384_18778422625039697_6800978965548942666_n.jpg",
"video_url": null,
"width": 1666,
"height": 1111,
"video_duration": null
}
],
"likes": 1185299,
"comments": 70,
"shares": null,
"reposts": 56891,
"views": null,
"saves": null,
"video_duration": null,
"counts_hidden": false
}A real answer, shortened: lists are cut to two items and long texts to 160 characters.
Price and freshness
A call takes 1 request. Free requests are spent first, then your balance. The pricing page has the rates.
Answers are kept for up to 5 minutes. Asking again inside that time returns the same answer and takes 1 request again.
Errors
A failed call answers with an HTTP status and a body {error, code}. These are the codes this endpoint gives. Errors and what is charged covers all of them.
| Status | Code | When |
|---|---|---|
400 | bad_request | A parameter is missing or wrong, or not exactly one of url, code or id was sent. fields lists the names. Free. |
401 | unauthorized | The X-Api-Key header is missing or the key is wrong. Free. |
402 | credits_exhausted | The free requests and the balance are used up. Top up in the dashboard. Free. |
403 | telegram_required | The account behind the key is not linked to Telegram. The answer has a link_url to do it. Free. |
404 | not_found | The post does not exist. Charged like an answer. |
429 | rate_limited | More requests in a second than your level allows. Wait for the Retry-After header. Free. |
500 | internal_error | A fault on our side. Retry shortly. Refunded. |
503 | upstream_unavailable | Our side failed or timed out. Retry shortly. Refunded. |
Questions about this endpoint
How do I name the post?
Send exactly one of url, code or id. url is the link of a post, reel or IGTV video, code is the part of the link after /p/ or /reel/, and id is the numeric media id.
Why are views, shares and saves often null?
A count is returned only where Instagram shows it to the public. When it does not, the field is null and not 0. counts_hidden is true when the owner turned off like and view counts for the post.
Does it work for reels and carousels?
Yes. A photo, a video, a reel and a carousel answer in the same fields, and media_type says which one it is. media holds one entry for a photo, a video or a reel and one per slide for a carousel, each with image_url and, for a video, video_url. The links point to Instagram's servers and stop working after some time, so save the files you need. video_duration is set for videos only.
Your first 100 requests are on us
Sign in with Telegram, create a key, call any endpoint. Top up only when you need more.
