FastSocialFastSocial API

Instagram API docs

A read-only REST API for public Instagram data. Every endpoint is a GET request that returns JSON.

Base URL
https://data.fastsocial.co
Auth
X-API-Key: YOUR_API_KEY
Cost
0 to 3 credits per call. See credits.
Free plan
50 credits a month, 10 requests a minute.

Quickstart

Get a key on the API page, then make your first call.

curl "https://data.fastsocial.co/v1/profile?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/profile",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/profile");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
200 OK
{
  "ok": true,
  "data": {
    "id": "528817151",
    "username": "nasa",
    "full_name": "NASA",
    "biography": "Making the seemingly impossible, possible. ✨",
    "external_url": null,
    "bio_links": [
      "https://www.nasa.gov",
      "https://www.nasa.gov/maxpower"
    ],
    "followers": 104373201,
    "following": 90,
    "posts_count": 4968,
    "is_private": false,
    "is_verified": true,
    "is_business": false,
    "category": null,
    "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 23
  }
}
Get an API key docs.md openapi.json

Authentication

Send your key in a request header. Keys start with fsd_.

HeaderValue
X-API-KeyYOUR_API_KEY
AuthorizationBearer YOUR_API_KEY

The API reads keys from headers only. A key in the query string is ignored, and the call returns 401 missing_key.

Keep the key on your server. Any web page that holds it exposes it to visitors.

Responses

Every success has the same envelope:

{"ok": true, "data": { ... }, "meta": { ... }}
FieldTypeDescription
meta.cachestringhit, miss, stale or stale-ratelimited.
meta.age_secondsintegerAge of the data in seconds.
meta.stalebooleanWhether Instagram was unreachable and you got the last good copy.
meta.creditsintegerCredits this call used.
meta.credits_remainingintegerCredits left, including packs.

The same numbers come back as headers: X-Cache, X-Credits-Used and X-Credits-Remaining.

Timestamps such as taken_at are Unix seconds in UTC. Counts Instagram doesn't show are null.

Errors

Errors use HTTP status codes and a stable code string:

{
  "ok": false,
  "error": {
    "code": "rate_limited",
    "message": "Max 10 requests per minute on this plan.",
    "retry_after": 42
  }
}

Only 404 not_found and 422 private_account use credits, because they answer the question. Every other error is free.

StatusCodeWhenCharged
400invalid_usernameusername is not 1-30 letters, digits, . or _.No
400invalid_user_iduser_id is not a numeric ID.No
400missing_userNeither username nor user_id was sent.No
400invalid_posturl is not a post, reel or IGTV link, or shortcode is malformed.No
400invalid_idid or comment_id is missing or not numeric.No
400invalid_cursorcursor did not come from a previous page of the same request.No
400invalid_queryq is empty or longer than 80 characters.No
400invalid_tagtag has spaces or characters a hashtag can't have.No
400invalid_paramA /v1/top filter has a value it doesn't accept. The message lists the valid ones.No
401missing_keyNo key in X-API-Key or Authorization.No
401invalid_keyThe key is wrong or disabled.No
401invalid_tokenAn MCP sign-in token expired or was revoked. Reconnect the app.No
404not_foundThe account, post, location or audio doesn't exist or isn't public.Yes
404no_such_endpointThe path doesn't exist.No
405method_not_allowedThe method isn't GET.No
422private_accountThe account is private, so the endpoint has nothing to return.Yes
422not_enough_history/v1/top doesn't have enough days yet for that window.No
429rate_limitedOver the per-minute limit. Retry after Retry-After seconds.No
429quota_exceededNo credits left this month. The body adds plan and upgrade_url.No
429fair_use_limitThe plan's fair-use share for heavy endpoints is used up.No
451opted_outThe account owner asked to be excluded.No
500internalUnexpected error on our side.No
502upstream_errorInstagram didn't respond. Retry shortly.No
503capacityThis endpoint's data capacity for the month is used up.No
503unavailableThe endpoint is switched off, or Top Charts is updating.No
503maintenanceThe API is paused for maintenance.No

Credits and plans

Each call costs the credits shown on its endpoint. Plan credits reset at 00:00 UTC on the 1st of each month.

