Is there an API for public Instagram profiles without the Instagram Graph API?
Yes. SocialAPIs' GET /instagram/profile/details returns a public Instagram profile's bio, follower and following counts, post count, category and verification by username, with one API key: no Meta app, no Instagram professional account of your own, no app review. Private profiles aren't available.
Meta's official option
Meta's Instagram API can read another account through Business Discovery, but only Business and Creator accounts, and only from your own Instagram professional account connected to a Meta app with the right permissions. Personal accounts can't be read through it.
How to do it with SocialAPIs
Pass the handle without the @ as username, or the profile URL as link. Each call costs 1 credit. For the account's IDs, /instagram/user/id returns both the long user_id (for posts and reels) and the pk (for highlights).
Endpoints
GET /instagram/profile/details1 credit
Get user profile information by username including bio, followers, posts count, and related profiles.
Params:
username(required),linkInstagram Profile Details: docs and playgroundMCP:
instagram_profile→detailsGET /instagram/user/id1 credit
Get the unique ID of any Instagram profile from link or username.
Params:
link,usernameInstagram User ID: docs and playgroundMCP:
instagram_profile→id
curl -G "https://api.socialapis.io/instagram/profile/details" \
--max-time 100 \
--fail-with-body \
-H "x-api-token: $SOCIALAPIS_API_KEY" \
--data-urlencode "username=instagram"import os
import requests
response = requests.get(
"https://api.socialapis.io/instagram/profile/details",
headers={"x-api-token": os.environ["SOCIALAPIS_API_KEY"]},
params={
"username": "instagram",
},
timeout=100,
)
response.raise_for_status()
print(response.json())// Node 18+, as an ES module (e.g. main.mjs)
async function get(url, params) {
const query = new URLSearchParams(params).toString();
const response = await fetch(query ? `${url}?${query}` : url, {
headers: { "x-api-token": process.env.SOCIALAPIS_API_KEY },
signal: AbortSignal.timeout(100000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
return response.json();
}
const data = await get("https://api.socialapis.io/instagram/profile/details", {
username: "instagram",
});
console.log(data);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
private static final HttpClient CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
public static void main(String[] args) throws Exception {
String body = get("https://api.socialapis.io/instagram/profile/details", Map.of(
"username", "instagram"));
System.out.println(body);
}
static String get(String url, Map<String, String> params) throws Exception {
String query = params.entrySet().stream()
.map(e -> URLEncoder.encode(e.getKey(), StandardCharsets.UTF_8) + "="
+ URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
.collect(Collectors.joining("&"));
HttpRequest request = HttpRequest.newBuilder(URI.create(query.isEmpty() ? url : url + "?" + query))
.header("x-api-token", System.getenv("SOCIALAPIS_API_KEY"))
.timeout(Duration.ofSeconds(100))
.GET()
.build();
HttpResponse<String> response = CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() / 100 != 2) {
throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body());
}
return response.body();
}
}package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
"os"
"time"
)
func main() {
body, err := get("https://api.socialapis.io/instagram/profile/details", url.Values{
"username": {"instagram"},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
func get(endpoint string, params url.Values) ([]byte, error) {
if len(params) > 0 {
endpoint += "?" + params.Encode()
}
req, err := http.NewRequest(http.MethodGet, endpoint, nil)
if err != nil {
return nil, err
}
req.Header.Set("x-api-token", os.Getenv("SOCIALAPIS_API_KEY"))
client := &http.Client{Timeout: 100 * time.Second}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if resp.StatusCode/100 != 2 {
return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, body)
}
return body, nil
}# pip install socialapis-sdk
import os
from socialapis import Instagram
client = Instagram(api_token=os.environ["SOCIALAPIS_API_KEY"])
response = client.get_profile_details("instagram")
print(response)// npm install socialapis-sdk
import { Instagram } from "socialapis-sdk";
const client = new Instagram({ apiToken: process.env.SOCIALAPIS_API_KEY });
const response = await client.getProfileDetails("instagram");
console.log(response);Your API key goes in the x-api-token header (here from the SOCIALAPIS_API_KEY environment variable). Get a free key.
Good to know
- Any public profile works, whether it's a personal, business or creator account.
- No private accounts, no DMs, no insights of accounts you don't own, no posting.
- AI assistants can call it through the MCP server's
instagram_profiletool (actiondetails).