Guide · Social media APIs for developers

Instagram API in 2026: the Graph API after Basic Display, pricing, limits and a Python example

By Antoine Blanco··8 min read

Yes, Instagram has an API, but only for professional accounts: the Basic Display API that read personal accounts stopped working on December 4, 2024. What's left is the Instagram Graph API, through Instagram Login or Facebook Login. Meta lists no fee. The limits: 100 published posts and 4,800 calls per impression, both per 24 hours. Checked September 24, 2026.

Does Instagram have an API?

Until 2024 there were two. The Basic Display API, launched in 2019, was "designed to support consumer use cases for individuals with personal accounts", in Meta's own words: it read profile and media information. The Graph API served business accounts.

On September 4, 2024, Meta announced the end of Basic Display: from December 4, 2024, "all Instagram Basic Display API requests will fail". The same post pointed developers to two setups, the newly launched Instagram API with Instagram Login and the Instagram API with Facebook Login.

Both are what people call the Instagram Graph API today, and both require a professional account, business or creator. There is no official API for personal accounts anymore.

Instagram Graph API: Instagram Login or Facebook Login

The choice of login decides what you can build. From Meta's Instagram Platform overview, read on September 24, 2026:

Instagram Login Facebook Login
Host graph.instagram.com graph.facebook.com
Facebook Page required No Yes, linked to the account
Token Instagram User token Facebook User or Page token
Content publishing Yes Yes
Comment moderation Yes Yes
Messaging Yes Through the Messenger Platform
Insights and mentions Yes Yes
Hashtag search No Yes
Product tagging No Yes
Partnership ads No Yes
Publishing permissions instagram_business_basic, instagram_business_content_publish instagram_basic, instagram_content_publish, pages_read_engagement

Take Instagram Login when you work on the account's own content: publishing, comments, DMs, insights. It needs no Facebook Page, and it is the setup PlugKit uses. Meta sums up its limit in one line: "This API setup cannot access ads or tagging." Take Facebook Login when you need hashtag search, product tags, partnership ads, or "basic metadata and metrics about other Instagram Businesses and Creators".

Access levels, App Review and tokens

Your Meta app must be a Business type app. Then two access levels:

A short-lived token lasts one hour; a long-lived one lasts 60 days and can be refreshed before it expires. For a first test, the App Dashboard generates one: Instagram, API setup with Instagram business login, then Generate token next to your account.

One trap is easy to miss. GET /me?fields=user_id,username returns two IDs. id is app-scoped; user_id is the Instagram professional account ID, the one every publishing endpoint expects.

Instagram API pricing

Meta publishes no price for the Instagram API. None of the pages I read on September 24, 2026, the overview, content publishing, rate limiting and insights, mentions a fee. That is not true everywhere: X bills each call, and PlugKit passes that through at cost, $0.005 to read a post and $0.015 to publish one, per its billing docs.

On Instagram, you pay in work instead:

Cost Build on the Graph API Go through PlugKit
Per-call fee None listed by Meta None for Instagram; X is the only metered platform
Subscription $0 $29 a month for 5 accounts, $97 for 30
Other people's accounts App Review and Business Verification They connect through PlugKit's OAuth link
Token refresh Your code, before day 60 PlugKit stores a long-lived token
Queue, retries, webhooks Your code Included

Instagram API rate limits

Limit Value Meta source
Platform calls, messaging excluded 4,800 × impressions per 24 h Rate limiting
API-published posts 100 per rolling 24 h in the guide, quota_total 50 on the reference page Content publishing
Conversations API 2 calls per second per account Rate limiting
Send API 100 calls per second for text, links, reactions and stickers; 10 for audio or video Rate limiting
Private replies 750 calls per hour on post and reel comments; 100 per second on Live comments Rate limiting
Unpublished container Expires after 24 h Content publishing

Impressions here means "the number of times any content from the app user's Instagram professional account has entered a person's screen within the last 24 hours." A new account with little reach gets a small call budget. Every response carries an X-Business-Use-Case-Usage header: read it instead of guessing.

The two post quotas contradict each other. Before a big batch, call GET /<IG_ID>/content_publishing_limit?fields=quota_usage,config and trust what it returns for your account. Other networks are in my rate limits table.

Instagram API Python example

This script publishes one photo with Instagram Login. You need Python 3, requests, a long-lived token in IG_TOKEN, and a JPEG on a public URL, since Meta fetches the file itself.

import os
import time

import requests

GRAPH = "https://graph.instagram.com/v25.0"
HEADERS = {"Authorization": f"Bearer {os.environ['IG_TOKEN']}"}


def call(method, path, params=None, body=None):
    r = requests.request(method, f"{GRAPH}/{path}", headers=HEADERS,
                         params=params, json=body, timeout=30)
    data = r.json()
    if "error" in data:
        raise RuntimeError(f"{r.status_code}: {data['error']['message']}")
    return data