PlanPriceCredits / monthRequests / minuteFair-use share
Free$0 / month5010No cap
Starter$5 / month5,000301,000
Pro$15 / month20,000604,000
Ultra$50 / month70,00012014,000
Insanity$150 / month225,00018045,000
  • Fair use. On paid plans, endpoints marked fair-use can spend up to the share above. Past it they return 429 fair_use_limit; the rest keep working.
  • Credit packs. 5,000 credits for $6, 20,000 credits for $19, 65,000 credits for $59. Packs last 365 days and are spent after the month's plan credits. Buy credits.
  • No overage. When credits run out, calls return 429 quota_exceeded until the 1st or until you add credits.
  • Balance. GET /v1/usage returns your balance for free.

Rate limits

Limits are per key, per minute, and depend on the plan (table above).

  • Over the limit, a request with a cached answer still returns 200, free, with meta.cache: "stale-ratelimited".
  • With nothing cached, or past 3 times the limit, you get 429 rate_limited and a Retry-After header in seconds.
  • More than 30 failed key checks a minute from one IP address also return 429.

Pagination

Paged endpoints return next_cursor. Send it back as cursor, with the same other parameters, for the next page.

When next_cursor is null, there are no more pages. A cursor from a different request returns 400 invalid_cursor.

Paged: /v1/posts, /v1/reels, /v1/tagged, /v1/comment-replies, /v1/followers, /v1/following, /v1/hashtag, /v1/place-posts, /v1/reels-search. /v1/top pages with limit and offset.

Data freshness

Answers are cached for a short time. meta.age_seconds tells you how old each one is.

DataMaximum age
Anything with counts: followers, likes, views, comments5 minutes
Stories15 minutes
Highlights12 hours
Locations24 hours
Accounts and posts that don't exist6 hours

If Instagram doesn't respond, you get the last good copy with meta.stale: true. Counts are never older than 5 minutes, even then.

AI apps (MCP)

The same data is an MCP server at https://data.fastsocial.co/mcp. Add it to your app and sign in once in the browser; there is no key to paste.

AppSetup
Claude Codeclaude mcp add --transport http instagram-data https://data.fastsocial.co/mcp
ClaudeSettings, Connectors, Add custom connector. Paste the URL and sign in.
ChatGPTSettings, Connectors. Turn on developer mode under Advanced, create a connector with the URL and sign in.
Cursor~/.cursor/mcp.json: {"mcpServers": {"instagram-data": {"url": "https://data.fastsocial.co/mcp"}}}
VS Code.vscode/mcp.json: {"servers": {"instagram-data": {"type": "http", "url": "https://data.fastsocial.co/mcp"}}}

Tool names are instagram_ plus the endpoint, such as instagram_profile. Each tool costs the same as its endpoint; instagram_top_accounts and instagram_usage are free.

Profiles

Get a profile

GET/v1/profile| 1 credit

Returns follower, following and post counts, bio, links, category, verification and avatar URL.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
Cases
CaseStatusCredits
Private account200, is_private: true1
Account doesn't exist404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/profile?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/profile",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/profile");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "id": "528817151",
    "username": "nasa",
    "full_name": "NASA",
    "biography": "Making the seemingly impossible, possible. ✨",
    "external_url": null,
    "bio_links": [
      "https://www.nasa.gov",
      "https://www.nasa.gov/maxpower"
    ],
    "followers": 104373201,
    "following": 90,
    "posts_count": 4968,
    "is_private": false,
    "is_verified": true,
    "is_business": false,
    "category": null,
    "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 23
  }
}

Convert a username to an ID

GET/v1/user-id| 1 credit

Returns the numeric user ID for a handle.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
  • Most endpoints take user_id directly. check, insights, stories and highlights take username only.
Cases
CaseStatusCredits
Account doesn't exist404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/user-id?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/user-id",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/user-id");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "id": "528817151",
    "username": "nasa"
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 99,
    "stale": false,
    "credits": 1,
    "credits_remaining": 4
  }
}

Convert an ID to a username

GET/v1/username| 2 credits|fair-use

Returns the current handle for a user ID.

