# Instagram Post API

Beta

Returns a public Instagram post, reel or carousel: the caption with its hashtags and mentions, the author and any collaborators, the publish time, every carousel item's image or video URL with its size, duration and alt text, and the like, comment and (for single videos) view counts. Accepts post, reel, tv, instagr.am and share links or a raw shortcode.

[Get 100 free credits](https://staging-fly.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dinstagram.post) · [API reference](https://staging-fly.socialtap.dev/docs/reference/instagram/post/index.md) · [Try it](https://staging-fly.socialtap.dev/playground/?endpoint=instagram.post)

- **Price**: From **1 credit** per request$0.75–$1.45 per 1,000 requests
- **Request**: `GET /v1/instagram/post`One API key, one JSON schema
- **Input**: `url`e.g. `https://www.instagram.com/reel/De1S3KpCXf0/`
- **Failed requests**: Free: 0 credits

Use cases

## What teams build with it. From one request.

- Track engagement on influencer and brand posts
- Monitor competitors' reels and campaigns
- Collect captions, hashtags and tags for social listening
- Archive post media and metadata
- Verify sponsored-post deliverables

What you get

## Posts in one schema. The same on every platform.

- **`platform`string**: Platform ID (tiktok, youtube, …).
- **`id`string**: Platform-native post ID (string; Instagram shortcode, Reddit without t3_).
- **`url`string**: Canonical post URL.
- **`type`string**: Normalized content shape. New values may be added; treat unknown values as other.
- **`platform_type`string**: The platform's own product label, lowercase (reel, short, story, live, tweet, …).
- **`title`string**: Headline (YouTube title, Reddit title); null on caption-only platforms.
- **`text`string**: Caption, description or body as plain text.
- **`language`string**: BCP-47 language of text, when the platform states it.

Every field, its type and when it is `null`: [the response reference](https://staging-fly.socialtap.dev/docs/reference/instagram/post/index.md#response) and the [post schema](https://staging-fly.socialtap.dev/resources/post/index.md).

## Example request

cURL:

```shell
curl -G 'https://staging-fly.socialtap.dev/v1/instagram/post' \
  --data-urlencode 'url=https://www.instagram.com/reel/De1S3KpCXf0/' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
```

Node.js:

```javascript
const params = new URLSearchParams({
  url: "https://www.instagram.com/reel/De1S3KpCXf0/",
});
const res = await fetch(`https://staging-fly.socialtap.dev/v1/instagram/post?${params}`, {
  headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);
```

Python:

```python
import os

import requests

res = requests.get(
    "https://staging-fly.socialtap.dev/v1/instagram/post",
    params={"url": "https://www.instagram.com/reel/De1S3KpCXf0/"},
    headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])