# The professional account ID is user_id, not id
ig_id = call("GET", "me", {"fields": "user_id,username"})["user_id"]

# 1. Container: a public JPEG plus the caption
container = call("POST", f"{ig_id}/media", body={
    "image_url": "https://example.com/launch.jpg",
    "caption": "Launch day. Link in bio.",
})["id"]

# 2. Wait for FINISHED: Meta suggests once a minute, 5 minutes max
for _ in range(5):
    status = call("GET", container, {"fields": "status_code"})["status_code"]
    if status == "FINISHED":
        break
    if status in ("ERROR", "EXPIRED"):
        raise RuntimeError(f"container {container}: {status}")
    time.sleep(60)
else:
    raise RuntimeError("container not ready after 5 minutes")

# 3. Publish
media_id = call("POST", f"{ig_id}/media_publish",
                body={"creation_id": container})["id"]
print("published", media_id)

# 4. What is left of the 24-hour quota
print(call("GET", f"{ig_id}/content_publishing_limit",
           {"fields": "quota_usage,config"})["data"][0])

Run on September 24, 2026 with a deliberately invalid token, the first call stops the script:

RuntimeError: 401: Invalid OAuth access token - Cannot parse access token

The raw body behind it carries "type":"OAuthException","code":190. With a valid token on a professional account, the script prints the new media ID, then your quota usage.

Instagram Reels API

A reel is the same three calls with a different container:

container = call("POST", f"{ig_id}/media", body={
    "media_type": "REELS",
    "video_url": "https://example.com/clip.mp4",
    "caption": "New reel",
    "share_to_feed": True,
})["id"]

A video can take longer to process than a photo, which is what the 5 minute polling loop is for. The container also accepts cover_url, thumb_offset, audio_name, collaborators and trial_params, and upload_type for resumable uploads, which Meta's guide sends to a separate host, rupload.facebook.com. The specs, from Meta's media reference:

Reel Story video Feed image
Format MP4 or MOV MP4 or MOV JPEG only
Duration 3 s to 15 min Up to 60 s
Max file size 300 MB 100 MB 8 MB
Codecs H.264 or HEVC, AAC up to 48 kHz Same family as reels
Frame rate 23 to 60 fps
Aspect ratio 0.01:1 to 10:1, 9:16 recommended 4:5 to 1.91:1

Stories use media_type=STORIES. Carousels take up to 10 images or videos as child containers, then one CAROUSEL container that you publish.

Build on the Graph API, or plug into it

Build on it when you have one app, your own accounts, and a need like hashtag search or data on other businesses, which only Facebook Login covers. The Python above is most of the publishing half.

Plug into it when Instagram is one network among several, when an agent does the work, or when you would rather not own token refresh, queues and App Review. PlugKit runs on Instagram Login: its docs cover publishing images, videos, reels with trial mode and stories, DMs, comments and insights, next to LinkedIn, X, TikTok, YouTube, Facebook, WhatsApp and Telegram. Scheduling is in how to automate Instagram posts. For agents, the MCP server exposes it as 103 tools:

claude mcp add -t http plugkit https://api.plugkit.co/mcp

It is $29 a month for 5 connected accounts, cancel anytime, with a 7-day free trial. Where it is not the answer: its docs list no hashtag search and no data on other accounts, so a monitoring tool should build on Facebook Login. More in the Instagram MCP server page, my social media API guide and the API hub.

FAQ

Is the Instagram API free?

Meta publishes no price for it: none of its Instagram Platform pages I read on September 24, 2026 mentions a fee. You pay in other ways: a call budget tied to your impressions, App Review and Business Verification if you serve other people's accounts, and the code you maintain.

Can I use the Instagram API with a personal account?

No. Both current setups require a business or creator account, and the Basic Display API, the one built for personal accounts, stopped answering on December 4, 2024. Switching to a professional account in the app settings is the only way in.

What replaced the Instagram Basic Display API?

The Instagram API with Instagram Login, launched in 2024 and usable without a Facebook Page, and the Instagram API with Facebook Login. Both serve professional accounts only.

How many posts can I publish per day with the Instagram API?

Meta's publishing guide says 100 API-published posts per rolling 24 hours, a carousel counting as one. The reference page of the content_publishing_limit endpoint still says 50. Query that endpoint for your account before planning volume.

Do I need App Review for the Instagram Graph API?

Not for your own accounts: Standard Access covers apps used by people who have a role on them. Advanced Access, which needs App Review and Business Verification, becomes mandatory once your app serves professional accounts you don't own or manage.

AB
Antoine BlancoFounder of PlugKit. Runs his own Instagram, YouTube and X accounts through the API and MCP server described here.

One plug for every platform your agent touches

$29 a month for 5 connected accounts, cancel anytime. Every feature in every plan.

Get your API key →
English ▾