Query parameters
NameRequiredDescription
user_idstring RequiredNumeric Instagram user ID. id is accepted too.
  • Use it to follow an account after it renames itself.
Cases
CaseStatusCredits
No account with that ID404 not_found2
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/username?user_id=528817151" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/username",
    params={"user_id": "528817151"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/username");
url.search = new URLSearchParams({ user_id: "528817151" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "id": "528817151",
    "username": "nasa"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 2,
    "credits_remaining": 2
  }
}

Check a handle

GET/v1/check| 1 credit

Returns whether a handle exists and is public.

Query parameters
NameRequiredDescription
usernamestring RequiredInstagram handle, with or without @. A profile URL also works.
  • state is one of ok, not_found, private, deactivated, memorialized, age_restricted, restricted_minor.
  • Exact matches only, so a typo never resolves to another account.
Cases
CaseStatusCredits
Handle doesn't exist200, exists: false1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/check?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/check",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/check");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "exists": true,
    "state": "ok",
    "public": true,
    "followers": 104373201,
    "is_verified": true
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 26,
    "stale": false,
    "credits": 1,
    "credits_remaining": 18
  }
}

Posts & reels

List posts

GET/v1/posts| 1 credit|paged|fair-use

Returns 12 posts per page with counts, caption and media URLs.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
  • Pinned posts come first, with pinned: true. The rest are newest first.
Cases
CaseStatusCredits
Private account200, empty posts, is_private: true1
Account doesn't exist404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/posts?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/posts",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/posts");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "posts": [
      {
        "shortcode": "DeTUk4sDSp-",
        "url": "https://www.instagram.com/p/DeTUk4sDSp-/",
        "taken_at": 1791645302,
        "format": "reel",
        "likes": 715212,
        "comments": 7117,
        "views": 3105489,
        "caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images…",
        "image_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4?…",
        "pinned": true,
        "owner_username": "nasa",
        "owner_id": "528817151"
      },
      {
        "shortcode": "DesCOtRjETH",
        "url": "https://www.instagram.com/p/DesCOtRjETH/",
        "taken_at": 1792438960,
        "format": "image",
        "likes": 151349,
        "comments": 760,
        "views": null,
        "caption": "Night lights 💡\n\nIn this photo, taken from the @ISS…",
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg?…",
        "video_url": null,
        "pinned": false,
        "owner_username": "nasa",
        "owner_id": "528817151"
      }
    ],
    "next_cursor": "YTpRVkZFVEcxRWFGTkdiMnh3…x9sSxuFZG1Bf6JXbW2BKuA"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 22
  }
}

List reels

GET/v1/reels| 1 credit|paged|fair-use

Returns the account's reels tab with play counts, likes, comments and video URLs.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
Cases
CaseStatusCredits
Account doesn't exist404 not_found1
Private account422 private_account1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/reels?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/reels",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/reels");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "posts": [
      {
        "shortcode": "DeTUk4sDSp-",
        "url": "https://www.instagram.com/p/DeTUk4sDSp-/",
        "taken_at": 1791645302,
        "format": "reel",
        "likes": 715215,
        "comments": 7117,
        "views": 10427133,
        "caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images…",
        "image_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4?…",
        "pinned": true,
        "owner_username": "nasa",
        "owner_id": "528817151"
      }
    ],
    "next_cursor": "YTpRVkZEYlhaa2JrTmtaakpN…s_KgEbWv3X0eUhk7fkhU4g"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 5
  }
}

List tagged posts

GET/v1/tagged| 1 credit|paged|fair-use

Returns public posts by other accounts that tag this account.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
Cases
CaseStatusCredits
Account doesn't exist404 not_found1
Private account422 private_account1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/tagged?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/tagged",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/tagged");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "posts": [
      {
        "shortcode": "C8x1abcDEF0",
        "url": "https://www.instagram.com/p/C8x1abcDEF0/",
        "taken_at": 1758600000,
        "format": "reel",
        "likes": 412000,
        "comments": 1900,
        "views": 5400000,
        "caption": "Sunrise over the Pacific, seen from the station.",
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4",
        "pinned": false,
        "owner_username": "nasa",
        "owner_id": "528817151"
      }
    ],
    "next_cursor": "QVFE…",
    "is_private": false
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 1,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

