{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Scraper: Profiles, Posts, Likes & Reels, No Login",
    "description": "Instagram scraper with likes and comments on every post, up to 6x cheaper per post than the official Apify Instagram scrapers. Profiles with engagement rate and full post history, reels with plays, exact timestamps, tags and locations. No login, no cookies. From $0.28 per 1,000 posts.",
    "version": "0.1",
    "x-build-id": "naNwaKPghbZAsT60p"
  },
  "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"
            }
          },
          "searchQueries": {
            "title": "Keyword search (one per line)",
            "type": "array",
            "description": "Keyword search needs a login; this actor does not log in. Use hashtags 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, with their likes and comments. 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",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper limit of post rows for each hashtag. Without a login a hashtag page gives about 60 posts, so a higher value changes nothing.",
            "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 list row is grid-post-scraped, an engagement row is post-engagement-scraped and a detail row is post-detail-scraped. list is the default and enough for most runs: a profile timeline row already carries likes, comment count, exact timestamp, video URL, usertags, location, co-authors, the pinned and paid-partnership flags, and play_count on reels. Hashtag rows carry the counts their grid prints, for free. engagement also fetches the public embed of each video for its view count, at about 55 KB per video; posts that are not videos stay list rows. detail fetches the post itself for the visible comments, at about 88 KB per post; it carries no view count, because Instagram does not publish one there.",
            "default": "list"
          },
          "detailSample": {
            "title": "Detail sample per profile (for the engagement rate)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How many of the newest posts per profile the engagement rate is computed from. 0, the default, uses all 12 posts the profile price covers. The counts come with the timeline, so the sample costs no extra request and no extra charge. avg_video_views needs the embed view count and is filled only with postDetail = engagement.",
            "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 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 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}