How to post pictures to instagram using API

PhpInstagram Api

Php Problem Overview

I am building a php application which needs to post the user uploaded picture directly to Instagram, but after a quick search i found that there is no such function in the API :( and it feels weird... because they should provide one. I am not sure if there is any other way (except the apps for android and iOS) to upload picture using php. Kindly give me any sort of idea if there is any possibility.

I also read this ,

Php Solutions

Solution 1 - Php


Instagram are now banning accounts and removing the images based on this method. Please use with caution.

It seems that everyone who has answered this question with something along the lines of it can't be done is somewhat correct. Officially, you cannot post a photo to Instagram with their API. However, if you reverse engineer the API, you can.

function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ''.$url);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if($post) {
	    curl_setopt($ch, CURLOPT_POST, true);
	    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    if($cookies) {
	    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');			
    } else {
	    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    $response = curl_exec($ch);
    $http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
   return array($http, $response);

function GenerateGuid() {
     return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
		    mt_rand(0, 65535), 
		    mt_rand(0, 65535), 
		    mt_rand(0, 65535), 
		    mt_rand(16384, 20479), 
		    mt_rand(32768, 49151), 
	 	    mt_rand(0, 65535), 
		    mt_rand(0, 65535), 
		    mt_rand(0, 65535));

function GenerateUserAgent() {	
     $resolutions = array('720x1280', '320x480', '480x800', '1024x768', '1280x720', '768x1024', '480x320');
     $versions = array('GT-N7000', 'SM-N9000', 'GT-I9220', 'GT-I9100');
     $dpis = array('120', '160', '320', '240');

     $ver = $versions[array_rand($versions)];
     $dpi = $dpis[array_rand($dpis)];
     $res = $resolutions[array_rand($resolutions)];

     return 'Instagram 4.'.mt_rand(1,2).'.'.mt_rand(0,2).' Android ('.mt_rand(10,11).'/'.mt_rand(1,3).'.'.mt_rand(3,5).'.'.mt_rand(0,5).'; '.$dpi.'; '.$res.'; samsung; '.$ver.'; '.$ver.'; smdkc210; en_US)';

function GenerateSignature($data) {
     return hash_hmac('sha256', $data, 'b4a23f5e39b5929e0666ac5de94c89d1618a2916');

function GetPostData($filename) {
    if(!$filename) {
	    echo "The image doesn't exist ".$filename;
    } else {
	    $post_data = array('device_timestamp' => time(), 
				  		'photo' => '@'.$filename);
	    return $post_data;

// Set the username and password of the account that you wish to post a photo to
$username = 'ig_username';
$password = 'ig_password';

// Set the path to the file that you wish to post.
// This must be jpeg format and it must be a perfect square
$filename = 'pictures/test.jpg';

// Set the caption for the photo
$caption = "Test caption";

// Define the user agent
$agent = GenerateUserAgent();

// Define the GuID
$guid = GenerateGuid();

// Set the devide ID
$device_id = "android-".$guid;

/* LOG IN */
// You must be logged in to the account that you wish to post a photo too
// Set all of the parameters in the string, and then sign it with their API key using SHA-256
$data ='{"device_id":"'.$device_id.'","guid":"'.$guid.'","username":"'.$username.'","password":"'.$password.'","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}';
$sig = GenerateSignature($data);
$data = 'signed_body='.$sig.'.'.urlencode($data).'&ig_sig_key_version=4';
$login = SendRequest('accounts/login/', true, $data, $agent, false);

if(strpos($login[1], "Sorry, an error occurred while processing this request.")) {
    echo "Request failed, there's a chance that this proxy/ip is blocked";
} else {			
    if(empty($login[1])) {
	    echo "Empty response received from the server while trying to login";
    } else {			
	    // Decode the array that is returned
	    $obj = @json_decode($login[1], true);

	    if(empty($obj)) {
		    echo "Could not decode the response: ".$body;
	    } else {
	        // Post the picture
	        $data = GetPostData($filename);
	        $post = SendRequest('media/upload/', true, $data, $agent, true);	
	        if(empty($post[1])) {
		         echo "Empty response received from the server while trying to post the image";
	        } else {
	            // Decode the response 
		        $obj = @json_decode($post[1], true);

		        if(empty($obj)) {
			        echo "Could not decode the response";
		        } else {
			        $status = $obj['status'];

			        if($status == 'ok') {
                        // Remove and line breaks from the caption
				        $caption = preg_replace("/\r|\n/", "", $caption);

				        $media_id = $obj['media_id'];
				        $device_id = "android-".$guid;
				        $data = '{"device_id":"'.$device_id.'","guid":"'.$guid.'","media_id":"'.$media_id.'","caption":"'.trim($caption).'","device_timestamp":"'.time().'","source_type":"5","filter_type":"0","extra":"{}","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}';	
				        $sig = GenerateSignature($data);
				        $new_data = 'signed_body='.$sig.'.'.urlencode($data).'&ig_sig_key_version=4';

                       // Now, configure the photo
                       $conf = SendRequest('media/configure/', true, $new_data, $agent, true);
				       if(empty($conf[1])) {
			               echo "Empty response received from the server while trying to configure the image";
				       } else {
		                   if(strpos($conf[1], "login_required")) {
			                    echo "You are not logged in. There's a chance that the account is banned";
			                } else {
			                    $obj = @json_decode($conf[1], true);
			                    $status = $obj['status'];

			                    if($status != 'fail') {
			                        echo "Success";
			                    } else {
			                        echo 'Fail';
			        } else {
				        echo "Status isn't okay";

Just copy and paste the code above in your text editor, change the few variables accordingly and VOILA! I wrote an article about this and I've done it many times. See a demo here.

Solution 2 - Php

If you read the link you shared, the accepted answer is:

>You cannot post pictures to Instagram via the API.

Instagram have now said this:

> Now you can post your content using Instagram APIs (New) effects from > 26th Jan 2021 !

Hopefully you have some luck here.

Solution 3 - Php

UPDATE It is now possible:

The Content Publishing API is a subset of Instagram Graph API endpoints that allow you to publish media objects. Publishing media objects with this API is a two step process — you first create a media object container, then publish the container on your Business Account.

Solution 4 - Php

Instagram now allows businesses to schedule their posts, using the new Content Publishing Beta endpoints.

However, this blog post - - makes it clear that they are only opening that API to their Facebook Marketing Partners or Instagram Partners.

> To get started with scheduling posts, please work with one of our > Facebook Marketing Partners or Instagram Partners.

This link from Facebook - - lists it as a closed beta.

> The Content Publishing API is in closed beta with Facebook Marketing > Partners and Instagram Partners only. We are not accepting new > applicants at this time.

But this is how you would do it:

You have a photo at...

You want to publish it with the hashtag "#BronzFonz".

You could use the /user/media edge to create the container like this:


This would return a container ID (let's say 17889455560051444), which you would then publish using the /user/media_publish edge, like this:


This example from the docs.

Solution 5 - Php

I tried using IFTTT and many other services but all were doing things or post from Instagram to another platform not to Instagram. I read more to found Instagram does not provide any such API as of now.

Using blue stack is again involving heavy installation and doing things manually only.

However, you can use your Google Chrome on the desktop version to make a post on Instagram. It needs a bit tweak.

  1. Open your chrome and browse
  2. Go to inspect element by right clicking on chrome.
  3. From top right corener menu drop down on developer tools, select more tool.
  4. Further select network conditions.
  5. In the network selection section, see the second section there named user agent.
  6. Uncheck select automatically, and select chrome for Android from the list of given user agent.
  7. Refresh your page.

You will notice a change in UI and the option to make a post on Instagram. Your life is now easy. Let me know an easier way if you can find any.

enter image description here

> I wrote on about it.

Working Screenshot

enter image description here

Solution 6 - Php

For anyone who is searching for a solution about posting to Instagram using AWS lambda and puppeteer (chrome-aws-lambda). Noted that this solution allow you to post 1 photo for each post only. If you are not using lambda, just replace chrome-aws-lambda with puppeteer.

For the first launch of lambda, it is normal that will not work because instagram detects “Suspicious login attempt”. Just goto instagram page using your PC and approve it, everything should be fine.

Here's my code, feel free to optimize it:

// instagram.js
const chromium = require('chrome-aws-lambda');

const username = process.env.IG_USERNAME;
const password = process.env.IG_PASSWORD; = async function(fileToUpload, caption){
    const browser = await chromium.puppeteer.launch({
        args: [...chromium.args, '--window-size=520,700'],
        defaultViewport: chromium.defaultViewport,
        executablePath: await chromium.executablePath,
        headless: false,
        ignoreHTTPSErrors: true,
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) FxiOS/7.5b3349 Mobile/14F89 Safari/603.2.4');
    await page.goto('', {waitUntil: 'networkidle2'});
    const [buttonLogIn] = await page.$x("//button[contains(., 'Log In')]");
    if (buttonLogIn) {

    await page.waitFor('input[name="username"]');
    await page.type('input[name="username"]', username)
    await page.type('input[name="password"]', password)
    await'form button[type="submit"]');

    await page.waitFor(3000);
    const [buttonSaveInfo] = await page.$x("//button[contains(., 'Not Now')]");
    if (buttonSaveInfo) {

    await page.waitFor(3000);
    const [buttonNotificationNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonNotificationCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonNotificationNotNow) {
    } else if (buttonNotificationCancel) {

    await page.waitFor('form[enctype="multipart/form-data"]');
    const inputUploadHandle = await page.$('form[enctype="multipart/form-data"] input[type=file]');

    await page.waitFor(5000);
    const [buttonPopUpNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonPopUpCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonPopUpNotNow) {
    } else if (buttonPopUpCancel) {

    await inputUploadHandle.uploadFile(fileToUpload);

    await page.waitFor(3000);
    const [buttonNext] = await page.$x("//button[contains(., 'Next')]");

    await page.waitFor(3000);
    await page.type('textarea', caption);

    const [buttonShare] = await page.$x("//button[contains(., 'Share')]");
    await page.waitFor(3000);

    return true;
// handler.js

await'/tmp/image.png', '#text');

it must be local file path, if it is url, download it to /tmp folder first.


Instagram is blocking all suspicious login attempt now unless you approve it manually every time it executed. To solve that, better to save your cookies as json and import it to puppeteer.

Solution 7 - Php

For users who find this question, you can pass photos to the instagram sharing flow (from your app to the filters screen) on iPhone using iPhone hooks: Other than that, there is currently no way in version 1 of the api.

Solution 8 - Php

If it has a UI, it has an "API". Let's use the following example: I want to publish the pic I use in any new blog post I create. Let's assume is Wordpress.

  1. Create a service that is constantly monitoring your blog via RSS.
  2. When a new blog post is posted, download the picture.
  3. (Optional) Use a third party API to apply some overlays and whatnot to your pic.
  4. Place the photo in a well-known location on your PC or server.
  5. Configure Chrome (read above) so that you can use the browser as a mobile.
  6. Using Selenium (or any other of those libraries), simulate the entire process of posting on Instagram.
  7. Done. You should have it.

Solution 9 - Php

There is no API to post photo to instagram using API , But there is a simple way is that install google extension " User Agent " it will covert your browser to android mobile chrome version . Here is the extension link

just click on extension icon and choose chrome for android and open


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAltaf HussainView Question on Stackoverflow
Solution 1 - PhpLanceView Answer on Stackoverflow
Solution 2 - PhpAlbziView Answer on Stackoverflow
Solution 3 - PhpTom RoggeroView Answer on Stackoverflow
Solution 4 - PhpJoshua DanceView Answer on Stackoverflow
Solution 5 - PhpDheeraj ThedijjeView Answer on Stackoverflow
Solution 6 - PhpAllen WongView Answer on Stackoverflow
Solution 7 - PhpAmru E.View Answer on Stackoverflow
Solution 8 - PhpPepito FernandezView Answer on Stackoverflow
Solution 9 - PhpWaheed SabirView Answer on Stackoverflow