Get a post

GET/v1/post| 1 credit

Returns counts, caption, owner and media URLs for one post, reel or IGTV video.

Query parameters
NameRequiredDescription
urlstring One ofPost, reel or IGTV URL.
shortcodestring One ofCode from the post URL: instagram.com/p/{shortcode}/.
  • owner_id is the owner's user ID, the same id that /v1/profile returns.
Cases
CaseStatusCredits
Post deleted, missing or private404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/post?shortcode=DeTUk4sDSp-" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/post",
    params={"shortcode": "DeTUk4sDSp-"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/post");
url.search = new URLSearchParams({ shortcode: "DeTUk4sDSp-" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "shortcode": "DeTUk4sDSp-",
    "url": "https://www.instagram.com/p/DeTUk4sDSp-/",
    "taken_at": 1791645302,
    "format": "reel",
    "likes": 715212,
    "comments": 7117,
    "views": 10426997,
    "caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images…",
    "image_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
    "video_url": "https://scontent.cdninstagram.com/…/clip.mp4?…",
    "pinned": false,
    "owner_username": "nasa",
    "owner_id": "528817151"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 21
  }
}

Get media files

GET/v1/media| 1 credit

Returns direct image and video URLs for every slide, in the best quality available.

Query parameters
NameRequiredDescription
urlstring One ofPost, reel or IGTV URL.
shortcodestring One ofCode from the post URL: instagram.com/p/{shortcode}/.
  • URLs are signed Instagram CDN links. They expire after a few hours.
Cases
CaseStatusCredits
Post deleted, missing or private404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/media?shortcode=DeAYvsnn4la" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/media",
    params={"shortcode": "DeAYvsnn4la"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/media");
url.search = new URLSearchParams({ shortcode: "DeAYvsnn4la" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "shortcode": "DeAYvsnn4la",
    "owner_username": "nasa",
    "files": [
      {
        "type": "image",
        "url": "https://scontent.cdninstagram.com/…/slide1.jpg?…",
        "thumbnail_url": null
      },
      {
        "type": "image",
        "url": "https://scontent.cdninstagram.com/…/slide2.jpg?…",
        "thumbnail_url": null
      }
    ]
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 12
  }
}

Engagement

List comments

GET/v1/comments| 3 credits

Returns one page of comments with author, text, time, likes and reply count, plus the total.

Query parameters
NameRequiredDescription
urlstring One ofPost, reel or IGTV URL.
shortcodestring One ofCode from the post URL: instagram.com/p/{shortcode}/.
  • Newest first. No cursor: one page per call. replies can be null.
Cases
CaseStatusCredits
Post deleted, missing or private404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/comments?shortcode=DeTUk4sDSp-" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/comments",
    params={"shortcode": "DeTUk4sDSp-"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/comments");
url.search = new URLSearchParams({ shortcode: "DeTUk4sDSp-" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "shortcode": "DeTUk4sDSp-",
    "total": 7117,
    "comments": [
      {
        "id": "17956804323270146",
        "text": "Paz 🕊️ e amor ❤️",
        "created_at": 1792470219,
        "likes": 1,
        "replies": null,
        "user": {
          "id": "36190672589",
          "username": "joaogabriel872026",
          "full_name": "",
          "is_private": false,
          "is_verified": false,
          "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
        }
      }
    ]
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 3,
    "credits_remaining": 13
  }
}

List comment replies

GET/v1/comment-replies| 3 credits|paged|fair-use

Returns replies under one comment.

Query parameters
NameRequiredDescription
urlstring One ofPost, reel or IGTV URL.
shortcodestring One ofCode from the post URL: instagram.com/p/{shortcode}/.
comment_idstring RequiredNumeric comment ID from /v1/comments.
cursorstring Optionalnext_cursor from the previous page of the same request.
Cases
CaseStatusCredits
Post deleted, missing or private404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/comment-replies?url=https://www.instagram.com/reel/DdhFkS7KGkZ/&comment_id=17935912383123296" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/comment-replies",
    params={"url": "https://www.instagram.com/reel/DdhFkS7KGkZ/", "comment_id": "17935912383123296"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/comment-replies");
url.search = new URLSearchParams({ url: "https://www.instagram.com/reel/DdhFkS7KGkZ/", comment_id: "17935912383123296" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "shortcode": "C8x1abcDEF0",
    "comment_id": "…",
    "comments": 1900,
    "next_cursor": "QVFE…"
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

List likers

GET/v1/likers| 3 credits|fair-use

Returns a sample of accounts that liked a post, plus the total like count.

Query parameters
NameRequiredDescription
urlstring One ofPost, reel or IGTV URL.
shortcodestring One ofCode from the post URL: instagram.com/p/{shortcode}/.
  • One page, no cursor. It is not the full list of likers.
Cases
CaseStatusCredits
Post deleted, missing or private404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/likers?url=https://www.instagram.com/reel/DdhFkS7KGkZ/" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/likers",
    params={"url": "https://www.instagram.com/reel/DdhFkS7KGkZ/"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/likers");
url.search = new URLSearchParams({ url: "https://www.instagram.com/reel/DdhFkS7KGkZ/" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "total": 581,
    "users": [
      {
        "id": "528817151",
        "username": "nasa",
        "full_name": "NASA",
        "is_private": false,
        "is_verified": true,
        "avatar_url": "https://scontent.cdninstagram.com/…/avatar.jpg"
      }
    ],
    "next_cursor": "QVFE…"
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

Get engagement insights

GET/v1/insights| 2 credits|fair-use

Returns engagement rate (mean and median), posts per week, format mix and best posting hours.

Query parameters
NameRequiredDescription
usernamestring RequiredInstagram handle, with or without @. A profile URL also works.
  • Built from the latest 12 posts, pinned posts excluded, so sample_size can be lower than 12.
  • confidence is good, low or insufficient. benchmark_percentile is null when no benchmark covers the account.
Cases
CaseStatusCredits
Account doesn't exist404 not_found2
Private account422 private_account2
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/insights?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/insights",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/insights");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "followers": 104373201,
    "follower_bucket": "1m+",
    "sample_size": 8,
    "confidence": "low",
    "avg_likes": 489667.5,
    "avg_comments": 1953,
    "engagement_rate_pct": 0.471,
    "engagement_rate_median_pct": 0.275,
    "posts_per_week": 4.82,
    "format_share": {
      "image": 0.75,
      "carousel": 0.125,
      "reel": 0.125
    },
    "best_hours_utc": [
      {
        "hour_utc": 19,
        "posts": 3,
        "score": 1.23
      },
      {
        "hour_utc": 16,
        "posts": 1,
        "score": 1.02
      },
      {
        "hour_utc": 14,
        "posts": 2,
        "score": 0.86
      }
    ],
    "last_post_at": 1792438960,
    "benchmark_percentile": null,
    "benchmark_month": null
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 4,
    "stale": false,
    "credits": 2,
    "credits_remaining": 19
  }
}

Network

List followers

GET/v1/followers| 3 credits|paged|fair-use

Returns one page of accounts that follow a public account, plus the follower total.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
  • When next_cursor is null, no further pages are available.
Cases
CaseStatusCredits
Account doesn't exist404 not_found3
Private account422 private_account3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/followers?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/followers",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/followers");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "total": 104372632,
    "users": [
      {
        "id": "58824308498",
        "username": "stackedsky",
        "full_name": "alec",
        "is_private": false,
        "is_verified": false,
        "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
      },
      {
        "id": "66024340570",
        "username": "sh.nab_",
        "full_name": "",
        "is_private": true,
        "is_verified": false,
        "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
      }
    ],
    "next_cursor": null
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 3,
    "credits_remaining": 9
  }
}

List following

GET/v1/following| 3 credits|paged|fair-use

Returns one page of accounts a public account follows, plus the total.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
  • When next_cursor is null, no further pages are available.
Cases
CaseStatusCredits
Account doesn't exist404 not_found3
Private account422 private_account3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/following?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/following",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/following");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "total": 581,
    "users": [
      {
        "id": "528817151",
        "username": "nasa",
        "full_name": "NASA",
        "is_private": false,
        "is_verified": true,
        "avatar_url": "https://scontent.cdninstagram.com/…/avatar.jpg"
      }
    ],
    "next_cursor": "QVFE…"
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

List similar accounts

GET/v1/similar| 1 credit|fair-use

Returns accounts Instagram treats as related to this one.

Query parameters
NameRequiredDescription
usernamestring One ofInstagram handle, with or without @. A profile URL also works.
user_idstring One ofNumeric Instagram user ID.
Cases
CaseStatusCredits
Account doesn't exist404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/similar?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/similar",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/similar");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "user_id": "528817151",
    "users": [
      {
        "id": "1029649300",
        "username": "natgeoanimals",
        "full_name": "National Geographic Animals",
        "is_private": false,
        "is_verified": true,
        "avatar_url": "https://scontent.cdninstagram.com/v/t51.2885-19/…/avatar.jpg?…"
      }
    ]
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 1
  }
}

