{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Reels Transcript Scraper — Reels to Text, No Login",
    "description": "Instagram reel transcripts: a creator's reels as text — full speech-to-text, the first-3s hook, language and timestamps, one row per reel with its date, plays and likes. Handle in, paste reel links, or chain a dataset ID. No login, any length. Music-only, private and failed reels are never charged.",
    "version": "1.0",
    "x-build-id": "2O7sW6TnwMYRWChAW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~instagram-reel-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-instagram-reel-transcript-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/steadyfetch~instagram-reel-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-instagram-reel-transcript-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/steadyfetch~instagram-reel-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-instagram-reel-transcript-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": {
          "handles": {
            "title": "Instagram creators",
            "type": "array",
            "description": "Handles or profile URLs — nasa, @nasa or https://www.instagram.com/nasa/. The actor lists that creator's most recent reels itself and transcribes them; no scraper and no login needed. Private accounts, missing handles and creators with no reels come back as uncharged rows with the reason stated. Leave everything empty and the run is a 2-reel sample of zachking's latest reels, charged like any run — the fastest way to see real output.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Instagram links or creators",
            "type": "array",
            "description": "Paste anything Instagram here and the actor sorts each entry by shape: a reel or post link (instagram.com/reel/…/, instagram.com/p/…/) is transcribed, a creator (nasa, @nasa or instagram.com/nasa/) has their latest reels transcribed, and an Instagram CDN media link (.mp4) is transcribed directly — mix them in one list. Entries may be plain links [\"https://www.instagram.com/nasa/\", \"nasa\"] or the crawler shape [{\"url\": \"https://www.instagram.com/nasa/\"}]; both are read. An entry this actor cannot place comes back as an uncharged row saying what it looked like. Use the fields below instead if you prefer to keep each kind in its own box — they all still work, and the same reel supplied twice is delivered and charged once. The spoken language is detected automatically and reported on every row, so there is no language setting."
          },
          "maxReelsPerHandle": {
            "title": "Max reels per creator",
            "minimum": 1,
            "type": "integer",
            "description": "How many of each creator's most recent reels to transcribe — most recent by date: a reel the creator pinned to the top of their grid is delivered in its real date position (flagged isPinned), never ahead of newer reels. Best-effort: if Instagram stops serving more part-way through, the run keeps what it listed, says so, and charges only for delivered transcripts. Ask for more than this actor serves per creator and the run still starts: it continues at the actor's own ceiling of 500 reels, with one uncharged row saying what was asked and what bound it.",
            "default": 10
          },
          "reelUrls": {
            "title": "Instagram reel links",
            "type": "array",
            "description": "Plain Instagram links — instagram.com/reel/…/ or instagram.com/p/…/ — as shown in your browser's address bar. A /p/ link works whenever the post's media is a video, including a carousel that contains one (its first video item is transcribed); a photo post, or a carousel of only photos, comes back as an uncharged row saying there is no video on it to transcribe. The app's Copy link sometimes gives an instagram.com/share/… link instead; that shape carries no reel code, so open it once and paste the instagram.com/reel/… address it lands on. The actor resolves each reel's video itself; a private or removed post, or one Instagram marks copyright-blocked for embeds, comes back as an uncharged row with the reason stated.",
            "items": {
              "type": "string"
            }
          },
          "videoUrls": {
            "title": "Reel video/audio URLs",
            "type": "array",
            "description": "Instagram CDN media links (.mp4 on scontent-*.cdninstagram.com, instagram.f*.fna.fbcdn.net, or video.*.fbcdn.net) — the videoUrl / audioUrl field from any Instagram scraper result. A direct audio or video FILE on any other host goes to steadyfetch/media-transcriber, field urls. These signed URLs expire in about 1–3 days, so transcribe soon after scraping; expired rows come back uncharged. The media transcriber's page is apify.com/steadyfetch/media-transcriber and its field is titled \"Media URLs\" there; a link in either this field or the reel links field that is not an Instagram one comes back as an uncharged row saying so.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset ID (chain a scraper run)",
            "type": "string",
            "description": "The default dataset ID of a finished Instagram scraper run (works with apify/instagram-scraper, instagram-reel-scraper, instagram-post-scraper, instagram-api-scraper and others). With Apify's 'Connect actor' integration this is filled automatically — the cleanest way to chain."
          },
          "datasetItems": {
            "title": "Dataset items (paste rows)",
            "type": "array",
            "description": "Paste rows from your Instagram scraper run. The actor deep-scans each row for reel video/audio URLs + metadata (creator, caption, short code) — works with any scraper's output shape, including nested posts."
          },
          "includeOnScreenText": {
            "title": "Read on-screen text on silent reels",
            "type": "boolean",
            "description": "OFF (default): a reel with no speech is never charged. ON: music-only and silent reels have their on-screen text read from the reel's own frames and delivered as `onScreenText`, charged like a transcript. Reels with no readable on-screen text stay uncharged either way. About 1 in 6 reels is music-only.",
            "default": false
          },
          "watchlistId": {
            "title": "Watchlist name",
            "type": "string",
            "description": "A short name for the list, e.g. `acme-creators` (letters, numbers and hyphens). The list lives in a named key-value store in your account called `ig-reels-watch-<name>`, so you can inspect or clear it any time. Leave empty for a one-off run — your account's memory of delivered reels still applies."
          },
          "newReelsOnly": {
            "title": "New reels only",
            "type": "boolean",
            "description": "OFF (default): every reel runs as usual; one your account already has comes back from the earlier run, not charged (`repeat: true`), and every row carries `isNew` / `firstSeenAt`. ON: reels already on your watchlist — or, with no list name, already delivered to your account — are skipped before download: not fetched, not charged, and the run's status line and OUTPUT say how many. Only a reel the actor actually answered counts (a delivered transcript or on-screen text, or a final uncharged verdict such as no speech); a reel it could not answer — an expired URL, a failed download, a reel your cost cap left out — does not, so the next run tries it again. Compares the creator's most recent reels (\"Max reels per creator\") against the record.",
            "default": false
          },
          "maxItems": {
            "title": "Max reels to process",
            "minimum": 1,
            "type": "integer",
            "description": "Safety cap on how many reels/videos to transcribe in one run, across every input above. Long videos: the first 3 minutes of every video are included in the transcript price; each started minute beyond that is charged as a \"Long video minute\" at $0.005 — only when the transcript is delivered, never on on-screen text. Ask for more than this actor serves in one run and the run still starts: it continues at the actor's own ceiling of 10,000 reels, with one uncharged row saying so.",
            "default": 1000
          },
          "maxRunSeconds": {
            "title": "Max run time (seconds)",
            "type": "integer",
            "description": "Wall-clock bound for the whole run, counted from when the run started. Reels still waiting when it is reached come back as uncharged rows saying so, and the run finishes cleanly instead of being cut off. Anything outside the actor's own range of 30 to 3,600 seconds still starts a run: the clock is set to the nearest end of that range and one uncharged row says so.",
            "default": 3600
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}