```

Go:

```go
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	q := url.Values{}
	q.Set("url", "https://www.instagram.com/reel/De1S3KpCXf0/")
	req, err := http.NewRequest("GET", "https://staging-fly.socialtap.dev/v1/instagram/post?"+q.Encode(), nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	var body struct {
		Data  json.RawMessage `json:"data"`
		Meta  map[string]any  `json:"meta"`
		Error *struct {
			Code    string `json:"code"`
			Message string `json:"message"`
		} `json:"error"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		log.Fatal(err)
	}
	if body.Error != nil {
		log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
	}
	fmt.Println(string(body.Data), body.Meta["credits_charged"])
}
```

200 OK:

```json
{
  "data": {
    "approximate_fields": [],
    "author": {
      "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/683576066_18653628823019133_9051036240972105113_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
      "display_name": "National Geographic",
      "id": "787132",
      "is_verified": true,
      "url": "https://www.instagram.com/natgeo/",
      "username": "natgeo"
    },
    "coauthors": [
      {
        "avatar_url": "https://scontent-atl3-1.cdninstagram.com/v/t51.2885-19/293493364_162817252949028_8275460966213229030_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=108&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_ss=7b6…",
        "display_name": "National Geographic Society",
        "id": "4757225830",
        "is_verified": true,
        "url": "https://www.instagram.com/natgeosociety/",
        "username": "natgeosociety"
      },
      {
        "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/11419091_505296402966021_797003013_a.jpg?_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_ss=7b689&oh=SCRUBBED&oe=F2A52380",
        "display_name": "Joel Sartore- Photo Ark",
        "id": "225429667",
        "is_verified": true,
        "url": "https://www.instagram.com/joelsartore/",
        "username": "joelsartore"
      },
      {
        "avatar_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-19/681945023_18592998970017301_7811445524976503069_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=1&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc_gid=S…",
        "display_name": "National Geographic Animals",
        "id": "1029649300",
        "is_verified": true,
        "url": "https://www.instagram.com/natgeoanimals/",
        "username": "natgeoanimals"
      }
    ],
    "duration_ms": 23744,
    "hashtags": [
      "PhotoArk"
    ],
    "id": "De1S3KpCXf0",
    "is_nsfw": null,
    "is_pinned": null,
    "is_sponsored": null,
    "language": null,
    "media": [
      {
        "alt_text": "Video by National Geographic on October 23, 2026. May be an image of snail and text.",
        "duration_ms": 23744,
        "expires_at": "2026-10-25T18:00:00Z",
        "height": 1920,
        "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/862543567_18711062458019133_8845814561108513720_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=105&ig_cache_key=NDAxNDE5NzU5ODcwNDk5MDE5NjE4NzExMDYyNDUyMDE5MTMz.3-ccb7-5&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=…",
        "type": "video",
        "url": "https://scontent-atl3-1.cdninstagram.com/o1/v/t2/f2/m86/AQO0Zc3E_eoYHXxPOVvPDNzjiHnCGoREl8vxeookIy4831a0VLAN6T9CITX0dyH2cQS6Dy0fs5SGxYC42fWpG2JeAvlnP9yrsgmHUk8.mp4?_nc_cat=106&_nc_sid=SCRUBBED&_nc_ht=scontent-atl3-1.cdninstagram.com&_nc_ohc=SCRUBBED&efg=SCRUBBED&ccb=SCRUBBED&vs=S…",
        "width": 1080
      }
    ],
    "mentions": [
      "joelsartore",
      "natgeoanimals",
      "natgeosociety"
    ],
    "metrics": {
      "comment_count": 238,
      "like_count": 68253,
      "quote_count": null,
      "repost_count": null,
      "save_count": null,
      "share_count": null,
      "view_count": 759188
    },
    "platform": "instagram",
    "platform_specific": {
      "instagram": {
        "is_ai_generated": null
      }
    },
    "platform_type": "reel",
    "published_at": "2026-10-23T10:01:35Z",
    "text": "Warning—looking at nudibranchs may cause excessive awe. @joelsartore loves these little creatures, and so do we. 💛🧡🩷\n\nWe’re celebrating 20 years of the National Geographic #PhotoArk, an audacious project documenting the world's incredible biodiversity and highlighting the importa…",
    "thumbnail_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/862543567_18711062458019133_8845814561108513720_n.jpg?stp=dst-jpg_e35_s640x640_tt6&_nc_cat=105&ccb=SCRUBBED&_nc_sid=SCRUBBED&efg=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-2.cdninstagram.com&_nc…",
    "title": null,
    "type": "video",
    "unknown_fields": [],
    "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
  },
  "meta": {
    "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
    "platform": "instagram",
    "source": "page",
    "is_cached": false,
    "credits_charged": 1,
    "latency_ms": 0,
    "fetched_at": "2026-10-25T12:00:00Z",
    "input": {
      "kind": "post",
      "id": "De1S3KpCXf0",
      "url": "https://www.instagram.com/reel/De1S3KpCXf0/"
    },
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": [],
    "mode": "live"
  }
}
```

Long arrays and strings are shortened for display; real responses are complete.

> [!NOTE]
>
> **Good to know**
>
> - Media URLs are Instagram CDN links that expire: media\[\].expires_at says when; download what you need before then.
> - view_count is set for single videos and reels only (Instagram shows no view count for photos and carousels). like_count and view_count are null when the owner hides them. When Instagram's embed page, the only logged-out source of the view count, fails or omits it, the post is still returned with view_count null and a partial_data warning in meta.warnings.
> - Instagram does not expose share or save counts, pinned state, sponsorship labels or the caption's language to logged-out visitors: those fields are null.
> - Private, age-restricted and deleted posts return private_or_unavailable or not_found and are not charged.

Pricing

## Pay per request. Only when it succeeds.

| Source | Price per successful request | Per 1,000 requests |
| --- | --- | --- |
| Public page `page` | 1 credit | $0.75–$1.45 |

- Failed requests are free: errors cost 0 credits.
- Cache hits are free: responses served from the cache cost 0 credits.
- Credits never expire.
- One credit balance for every endpoint and platform.

[Credit packs](https://staging-fly.socialtap.dev/pricing/index.md) · [How this endpoint is priced](https://staging-fly.socialtap.dev/docs/reference/instagram/post/index.md#pricing) · [How credits work](https://staging-fly.socialtap.dev/docs/credits/index.md)

FAQ

## Questions, answered.

**Does it return every image of a carousel?**

Yes: media\[\] has one entry per carousel item, in display order, each with its own URL, size and, for videos, duration.

**Who is in mentions?**

Accounts @mentioned in the caption, then accounts tagged in the media, without duplicates. Collaborators of a collab post are in coauthors.

**How much does the Instagram Post API cost?**

1 credit for public page results (meta.source = page), charged only for successful requests. SocialTap credits cost $0.75–$1.45 per 1,000 depending on the pack.

**Am I charged for failed requests?**

No. Requests that return an error cost 0 credits. Responses served from the cache are free too.

Same schema, other platforms

## Posts everywhere. One parser.

[Facebook Post APIBetaPost`GET /v1/facebook/post`1 credit](https://staging-fly.socialtap.dev/apis/facebook/post/index.md) · [Instagram Posts APIBetaPost`GET /v1/instagram/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/instagram/posts/index.md) · [Rumble Video APIBetaPost`GET /v1/rumble/post`1 credit](https://staging-fly.socialtap.dev/apis/rumble/post/index.md) · [Rumble Channel Videos APIBetaPost`GET /v1/rumble/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/rumble/posts/index.md) · [Rumble Search APIBetaPost`GET /v1/rumble/search_posts`1 credit / page](https://staging-fly.socialtap.dev/apis/rumble/search_posts/index.md) · [TikTok Post APIBetaPost`GET /v1/tiktok/post`1 credit](https://staging-fly.socialtap.dev/apis/tiktok/post/index.md) · [TikTok Posts APIBetaPost`GET /v1/tiktok/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/tiktok/posts/index.md) · [YouTube Video APIBetaPost`GET /v1/youtube/post`1 credit](https://staging-fly.socialtap.dev/apis/youtube/post/index.md) · [YouTube Channel Videos APIBetaPost`GET /v1/youtube/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/youtube/posts/index.md)

More Instagram

## Instagram API. 4 endpoints, one key.

[Instagram Posts APIBetaPost`GET /v1/instagram/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/instagram/posts/index.md) · [Instagram Profile APIBetaProfile`GET /v1/instagram/profile`1 credit](https://staging-fly.socialtap.dev/apis/instagram/profile/index.md) · [Instagram Reels Transcript APIBetaTranscript`GET /v1/instagram/transcript`From 1 credit](https://staging-fly.socialtap.dev/apis/instagram/transcript/index.md)

## Start with 100 free credits. No card required.

Test keys answer every endpoint from recorded responses, free, so you can build before you spend. Failed requests are always free.

[Get your API key](https://staging-fly.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dinstagram.post) · [Read the API reference](https://staging-fly.socialtap.dev/docs/reference/instagram/post/index.md)

---

[HTML version](https://staging-fly.socialtap.dev/apis/instagram/post/) · [Docs index for AI agents](https://staging-fly.socialtap.dev/llms.txt) · [All docs in one file](https://staging-fly.socialtap.dev/llms-full.txt)