Stories & highlights

List stories

GET/v1/stories| 3 credits|fair-use

Returns stories from the last 24 hours with image and video URLs.

Query parameters
NameRequiredDescription
usernamestring RequiredInstagram handle, with or without @. A profile URL also works.
  • URLs are signed CDN links that expire after a few hours.
Cases
CaseStatusCredits
Account doesn't exist404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/stories?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/stories",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/stories");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "username": "nasa",
    "count": 3,
    "stories": [
      {
        "id": "3474581261890123456",
        "is_video": false,
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4",
        "taken_at": 1758600000,
        "expires_at": 1758686400,
        "width": 1080,
        "height": 1920
      }
    ]
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

List highlights

GET/v1/highlights| 3 credits

Returns the title, cover and item count of each highlight.

Query parameters
NameRequiredDescription
usernamestring RequiredInstagram handle, with or without @. A profile URL also works.
  • Pass an id to /v1/highlight for its items. item_count can be null.
Cases
CaseStatusCredits
Account doesn't exist404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/highlights?username=nasa" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/highlights",
    params={"username": "nasa"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/highlights");
url.search = new URLSearchParams({ username: "nasa" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "username": "nasa",
    "count": 5,
    "highlights": [
      {
        "id": "highlight:18195781759377100",
        "title": "Roman",
        "cover_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
        "item_count": null
      },
      {
        "id": "highlight:18131565715482962",
        "title": "Artemis II",
        "cover_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
        "item_count": null
      }
    ]
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 3,
    "credits_remaining": 6
  }
}

Get a highlight

GET/v1/highlight| 3 credits|fair-use

Returns every photo and video in one highlight, with signed CDN URLs.

Query parameters
NameRequiredDescription
idstring RequiredHighlight ID from /v1/highlights, with or without the highlight: prefix.
Cases
CaseStatusCredits
Another highlight of the same account within 15 minutes2000
Unknown ID404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/highlight?id=highlight:17960293069066406" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/highlight",
    params={"id": "highlight:17960293069066406"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/highlight");
url.search = new URLSearchParams({ id: "highlight:17960293069066406" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "id": "highlight:17960293069066406",
    "count": 3,
    "items": [
      {
        "id": "3474581261890123456",
        "is_video": false,
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4",
        "taken_at": 1758600000,
        "expires_at": 1758686400,
        "width": 1080,
        "height": 1920
      }
    ]
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

Discovery

List hashtag posts

GET/v1/hashtag| 1 credit|paged|fair-use

Returns recent posts under a hashtag and its total post count.

Query parameters
NameRequiredDescription
tagstring RequiredHashtag, with or without #. Letters, digits and _, up to 100.
cursorstring Optionalnext_cursor from the previous page of the same request.
  • owner_username can be null here; owner_id is set.
Cases
CaseStatusCredits
Hashtag not found404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/hashtag?tag=space" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/hashtag",
    params={"tag": "space"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/hashtag");
url.search = new URLSearchParams({ tag: "space" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "tag": "space",
    "hashtag": {
      "id": "17843804908006812",
      "name": "space",
      "media_count": 25259553
    },
    "posts": [
      {
        "shortcode": "DeuAi8tN1s9",
        "url": "https://www.instagram.com/p/DeuAi8tN1s9/",
        "taken_at": 1792505379,
        "format": "image",
        "likes": 1,
        "comments": 0,
        "views": null,
        "caption": "The Sailboat Cluster (NGC 225) and surrounding dust…",
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg?…",
        "video_url": null,
        "pinned": false,
        "owner_username": null,
        "owner_id": "369923529"
      }
    ],
    "next_cursor": "YTpRVkZDY25GTmNUWnBO…6dIHxl9Si_fRf6-LEiV2ZQ"
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 16
  }
}

Get a location

GET/v1/place| 3 credits

Returns name, category, address, coordinates, phone, website and post count of a location.

Query parameters
NameRequiredDescription
idstring RequiredNumeric location ID. Find one with /v1/search.
Cases
CaseStatusCredits
Unknown ID404 not_found3
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/place?id=311693088" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/place",
    params={"id": "311693088"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/place");
url.search = new URLSearchParams({ id: "311693088" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "id": "311693088",
    "name": "NASA Johnson Space Center",
    "category": "Government organization",
    "address": "2101 E NASA Pkwy",
    "city": "Houston, TX",
    "zip": "77058",
    "lat": 29.5519,
    "lng": -95.0981,
    "phone": "+1 281-483-0123",
    "website": "https://www.nasa.gov",
    "media_count": 28604
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 3,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

List location posts

GET/v1/place-posts| 1 credit|paged

Returns recent posts geotagged at a location.

Query parameters
NameRequiredDescription
idstring RequiredNumeric location ID.
cursorstring Optionalnext_cursor from the previous page of the same request.
Cases
CaseStatusCredits
Unknown ID404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/place-posts?id=311693088" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/place-posts",
    params={"id": "311693088"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/place-posts");
url.search = new URLSearchParams({ id: "311693088" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK (example values)
{
  "ok": true,
  "data": {
    "place_id": "311693088",
    "posts": [
      {
        "shortcode": "C8x1abcDEF0",
        "url": "https://www.instagram.com/p/C8x1abcDEF0/",
        "taken_at": 1758600000,
        "format": "reel",
        "likes": 412000,
        "comments": 1900,
        "views": 5400000,
        "caption": "Sunrise over the Pacific, seen from the station.",
        "image_url": "https://scontent.cdninstagram.com/…/1080.jpg",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4",
        "pinned": false,
        "owner_username": "nasa",
        "owner_id": "528817151"
      }
    ],
    "next_cursor": "QVFE…"
  },
  "meta": {
    "cache": "hit",
    "age_seconds": 212,
    "stale": false,
    "credits": 1,
    "credits_remaining": 4812,
    "retry_after": 0
  }
}

Get an audio track

GET/v1/audio| 1 credit|fair-use

Returns title, artist, duration and preview URL of a song or original sound, plus reels that use it.

Query parameters
NameRequiredDescription
idstring RequiredNumeric audio ID, from a reel or /v1/audio-search.
Cases
CaseStatusCredits
Unknown ID404 not_found1
Any other error4xx or 5xx0
Request
curl "https://data.fastsocial.co/v1/audio?id=28784844067777520" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/audio",
    params={"id": "28784844067777520"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/audio");
url.search = new URLSearchParams({ id: "28784844067777520" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "audio": {
      "id": "28784844067777520",
      "title": "Original audio",
      "artist": "ravens",
      "duration_ms": 23000,
      "is_original": true,
      "is_explicit": false,
      "cover_url": null,
      "audio_url": "https://scontent.cdninstagram.com/…/audio.mp4?…"
    },
    "posts": [
      {
        "shortcode": "DdhFkS7KGkZ",
        "url": "https://www.instagram.com/p/DdhFkS7KGkZ/",
        "taken_at": 1789924800,
        "format": "reel",
        "likes": 49423,
        "comments": 618,
        "views": 7456668,
        "caption": "Our first Leader of the Uprising 🔥…",
        "image_url": "https://scontent.cdninstagram.com/…/cover.jpg?…",
        "video_url": "https://scontent.cdninstagram.com/…/clip.mp4?…",
        "pinned": false,
        "owner_username": "ravens",
        "owner_id": "231432514"
      }
    ]
  },
  "meta": {
    "cache": "miss",
    "age_seconds": 0,
    "stale": false,
    "credits": 1,
    "credits_remaining": 0
  }
}

Top charts

List top accounts

GET/v1/top| Free

Returns the most-followed Instagram accounts, ranked daily, with 1, 7 and 30-day follower changes.

Query parameters
NameRequiredDescription
sortstring Optionalfollowers, gainers, losers or milestones. Defaults to followers.
windowinteger Optional1, 7 or 30 days, for gainers and losers. Defaults to 7 when available.
countrystring OptionalTwo-letter country code, such as US or BR.
categorystring Optionalsports, music, film_tv, creators, fashion_beauty, brands, media, public_figures or other.
limitinteger OptionalAccounts per page, 1-100. Defaults to 50.
offsetinteger OptionalAccounts to skip, up to 5,000. Defaults to 0.
  • Same data as Instagram Top Charts. Licensed CC BY 4.0: credit FastSocial and link the source.
  • Pages with limit and offset, not a cursor.
Request
curl "https://data.fastsocial.co/v1/top?limit=2" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/top",
    params={"limit": "2"},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/top");
url.search = new URLSearchParams({ limit: "2" });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "sort": "followers",
    "window_days": 7,
    "country": null,
    "category": null,
    "total": 2000,
    "offset": 0,
    "limit": 2,
    "accounts": [
      {
        "rank": 1,
        "username": "instagram",
        "name": "Instagram",
        "followers": 686552402,
        "change_1d": 0,
        "change_7d": -48107,
        "change_30d": -169280,
        "country": "US",
        "category": "brands",
        "is_verified": true,
        "engagement_rate": 0.000617,
        "next_milestone": 700000000,
        "milestone_projected": null
      },
      {
        "rank": 2,
        "username": "cristiano",
        "name": "Cristiano Ronaldo",
        "followers": 679966924,
        "change_1d": 0,
        "change_7d": -224150,
        "change_30d": 521622,
        "country": "PT",
        "category": "sports",
        "is_verified": true,
        "engagement_rate": 0.009951,
        "next_milestone": 700000000,
        "milestone_projected": null
      }
    ],
    "updated_at": "2026-10-20T12:27:03+00:00",
    "day": "2026-10-20",
    "tracking_since": "2026-09-25",
    "windows_available": [
      1,
      7,
      30
    ],
    "source": "https://fastsocial.co/most-followed-instagram-accounts",
    "license": "CC BY 4.0: credit FastSocial and link to the source URL"
  },
  "meta": {
    "cache": "hit",
    "credits": 0
  }
}

Account

Get usage

GET/v1/usage| Free

Returns your plan, credits used and credits left this month.

No parameters.

  • pack_credits appears when you hold unused credit packs. The response has no meta block.
Request
curl "https://data.fastsocial.co/v1/usage" \
  -H "X-API-Key: $FASTSOCIAL_API_KEY"
import os
import requests

r = requests.get(
    "https://data.fastsocial.co/v1/usage",
    params={},
    headers={"X-API-Key": os.environ["FASTSOCIAL_API_KEY"]},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"])
// Node 18+ (built-in fetch). Run as an ES module: node app.mjs
const url = new URL("https://data.fastsocial.co/v1/usage");
url.search = new URLSearchParams({  });

const res = await fetch(url, { headers: { "X-API-Key": process.env.FASTSOCIAL_API_KEY } });
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.code);
console.log(data);
Response
200 OK
{
  "ok": true,
  "data": {
    "plan": "free",
    "month": "2026-10",
    "credits_used": 26,
    "calls": 16,
    "credits_limit": 50,
    "credits_remaining": 24
  }
}

Use policy

Public data only. Don't use the API to track or harass people, to spam them, to resell their data, or to collect data about minors.

Account owners can opt out; after that the API returns 451 opted_out for that account.

We log what data was pulled and the result, but we never store who pulled it. We work with data, and data pulled by others helps our operations.