{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Profile and Posts Scraper, Full History, No Login",
    "description": "Scrape public Instagram profiles with their full post history, not only the latest 12 posts. Profile stats, bio links, every post with caption and timestamp, optional likes, comments and views. No login, no cookies, no browser. Never billed for private or missing accounts or duplicates.",
    "version": "0.1",
    "x-build-id": "gYfKFBBG4Aw6aIqse"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapegeist~instagram-profile-posts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapegeist-instagram-profile-posts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapegeist~instagram-profile-posts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapegeist-instagram-profile-posts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapegeist~instagram-profile-posts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapegeist-instagram-profile-posts-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "usernames": {
            "title": "Instagram usernames or profile URLs (one per line)",
            "type": "array",
            "description": "Handles (natgeo), @handles or profile URLs (https://www.instagram.com/sfmoma/). One profile row per account plus its posts. A handle that does not exist is a free skipped row. A private account gives its public profile card as a normal charged profile row, plus a free skipped row with the reason private_no_posts, because its posts are not public.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags (one per line)",
            "type": "array",
            "description": "Hashtags with or without #. Returns about 60 posts per hashtag without a login: that is where Instagram's public tag page ends. The hashtag grid Instagram shows without a login contains reels only, no photo posts, and prints a view count per post, so hashtag rows carry views without an extra fetch and at no extra cost. List rows are billed as grid posts (grid-post-scraped), engagement rows as post engagements (post-engagement-scraped) and detail rows as post details (post-detail-scraped). Rows are deduplicated over the whole run and can be cut by date through the since field.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Location pages (ids or URLs, one per line)",
            "type": "array",
            "description": "Instagram location ids (212988663) or /explore/locations/<id>/ URLs. Returns one location row with the coordinates of the place, then about 70 posts per location: that is everything Instagram shows for a place without a login, and the page does not go deeper. The nearby field of that row is not a nearby-places list, which Instagram does not publish logged out: it holds the other places the posts on this page are tagged at, with their coordinates. Location rows carry likes, the comment count and the exact timestamp, which the grid prints itself, at no extra cost. List rows are billed as grid posts (grid-post-scraped), engagement rows as post engagements (post-engagement-scraped) and detail rows as post details (post-detail-scraped).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Keyword search (one per line)",
            "type": "array",
            "description": "Keyword search needs a login; this actor does not log in. Use hashtags and locations for discovery. Each keyword comes back as a skipped row with the reason not_available_logged_out and is never billed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post or reel URLs (one per line)",
            "type": "array",
            "description": "Post or reel URLs or shortcodes. Each becomes a detail row with likes, comment count, timestamp, usertags, location and the visible comments, whatever the postDetail level is. A view count is added from the public embed page when minViews is set (videos and reels only); the post itself publishes none.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerProfile": {
            "title": "Max posts per profile",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "How far back to page through each profile. The first 12 posts are included in the profile price as list rows, except the detailSample posts among them, which are charged at the level they are fetched at (post-engagement-scraped or post-detail-scraped); detailSample is 0 by default, so nothing extra is charged unless you ask for it. Every further timeline post is a post row (post-scraped), or a post engagement or post detail row when you raise postDetail. 0 returns the profile row only.",
            "default": 100
          },
          "maxTotalPosts": {
            "title": "Max posts per run",
            "minimum": 1,
            "maximum": 200000,
            "type": "integer",
            "description": "Hard cap on billed post rows across all inputs. Checked before each fetch, not after the row lands, so the number you type is the most post rows a run can charge you for. A lower Apify charge limit lowers it further.",
            "default": 10000
          },
          "maxResultsPerHashtag": {
            "title": "Max posts per hashtag or location",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper limit of post rows for each hashtag or location page. Without a login a hashtag page gives about 60 posts and a location page about 70, so a higher value changes nothing for them.",
            "default": 100
          },
          "postDetail": {
            "title": "Post detail level",
            "enum": [
              "list",
              "detail",
              "engagement"
            ],
            "type": "string",
            "description": "Sets the level for every post row, and the level and the source set the price: a timeline list row is post-scraped, a hashtag or location list row is grid-post-scraped, an engagement row is post-engagement-scraped and a detail row is post-detail-scraped. Hashtag and location rows carry the counts their grid prints at whichever level you choose, for free. list is the cheap row from the timeline. engagement fetches the public embed of each video for likes, comment count and view count, at about 55 KB per post. detail fetches the post itself for likes, comment count, exact timestamp, video URL, usertags, location and the visible comments, at about 88 KB per post; it carries no view count, because Instagram does not publish one there. View counts exist for videos and reels only.",
            "default": "list"
          },
          "detailSample": {
            "title": "Detail sample per profile (for the engagement rate)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "0, the default, disables the sample: no extra page is fetched for the first 12 posts and the engagement fields stay null. Above 0, and with postDetail = list, the N newest posts of each profile are fetched and the engagement rate is computed from them. The sample is fetched at detail level (post-detail-scraped), or at engagement level (post-engagement-scraped) when minViews is set or postDetail is engagement, which is the cheaper page and the only one with a view count. These sample posts are the one part of the free first 12 that costs extra.",
            "default": 0
          },
          "since": {
            "title": "Only posts since (date)",
            "type": "string",
            "description": "ISO date, for example 2026-01-01. Profile pagination stops once the posts are older than the date. Hashtag and location grids are ranked, not sorted by date, so there since drops the older posts out of the grid and the actor keeps reading the rest."
          },
          "minViews": {
            "title": "Minimum video views",
            "minimum": 1,
            "type": "integer",
            "description": "Keeps only posts with at least this many views. The number is the one Instagram publishes: a play count for reels and for hashtag rows, a video view count for a feed video, both written into the view_count field. View counts exist for videos and reels only, so image and carousel posts never pass this filter. A match from a profile is delivered as an engagement row (the embed page is the only source of its view count). A match from a hashtag grid stays at the level you asked for, because the grid prints the count. A match from a location grid is an engagement row when the grid printed no view count for it. A match from postUrls is a detail row. On hashtag pages the count is in the grid and costs nothing; everywhere else each video costs one embed fetch. Filtered posts are not delivered and not billed."
          },
          "includeComments": {
            "title": "Include visible comments on detail rows",
            "type": "boolean",
            "description": "Adds the comments to each detail row: up to about 14 most relevant comments, Instagram exposes no more without a login. Comments are part of the detail row and are never billed separately.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential proxy is required for post pages. Your own proxy URLs are accepted.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Parallel sessions. Each session keeps one proxy IP and one cookie jar. More sessions finish faster and use more memory.",
            "default": 4
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}