Nurture TechnologiesNurture Tech
Integrations11 min read·July 24, 2026

Instagram App Review Keeps Failing? Here's What Meta Wants

Instagram Graph APIMeta Graph APINext.js

Instagram Graph API permissions require App Review approval and the review criteria are specific to Instagram's platform policies. This post documents why instagram_basic, instagram_content_publish, and related permissions get rejected and the exact steps to get them approved.

Problem Summary

You are building an application that needs to access Instagram data or publish content via the Instagram Graph API. You have set up a Meta Developer app, added the Instagram product, requested the required permissions (instagram_basic, instagram_content_publish, instagram_manage_comments, or others), recorded a screencast, and submitted for App Review. After a week, the submission is rejected. The reason is usually 'The reviewer could not verify the use case' or 'The permission was not demonstrated as described.' You make changes and resubmit, but the cycle continues.

Symptoms

  • Instagram permissions show 'In Review' for weeks, then flip to 'Rejected'
  • App Review rejection reason states the reviewer could not verify the instagram_content_publish use case
  • The app works for the developer's connected Instagram Business account but no one else can connect
  • instagram_basic permission rejected because the app is connecting Personal (not Business) Instagram accounts
  • Submission notes reference features that the reviewer could not find in the app at the provided URL
  • The screencast shows the feature but the reviewer's test account is a Personal Instagram profile, not a Business account
  • Rejection cites 'Platform Policy violation' without specifying which policy or which feature
  • The Meta app shows 'Instagram Basic Display' and 'Instagram Graph API' as separate products and the wrong one was configured

Business Impact

Instagram API access in development mode is limited to accounts explicitly added as Testers. For a social media scheduling tool, influencer analytics platform, or content management tool, this means the product cannot onboard any paying customer until App Review passes. Each failed review cycle adds 1-3 weeks to the launch timeline. Competitors with existing approved apps have a structural advantage. Engineering time is spent on resubmissions instead of product development.

Root Cause

Instagram has two separate API products in the Meta ecosystem with different permission sets and review requirements. Instagram Basic Display API (now deprecated as of December 2024) was for Personal Instagram accounts. Instagram Graph API is for Instagram Business and Creator accounts only. Most rejections happen because the developer is confused about which API to use for their use case, or because their test account is a Personal Instagram profile rather than a Business or Creator account, which makes it impossible for the reviewer to demonstrate Graph API permissions that only work with Business/Creator accounts.

Critical: instagram_content_publish, instagram_manage_comments, instagram_manage_insights, and instagram_basic (Graph API version) all require the connected Instagram account to be a Business or Creator account linked to a Facebook Page. A Personal Instagram account cannot be used to test or demonstrate these permissions. If your test account uses a Personal Instagram profile, the reviewer will not be able to complete the permission grant and your submission will be rejected.

Diagnosis

Step 1: Confirm You Are Using the Instagram Graph API (Not Basic Display)

In your Meta Developer App Dashboard, check which Instagram product is added. Navigate to App Dashboard > Add a Product. You should see 'Instagram' (the Graph API product). 'Instagram Basic Display' is deprecated as of December 2024 and should not be used for new apps. The two products have completely different permission namespaces.

Verify Instagram Graph API access token
# Test that your access token works with the Instagram Graph API
# Replace ACCESS_TOKEN with your User Access Token from Graph Explorer

curl -X GET "https://graph.facebook.com/v21.0/me/accounts?access_token=ACCESS_TOKEN"

# This returns the Facebook Pages you manage.
# Then get the Instagram Business Account linked to a Page:
curl -X GET "https://graph.facebook.com/v21.0/PAGE_ID?fields=instagram_business_account&access_token=ACCESS_TOKEN"

# If instagram_business_account is null, the Page has no linked Instagram Business account.
# The user must go to Instagram > Settings > Account type and links > Switch to Business Account.

Step 2: Set Up a Test Instagram Business Account

Create a dedicated test Instagram account. Go to Instagram > Profile > Settings > Account > Switch to Professional Account > Business. Link it to a Facebook Page (the Page can be a test Page you create in Meta Business Suite). Add this Instagram account as a Tester in your Meta Developer app. This is the account the reviewer must use.

$# Instagram account requirements for Graph API testing: # 1. Instagram account type: Business or Creator (not Personal) # 2. Linked to a Facebook Page # 3. The Facebook Page must be owned by the same Facebook user # 4. That Facebook user must be added as Tester in the Meta Developer app

Step 3: Verify Business Verification Is Complete

Certain Instagram Graph API permissions require Meta Business Verification. Navigate to Meta Business Suite > Business Settings > Business Info > Business Verification. Without Business Verification, permissions like instagram_content_publish for use in third-party publishing tools will be blocked at the review stage.

Step 4: Audit Your Use Case Justification

Each Instagram permission submission requires a use case description. Meta's reviewers compare your stated use case against the feature demonstrated in the screencast. If you request instagram_content_publish with a justification of 'schedule posts for users' but the screencast shows a manual one-time post with no scheduling interface, the use case does not match and will be rejected.

