{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Profile Posts Scraper — Instagram User Posts, Reels",
    "description": "Instagram user posts: posts and reels from any public Instagram profile — captions, hashtags, engagement, media links — by handle or URL, no login. From $0.60 per 1,000 posts. Plus $0.003 per profile that delivers posts. Set 30, get 30. Nothing undelivered is charged.",
    "version": "1.0",
    "x-build-id": "cWVZZLyJwEF9VV2lP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~instagram-profile-posts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-instagram-profile-posts",
        "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/steadyfetch~instagram-profile-posts/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-instagram-profile-posts",
        "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/steadyfetch~instagram-profile-posts/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-instagram-profile-posts",
        "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",
        "required": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "title": "Instagram profiles",
            "type": "array",
            "description": "Instagram handles (nasa), or profile URLs (https://www.instagram.com/nasa/) — capital letters and a leading @ are fine, and \"_demo\" is the sample switch, not a handle. A handle that does not exist, a private or empty profile and a read that did not go through are delivered as labelled rows and are never charged. A post's comments go to steadyfetch/instagram-comments-scraper and a reel's transcript to steadyfetch/instagram-reel-transcript-scraper. For your own profiles this field needs a real value — every optional field below accepts null for \"use the default\", but a null here is refused before the run starts. Leave it empty and the run collects the 5 newest posts of bbcnews (charged like any run, and any of them your account already has come back uncharged) — the fastest way to see real output; leave it empty with only filters set and that sample runs under your filters instead, with a limit larger than the sample's own capped at it.",
            "default": [
              "_demo"
            ],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Instagram links or handles",
            "type": "array",
            "description": "Also accepted: paste Instagram links here — profile links or handles; the actor sorts them and adds them to \"Instagram profiles\" above, with the same result limit, the same price and the same dedupe (a handle in both lists is collected once). Both shapes are read: [\"https://www.instagram.com/nasa/\", \"nasa\"] and [{\"url\": \"https://www.instagram.com/nasa/\"}]. A post or reel link names one post, not a profile — the row for it is uncharged and points you at our reel transcript actor. This actor returns posts, not transcripts, so there is no language setting; a `language` field sent with your input is accepted and ignored rather than stopping the run."
          },
          "resultsType": {
            "title": "What to collect",
            "type": "string",
            "description": "Choose \"tagged\" to collect the posts OTHER accounts published that tag these profiles (Instagram's \"Tagged\" tab) instead of the profiles' own posts. Same handles, same charged unit, same price: one charged unit is one post delivered either way. On the tagged door every row's ownerUsername is the account that posted it and profileHandle stays the profile you asked for, postSource reads \"tagged\", and \"Max posts per profile\" caps each profile's tagged posts exactly as it caps its own. Leave it out (or send null) for the profile's own posts, which is what this actor has always done. A value naming neither door is answered with one uncharged row naming the values that work, and no posts are collected.",
            "default": "posts"
          },
          "resultsLimit": {
            "title": "Max posts per profile",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on delivered posts from any single profile, newest by date first. Instagram's grid leads with pinned posts; here they ship in their real date position, flagged isPinned, so your limit buys the most recent posts. This actor delivers at most 5,000 posts per profile: ask for more and the run continues at 5,000, with one uncharged row saying so, rather than being refused.",
            "default": 30
          },
          "maxItems": {
            "title": "Max posts for the whole run",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on delivered posts across every profile in this run. This actor delivers at most 100,000 posts in one run: ask for more and the run continues at 100,000, with one uncharged row saying so, rather than being refused.",
            "default": 1000
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "type": "integer",
            "description": "The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout. Deep archives need room: a full 1,000-post profile takes about 13 minutes, so leave this at 1800 or raise it to 3600 for the biggest profiles. The clock runs between 30 seconds and 1 hour: set it outside that and the run continues at the nearest one, with one uncharged row saying so, rather than being refused.",
            "default": 1800
          },
          "mediaType": {
            "title": "Post type",
            "type": "string",
            "description": "Return only one kind of post. Leave as Any for everything. The value or the name of the type both work — video, videos, reels and \"Videos and reels only\" are the same filter. Null or empty means Any; a value that names none of these types is answered with one uncharged row naming the values that are, and no posts are collected.",
            "default": "any"
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Only posts published on or after this date. Use YYYY-MM-DD."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Only posts published before this date. Use YYYY-MM-DD."
          },
          "datasetId": {
            "title": "Dataset ID",
            "type": "string",
            "description": "Dataset from a previous run to read profiles from. Selecting it here is what grants this run permission to read it."
          },
          "datasetItems": {
            "title": "Dataset items",
            "type": "array",
            "description": "Rows pasted directly, instead of a dataset ID."
          },
          "resumeCursor": {
            "title": "Resume cursor",
            "type": "object",
            "description": "The resumeCursor object from a previous run's final summary row, exactly as it appears there. The run picks up where that one stopped: profiles already completed are skipped, no posts are read twice, and nothing already delivered is charged again."
          },
          "watchlistId": {
            "title": "Watchlist name",
            "type": "string",
            "description": "A short name for the list, e.g. `acme-brands` (letters, numbers and hyphens). The list lives in a named key-value store in your account called `ig-posts-watch-<name>`, so you can inspect or clear it any time. Leave empty for a one-off run — your account's memory of delivered posts still applies."
          },
          "newPostsOnly": {
            "title": "New posts only",
            "type": "boolean",
            "description": "Posts your account already has are skipped either way. This switch makes that explicit and fail-closed: ON, a run that can read neither your watchlist nor your account's memory stops before collecting anything, rather than risk charging you for posts you may already have. Only a post the actor actually delivered is remembered; a profile it could not read this minute is not, so the next run tries it again. Compares each profile's most recent posts (\"Max posts per profile\") against what you already have.",
            "default": false
          },
          "includeSeen": {
            "title": "Include posts you already have",
            "type": "boolean",
            "description": "OFF (default): a post already delivered to your account is skipped — no row, no charge — and the status line counts them. ON: those posts are delivered again anyway, marked `repeat: true` with `firstSeenRunId` naming the run that first delivered them, and still not charged. Use it when you want one complete dataset per run rather than only what changed. Posts older than 90 days in your account's memory are treated as new again either way.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}