# Instagram Profile API

Beta

Returns a public Instagram account: user ID, username, display name, bio, the links in its bio with their titles, profile picture, verification badge, whether the account is private, and exact follower, following and post counts, plus Instagram's own fields (Meta-wide ID, memorialized, live story, highlights, pronouns). Accepts a username with or without the @ or any instagram.com profile link.

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

- **Price**: From **1 credit** per request$0.75–$1.45 per 1,000 requests
- **Request**: `GET /v1/instagram/profile`One API key, one JSON schema
- **Input**: `handle`e.g. `natgeo`
- **Failed requests**: Free: 0 credits

Use cases

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

- Track creator and brand growth over time
- Vet influencers before a campaign
- Enrich CRM or lead lists with Instagram accounts and their bio links
- Resolve a post author to a full profile

What you get

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

- **`platform`string**: Platform ID (tiktok, youtube, …).
- **`id`string**: Platform-native account ID (string; YouTube UC…, Reddit without t2_).
- **`username`string**: Handle without the @; null when the account has none.
- **`display_name`string**: Display name, channel title or page name; null when empty or not exposed.
- **`url`string**: Canonical profile URL.
- **`type`string**: Coarse account kind, as the platform labels it; unknown when it does not (TikTok labels organizations only). New values may be added; treat unknown values as unknown.
- **`bio`string**: Profile bio, channel description or page about text; null when empty or not exposed.
- **`avatar_url`string**: Profile picture URL (largest available). Platform CDN URLs can expire within hours.

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

## Example request

cURL:

```shell
curl -G 'https://staging.socialtap.dev/v1/instagram/profile' \
  --data-urlencode 'handle=https://www.instagram.com/natgeo/' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
```

Node.js:

```javascript
const params = new URLSearchParams({
  handle: "https://www.instagram.com/natgeo/",
});
const res = await fetch(`https://staging.socialtap.dev/v1/instagram/profile?${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.socialtap.dev/v1/instagram/profile",
    params={"handle": "https://www.instagram.com/natgeo/"},
    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("handle", "https://www.instagram.com/natgeo/")
	req, err := http.NewRequest("GET", "https://staging.socialtap.dev/v1/instagram/profile?"+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": [],
    "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…",
    "banner_url": null,
    "bio": "Step into wonder and find your inner explorer with National Geographic 🌎",
    "category": null,
    "country_code": null,
    "created_at": null,
    "display_name": "National Geographic",
    "external_links": [
      {
        "title": null,
        "url": "http://visitstore.bio/natgeo"
      },
      {
        "title": "Subscribe Here!",
        "url": "https://ngmdomsubs.nationalgeographic.com/servlet/OrdersGateway?cds_mag_code=NGM&cds_page_id=283562&cds_response_key=I5FX10002"
      }
    ],
    "id": "787132",
    "is_private": false,
    "is_verified": true,
    "location": null,
    "metrics": {
      "follower_count": 268266804,
      "following_count": 195,
      "post_count": 32123,
      "total_like_count": null,
      "total_view_count": null
    },
    "platform": "instagram",
    "platform_specific": {
      "instagram": {
        "fbid": "17841400573960012",
        "is_highlights_shown": true,
        "is_memorialized": false,
        "is_story_live": true,
        "pronouns": []
      }
    },
    "type": "unknown",
    "unknown_fields": [],
    "url": "https://www.instagram.com/natgeo/",
    "username": "natgeo"
  },
  "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": "profile",
      "id": "787132",
      "url": "https://www.instagram.com/natgeo/"
    },
    "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**
>
> - Private accounts return their profile with is_private true: name, bio, links and counts as Instagram shows them logged out.
> - metrics.post_count is exact; on the rare answer where only a rounded count was available it is listed in approximate_fields.
> - category, location, country_code, created_at, banner_url, metrics.total_like_count and metrics.total_view_count are always null and type is unknown: Instagram does not show them to logged-out visitors. Business email and phone are not returned.
> - avatar_url is Instagram's 150-pixel profile picture, a CDN link that expires within days.
> - When the profile page is unavailable the answer comes from Instagram's embed page: bio and following count are then null, and external_links is \[\] listed in unknown_fields.
> - Unknown, deactivated and banned accounts answer not_found; restricted ones (age-restricted brands) private_or_unavailable. Numeric user IDs are not accepted: a bare number is read as a username.

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.socialtap.dev/pricing/index.md) · [How this endpoint is priced](https://staging.socialtap.dev/docs/reference/instagram/profile/index.md#pricing) · [How credits work](https://staging.socialtap.dev/docs/credits/index.md)

FAQ

## Questions, answered.

**How much does the Instagram Profile 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

## Profiles everywhere. One parser.

[TikTok Profile APIBetaProfile`GET /v1/tiktok/profile`1 credit](https://staging.socialtap.dev/apis/tiktok/profile/index.md) · [YouTube Channel APIBetaProfile`GET /v1/youtube/profile`1 credit](https://staging.socialtap.dev/apis/youtube/profile/index.md)

More Instagram

## Instagram API. 3 endpoints, one key.

[Instagram Post APIBetaPost`GET /v1/instagram/post`1 credit](https://staging.socialtap.dev/apis/instagram/post/index.md) · [Instagram Reels Transcript APIBetaTranscript`GET /v1/instagram/transcript`From 1 credit](https://staging.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.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dinstagram.profile) · [Read the API reference](https://staging.socialtap.dev/docs/reference/instagram/profile/index.md)

---

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