instagram_content_publish use case justification example
## Permission: instagram_content_publish

## Use Case
Our app allows social media managers to schedule Instagram posts on behalf of
their clients' Instagram Business accounts. Users authenticate with Instagram,
connect their client's Business account, compose a post with image/caption,
select a future publish time, and our backend calls the Instagram Graph API
at the scheduled time to create the media container and publish it.

## Data Accessed
- We access instagram_content_publish to create and publish media objects
  (images and videos) to the connected Instagram Business account
- We do not store the published content after confirmation of publication
- We store the Instagram Business Account ID and User Access Token (encrypted)
  to enable scheduled publishing

## User Control
- Users can disconnect their Instagram account at any time from our app settings
- Disconnecting revokes our access token and deletes all scheduled posts
- We provide a link to Instagram's connected apps settings for token revocation

Step 5: Test the Complete API Flow Before Recording the Screencast

Before recording the screencast, use the Meta Graph API Explorer to verify every API call works with the test account credentials. Graph Explorer is at developers.facebook.com/tools/explorer. Generate a User Access Token with all required scopes and test each endpoint your app calls. This catches permission errors before the reviewer encounters them.

Instagram content publish API call sequence
// Step 1: Create a media container
const createContainer = await fetch(
  `https://graph.facebook.com/v21.0/${igBusinessAccountId}/media`,
  {
    method: "POST",
    body: new URLSearchParams({
      image_url: "https://yourcdn.com/image.jpg", // Must be publicly accessible
      caption: "Your caption here #hashtag",
      access_token: userAccessToken,
    }),
  }
);
const { id: containerId } = await createContainer.json();

// Step 2: Check container status (for videos, wait until status is FINISHED)
const statusCheck = await fetch(
  `https://graph.facebook.com/v21.0/${containerId}?fields=status_code&access_token=${userAccessToken}`
);
// status_code values: IN_PROGRESS, FINISHED, ERROR, EXPIRED

// Step 3: Publish the container
const publish = await fetch(
  `https://graph.facebook.com/v21.0/${igBusinessAccountId}/media_publish`,
  {
    method: "POST",
    body: new URLSearchParams({
      creation_id: containerId,
      access_token: userAccessToken,
    }),
  }
);
const { id: mediaId } = await publish.json();

Production Failure Scenarios

Scenario 1: Reviewer's Test Account Is a Personal Instagram Profile

The test account provided in submission notes has a Personal Instagram profile linked to the Tester Facebook account. When the reviewer attempts to connect the Instagram account in the app, the app correctly calls the Graph API to retrieve instagram_business_account but receives null. The app shows an error or empty state. The reviewer cannot proceed and rejects the submission. Fix: explicitly state in submission notes that the Instagram account must be a Business or Creator account, and pre-configure the test account accordingly.

Scenario 2: Image URL Not Publicly Accessible

The app constructs image_url parameters using signed S3 URLs or CDN URLs behind authentication. Instagram's servers must be able to access the image URL to create a media container. If the URL requires authentication headers or expires before Instagram's servers fetch it, the media container creation fails with OAuthException error code 9007 or a media_creation error. Fix: use public CDN URLs without signatures for Instagram media publishing, or use long-lived public URLs.

Scenario 3: instagram_basic Rejected Because Connected to Personal Account

The app requests instagram_basic via the Graph API product but the connected accounts are Personal Instagram profiles. The instagram_basic permission in the Instagram Graph API only works with Business/Creator accounts. For Personal accounts, instagram_basic was part of the deprecated Basic Display API. Since Basic Display API is deprecated, this use case is no longer supported. Apps that need personal account access must pivot to a different approach or focus exclusively on Business/Creator accounts.

Prevention Checklist

  • Create and configure a dedicated Instagram Business test account before beginning App Review submission
  • Verify the test Instagram account is linked to a Facebook Page in the Meta Business Suite
  • Add the test account's Facebook user as a Tester in the Meta Developer app
  • Include explicit instructions in submission notes: 'This app requires an Instagram Business or Creator account'
  • Test every API endpoint used by the app in Meta Graph API Explorer with the test account credentials before recording the screencast
  • Record the screencast showing the Instagram Business account connection, permission grant dialog, and the feature using the permission
  • Ensure all media URLs used during testing are publicly accessible without authentication
  • Complete Meta Business Verification before submitting for permissions that require it
  • Write use case justifications that exactly match the workflow shown in the screencast
  • Do not request instagram_basic if you only need to publish it is not required for content publishing

Resolution Summary

The App Review failures were caused by: the test account being a Personal Instagram profile (not a Business account), the submission notes not specifying the Business account requirement, and the use case justification describing scheduled publishing while the screencast only showed immediate posting. After converting the test account to a Business profile, linking it to a Facebook Page, updating the notes with account type requirements, and recording a new screencast that demonstrated the scheduling workflow end-to-end, the permissions were approved on the next submission.

