{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Reel Transcript Scraper API",
    "description": "Transcribe Instagram reels with a large speech model. Every row carries a receipt: the media id, the seconds and bytes transcribed against what the manifest declared, and whether the model heard real speech rather than inventing it. Word timestamps, SRT, WebVTT, translation.",
    "version": "0.1",
    "x-build-id": "3PheAaShp4shk0n0c"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/shakamize~instagram-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-shakamize-instagram-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/shakamize~instagram-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-shakamize-instagram-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/shakamize~instagram-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-shakamize-instagram-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",
        "required": [
          "reelUrls"
        ],
        "properties": {
          "reelUrls": {
            "title": "Reels",
            "type": "array",
            "description": "The reels you want transcribed. Accepts a reel URL (<code>https://www.instagram.com/reel/Dcoz.../</code>), a post URL (<code>/p/&hellip;</code>), a profile-scoped one (<code>/nasaadmin/reel/&hellip;</code>) or a bare shortcode (<code>DcozHIETCd9</code>). An entry that cannot be read stops the run naming it, rather than being skipped quietly. Only <b>public</b> posts are reachable, and a post that turns out to be a photo or a carousel is reported as having no audio and costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max reels",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many reels, counted over the whole list. Prefilled with the two prefilled reels so a first run is cheap to try; raise it once you paste your own list, or leave it empty to transcribe everything you passed."
          },
          "maxDurationSeconds": {
            "title": "Skip reels longer than",
            "minimum": 1,
            "type": "integer",
            "description": "Skip any reel longer than this, charging nothing for it. Instagram's manifest declares the duration <b>before</b> the audio is fetched, so a reel past the limit costs no download and no transcription at all. Leave empty for no limit. Reels ran 7.5 to 197.9 seconds over a measured sample of 21, with a median of 43.3, so most reels are one billed minute."
          },
          "minDurationSeconds": {
            "title": "Skip reels shorter than",
            "minimum": 1,
            "type": "integer",
            "description": "Skip anything shorter than this. A three-second clip still costs a whole billed minute, so this is the field that stops a list of trailers from being charged like a list of interviews. Also read from the manifest, so a skipped reel is never downloaded."
          },
          "skipPostsWithoutAudio": {
            "title": "Omit posts with no audio",
            "type": "boolean",
            "description": "By default a photo, a carousel or a silent video still produces a row explaining that there was nothing to transcribe, so every reel you asked for leaves a trace. Turn this on to leave them out of the dataset entirely. Either way they are never charged.",
            "default": false
          },
          "skipLowConfidence": {
            "title": "Omit reels with no real speech",
            "type": "boolean",
            "description": "Speech models do not fail quietly on audio with no speech in it - they invent. Measured on real reels, a wildlife trailer came back as \"We are the Yamato!\" and a fragrance advert as the single word \"you\". Every row carries <code>speechDetected</code> and the model’s own <code>meanLogProb</code> so you can see it; turn this on to leave those rows out altogether. Unlike a post with no audio, these <b>are</b> charged, because the audio was fetched and put through the model.",
            "default": false
          },
          "speechConfidenceThreshold": {
            "title": "How strict the speech check is",
            "enum": [
              "strict",
              "balanced",
              "lenient"
            ],
            "type": "string",
            "description": "Where to draw the line for <code>speechDetected</code>, on the model’s own confidence scale. Measured over real reels, genuine speech runs -0.17 to -0.22 and invented text runs -0.52 to -1.93. <b>Balanced</b> sits in the gap between them and is the default; <b>strict</b> flags anything with a hint of doubt; <b>lenient</b> flags only clear invention. The default is derived from six reels, which is enough to place it and not enough to make it right for every kind of audio.",
            "default": "balanced"
          },
          "language": {
            "title": "Force a language",
            "type": "string",
            "description": "A two-letter ISO-639-1 code (<code>en</code>, <code>es</code>, <code>pt</code>) to tell the model what it is listening to. Leave empty to let it detect, which is the default. Every row records the language and whether it was forced, so a wrong detection is visible rather than silent. Ignored when translating, which always produces English."
          },
          "translateToEnglish": {
            "title": "Translate to English",
            "type": "boolean",
            "description": "Return the transcript in English whatever was spoken. This runs on a larger, slower model, because it is the only one the vendor will translate with, so a run with this on bills under the <b>higher-priced</b> translated-minute event. Word timings are not available when translating. Every row records that it was translated.",
            "default": false
          },
          "timestampGranularity": {
            "title": "Timestamps",
            "type": "array",
            "description": "<b>Segment</b> gives the transcript split into timed phrases. <b>Word</b> gives a start and end for every word, which is what caption burn-in and karaoke-style overlays need. Selecting neither returns the plain text only; the SRT and WebVTT files are built from segments regardless.",
            "items": {
              "type": "string",
              "enum": [
                "segment",
                "word"
              ],
              "enumTitles": [
                "Segments",
                "Words"
              ]
            },
            "default": [
              "segment"
            ]
          },
          "subtitleFormats": {
            "title": "Subtitle files",
            "type": "array",
            "description": "Render the transcript as subtitle files on the row. SRT is on by default; WebVTT is the browser-native form. Selecting neither leaves both fields null.",
            "items": {
              "type": "string",
              "enum": [
                "srt",
                "vtt"
              ],
              "enumTitles": [
                "SRT",
                "WebVTT"
              ]
            },
            "default": [
              "srt"
            ]
          },
          "subtitleMaxCharsPerLine": {
            "title": "Subtitle line length",
            "minimum": 10,
            "type": "integer",
            "description": "Wrap subtitle cues at this many characters. Players shrink or clip a line that overflows rather than wrapping it, so the limit has to be in the file. 42 is the broadcast convention and the default.",
            "default": 42
          },
          "textFormat": {
            "title": "Transcript layout",
            "enum": [
              "continuous",
              "paragraphs"
            ],
            "type": "string",
            "description": "How the full transcript is laid out. <b>Continuous</b> is one block, which is what you want for search and summarisation. <b>Paragraphs</b> breaks on the model’s own segment boundaries, which reads far better when a person is going to read it.",
            "default": "continuous"
          },
          "includeCaption": {
            "title": "Include the caption",
            "type": "boolean",
            "description": "The caption the poster wrote, which is unrelated to what is spoken in the reel.",
            "default": true
          },
          "includeEngagement": {
            "title": "Include likes and comments",
            "type": "boolean",
            "description": "Like and comment counts. A poster can hide the like count, and hidden comes back as null rather than as zero - reporting a withheld count as 0 would state a fact Instagram never published.",
            "default": true
          },
          "includeCaptionEntities": {
            "title": "Include hashtags and mentions",
            "type": "boolean",
            "description": "The hashtags and @mentions written in the caption, pulled out as lists so a batch can be grouped without reading every caption. Instagram publishes no entity list to a logged-out client, so these are read off the caption text itself.",
            "default": true
          },
          "includeAltText": {
            "title": "Include Instagram’s alt text",
            "type": "boolean",
            "description": "Instagram’s own generated description of what is on screen, which often names text burnt into the video. It is the nearest thing available to on-screen text, and it comes from the page rather than from the transcript.",
            "default": false
          },
          "includeTopics": {
            "title": "Include topic tags",
            "type": "boolean",
            "description": "Instagram's own topic labels for the post, which are useful for grouping a batch without reading every transcript.",
            "default": false
          },
          "includeLocation": {
            "title": "Include the tagged location",
            "type": "boolean",
            "description": "The place the poster tagged, with its coordinates where Instagram publishes them.",
            "default": false
          },
          "includeMediaUrls": {
            "title": "Include media URLs",
            "type": "boolean",
            "description": "The audio file this transcript came from, the full-quality video, and the thumbnail. These are signed URLs that expire within hours. Nothing extra is downloaded to produce them.",
            "default": false
          },
          "includeOwnerProfile": {
            "title": "Include the poster's profile",
            "type": "boolean",
            "description": "The poster's display name, verification and profile picture. A person's name and photo are personal data, protected by GDPR in the EU and by comparable rules elsewhere. Enable this only if you have a legitimate basis for collecting it. Off by default; the username is on every row regardless.",
            "default": false
          },
          "includeTaggedUsers": {
            "title": "Include tagged accounts",
            "type": "boolean",
            "description": "The accounts tagged in the post, with their display names. Personal data on the same footing as the poster's profile, so off by default.",
            "default": false
          },
          "includeCoauthors": {
            "title": "Include co-authors",
            "type": "boolean",
            "description": "Accounts credited as co-authors of the reel. Personal data, so off by default.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Concurrent reels",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many reels to work on at once, up to 20. Raising it shortens a large run but does not reduce what it costs, because the billed unit is audio rather than time. Lower it if Instagram starts throttling a very large batch.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Defaults to Apify Proxy's automatic pool, which is datacenter and is the cheapest thing that works: reel pages were served over datacenter exits on 8 attempts out of 8, measured 2026-08-31. The audio itself is fetched straight from Instagram's CDN with no proxy at all, so the proxy only ever carries the page. Residential is not needed here and costs about forty times as much per byte.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}