# GET /v1/post: 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.

- Call: `GET https://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

```bash
curl "https://storiesfly.com/api/v1/post?code=DcyLOLIEdy7" \
  -H "X-Api-Key: sf_live_your_key"
```

### JavaScript

```javascript
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();
```

### Python

```python
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

200 OK · X-Units-Charged: 1

```json
{
  "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](https://storiesfly.com/developers/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](https://storiesfly.com/developers/docs#errors) 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](https://storiesfly.com/developers/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.

## Related endpoints

- [GET /v1/post/comments](https://storiesfly.com/developers/docs/post-comments): Comments with likes and reply counts
- [GET /v1/post/likers](https://storiesfly.com/developers/docs/post-likers): Accounts that liked the post
- [GET /v1/post/usertags](https://storiesfly.com/developers/docs/post-usertags): People tagged in the post
- [GET /v1/post/music](https://storiesfly.com/developers/docs/post-music): The track used in a reel
- [GET /v1/resolve](https://storiesfly.com/developers/docs/resolve): Turn a post, reel or share link into data

## Links

- [This page on the site](https://storiesfly.com/developers/docs/post)
- [Instagram data API](https://storiesfly.com/developers): what the API is and what it returns
- [Pricing](https://storiesfly.com/developers/pricing): rates, examples and billing rules
- [Documentation](https://storiesfly.com/developers/docs): quick start, authentication, errors and every endpoint
- [OpenAPI file](https://storiesfly.com/openapi.json): the whole API in one file
- [API dashboard](https://storiesfly.com/developers/dashboard): get a key and top up
- [Changelog](https://storiesfly.com/developers/changelog): what changed and when