Lessons Learned

  • Instagram Graph API is exclusively for Business and Creator accounts document this requirement for your users and your test setup
  • The Instagram Basic Display API deprecation in December 2024 invalidated many existing integration patterns verify which API your app uses
  • Submission notes must pre-empt every step the reviewer might get wrong over-documenting is better than under-documenting
  • The use case justification and the screencast must tell the same story any mismatch between what you describe and what you demonstrate triggers rejection
  • Test API calls in Graph Explorer with the actual test account before investing time in a screencast recording

Conclusion

Instagram Graph API App Review failures almost always trace back to account type mismatches (Personal vs. Business), insufficient submission notes, or a mismatch between the stated use case and the screencast demonstration. The review process is strict because Instagram's platform policies around third-party access to user content are strictly enforced. Invest in the quality of your submission package and the correct test account setup before your first submission it saves weeks of review cycle time.

Nurture Technologies

NEED HELP WITH YOUR STACK?

Nurture Technologies builds and maintains production-quality software for startups and businesses. If engineering problems are slowing you down, our team can help.

Talk to our team →
FAQ

FREQUENTLY ASKED QUESTIONS

What is the difference between the Instagram Basic Display API and the Instagram Graph API?+

Instagram Basic Display API provided read access to Personal Instagram accounts (profile, media, stories). It was deprecated in December 2024 and is no longer available for new apps. The Instagram Graph API provides access to Instagram Business and Creator accounts and supports reading media, managing comments, publishing content, and reading insights. New apps must use the Instagram Graph API. All references to instagram_basic, instagram_content_publish, and instagram_manage_comments are Graph API permissions that only work with Business/Creator accounts.

Does my Instagram account need to be a Business account to use the Graph API?+

Yes. The Instagram Graph API only works with Business and Creator accounts. Personal Instagram accounts cannot be connected via the Graph API. Your users must convert their Instagram accounts to Business or Creator type before they can connect to your app. You must clearly communicate this requirement in your onboarding flow and in your App Review submission notes.

What Instagram permissions do I need to publish a post?+

To publish an image or video post to an Instagram Business account, you need instagram_content_publish and pages_read_engagement (to retrieve the Instagram Business Account ID linked to the user's Facebook Page). If you also need to publish Reels, the same permissions apply. For Stories, you additionally need instagram_manage_insights to check if Stories publishing is supported on the account. You do not need instagram_basic for publishing.

Can I use the Instagram Graph API to read a user's personal Instagram feed?+

Not for Personal accounts those required the now-deprecated Basic Display API. For Business and Creator accounts, you can read their media (posts, Reels) using the instagram_basic permission (Graph API variant) or by querying the /me/media endpoint. You can read their own content; you cannot access other users' private content or a personal feed.

My instagram_content_publish call fails with error code 9007. What does that mean?+

Error code 9007 typically indicates a problem with the media URL provided to the API. Instagram's servers must be able to fetch the image or video from the URL at the time of media container creation. Common causes: the URL requires authentication headers, the URL is behind a VPN or IP whitelist, the image is not publicly cached yet (a just-uploaded S3 object without public ACL), or the URL has expired (a signed URL). Use publicly accessible, long-lived URLs for all media submitted to the Instagram Graph API.

How do I link an Instagram Business account to a Facebook Page?+

On mobile: Open the Instagram app > Profile > Menu > Settings and activity > Account type and links > Connect Facebook account. Then in the Instagram app, go to Profile > Edit profile > Links > Facebook and ensure the Page is linked. Alternatively, in Meta Business Suite, go to Business Settings > Accounts > Instagram accounts and add the account there. The Instagram account and Facebook Page must be managed by the same Facebook user.

Does instagram_content_publish require a long-lived access token?+

Standard User Access Tokens expire after 1-2 hours. For publishing applications that schedule posts for future dates, you need a long-lived User Access Token (valid 60 days) or a long-lived Page Access Token (never expires for apps with pages_manage_posts). Exchange a short-lived token for a long-lived one using the /oauth/access_token endpoint with grant_type=fb_exchange_token. Store tokens encrypted and implement a refresh mechanism before expiry.

Can I publish to multiple Instagram accounts from one app?+

Yes. Each user who connects their Instagram Business account grants your app a User Access Token scoped to their account. Your app stores these tokens separately (per user/account) and makes API calls using the corresponding token for each account. There is no single app-level token that grants access to multiple users' accounts each account connection is a separate OAuth flow and token.

What is the rate limit for instagram_content_publish?+

The Instagram Graph API applies rate limits per Instagram Business Account. For publishing: 50 API calls per Instagram account per hour (not per app). For media creation (the /media endpoint): 25 containers can be created per account per 24 hours. These limits are documented in Meta's documentation under Instagram Graph API Rate Limiting. Implement a rate limit tracking mechanism and queue posts to avoid hitting the 25-creation-per-day limit.

If my App Review passes, do my users' access tokens need to be re-generated?+

No. Access tokens generated during Development mode remain valid after the app moves to production. Users who connected their accounts before App Review approval maintain their connection. New users can connect without needing to be Testers. However, if you add new permissions after initial approval, existing users will need to re-authenticate and grant the new permissions their existing tokens only cover the scopes that were approved when they connected.