SwiftyInsta | Instagram Unofficial Private API Swift


Instagram offers two kinds of APIs to developers. The Instagram API Platform (extremely limited in functionality and close to being discontinued), and the Instagram Graph API for Business and Creator accounts only.

However, Instagram apps rely on a third type of API, the so-called Private API or Unofficial API, and SwiftyInsta is an iOS, macOS, tvOS and watchOS client for them, written entirely in Swift. You can try and create a better Instagram experience for your users, or write bots for automating different tasks.

These Private API require no token or app registration but they’re not authorized by Instagram for external use. Use this at your own risk.


Swift Package Manager (Xcode 11 and above)

  1. Select File/Swift Packages/Add Package Dependency… from the menu.
  2. Paste https://github.com/TheM4hd1/SwiftyInsta.git.
  3. Follow the steps.


CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods  

To integrate SwiftyInsta into your Xcode project using CocoaPods, specify it in your Podfile:

use_frameworks!    target '<Your Target Name>' do      pod 'SwiftyInsta', '~> 2.0'  end  

Then, run the following command:

$ pod install  

SwiftyInsta depends on CryptoSwift and keychain-swift.



$ gem install cocoapods

Once the user has typed the two factor authentication code or challenge code, you simply do

use_frameworks!target '<Your Target Name>' do    pod 'SwiftyInsta', '~> 2.0'end

And the completionHandler in the previous authenticate(with: completionHandler:) will automatically catch the response.

LoginWebViewController (>= iOS 12 only)

$ pod install

Or implement your own custom UIViewController using LoginWebView, and pass it to an APIHandler authenticate method using .webView(/* your login web view */).


If you’ve already persisted a user’s Authentication.Response:

// these need to be strong references.self.credentials = Credentials(username: /* username */, password: /* password */, verifyBy: .text)self.handler = APIHandler()handler.authenticate(with: .user(credentials)) {    switch $0 {    case .success(let response, _):        print("Login successful.")        // persist cache safely in the keychain for logging in again in the future.        guard let key = response.persist() else { return print("`Authentication.Response` could not be persisted.") }        // store the `key` wherever you want, so you can access the `Authentication.Response` later.        // `UserDefaults` is just an example.        UserDefaults.standard.set(key, forKey: "current.account")        UserDefaults.standard.synchronize()    case .failure(let error):        if error.requiresInstagramCode {            /* update interface to ask for code */        } else {            /* notify the user */        }    }}


All endpoints are easily accessible from your APIHandler instance.

self.credentials.code = /* the code */

Futhermore, responses now display every single value contained in the JSON file returned by the API: just access any ParsedResponse rawResponse and start browsing, or stick with the suggested accessories (e.g. User‘s username, name, etc. and Media‘s aspectRatio, takenAt, content, etc.).