What replaced the Instagram Basic Display API?
Meta retired the Instagram Basic Display API in December 2024. For your own account, the replacement is the Instagram API with Instagram Login, which only works with professional (Business or Creator) accounts; personal accounts no longer have an API. To read other people's public profiles and posts, neither official option helps, and a public-data API like SocialAPIs (GET /instagram/profile/details, GET /instagram/profile/posts) is the usual route.
Meta's official option
If you need your own account's media, comments, insights or publishing: switch it to a professional account and use the Instagram API with Instagram Login (or with Facebook Login, for accounts linked to a Facebook Page).
How to do it with SocialAPIs
/instagram/profile/details returns a public profile's bio and counts by username (1 credit); /instagram/profile/posts returns its latest posts with display_url and permalink (1 credit).
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/profile/posts1 credit
Get posts from a user profile with pagination.
Params:
username,user_id,end_cursorInstagram Profile Posts: docs and playgroundMCP:
instagram_profile→posts
curl -G "https://api.socialapis.io/instagram/profile/posts" \
--max-time 100 \
--fail-with-body \
-H "x-api-token: $SOCIALAPIS_API_KEY" \
--data-urlencode "username=nasa"import os
import requests
response = requests.get(
"https://api.socialapis.io/instagram/profile/posts",
headers={"x-api-token": os.environ["SOCIALAPIS_API_KEY"]},
params={
"username": "nasa",
},
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/posts", {
username: "nasa",
});
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/posts", Map.of(
"username", "nasa"));
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/posts", url.Values{
"username": {"nasa"},
})
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_posts("nasa")
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.getProfilePosts("nasa");
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
- SocialAPIs reads public data only: it can't post, reply, or read insights or DMs for any account, including your own.
- Private accounts aren't available.