{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Video Downloader & API: No Watermark, HD & Bulk",
    "description": "Download TikTok videos without watermark in bulk: links, short links, IDs or whole profiles (latest videos, date range, only new ones). Pick the quality: H.264 that plays everywhere or 1080p HD. Photo post images, covers, MP3 sounds and one ZIP with metadata.",
    "version": "0.1",
    "x-build-id": "rOPADCKbkmUYWpgxP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/s_actors~tiktok-video-downloader/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-s_actors-tiktok-video-downloader",
        "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/s_actors~tiktok-video-downloader/runs": {
      "post": {
        "operationId": "runs-sync-s_actors-tiktok-video-downloader",
        "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/s_actors~tiktok-video-downloader/run-sync": {
      "post": {
        "operationId": "run-sync-s_actors-tiktok-video-downloader",
        "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": [
          "videos"
        ],
        "properties": {
          "videos": {
            "title": "🎬 TikTok videos or profiles",
            "type": "array",
            "description": "One per line: video or photo post links (tiktok.com/@user/video/..., /photo/...), short share links (vm.tiktok.com/..., vt.tiktok.com/..., tiktok.com/t/...), video IDs, or profiles (tiktok.com/@user or @user). A profile downloads its latest videos (see Videos per profile).",
            "items": {
              "type": "string"
            }
          },
          "quality": {
            "title": "🎞️ Quality",
            "enum": [
              "compatible",
              "highest",
              "smallest"
            ],
            "type": "string",
            "description": "Which of TikTok's versions of the video to save. Best H.264 is the sharpest MP4 that plays on every device and editor (usually 720p, the one tiktok.com plays). Highest resolution takes 1080p when it exists, often encoded in H.265/HEVC (plays on phones, Macs, Chrome and VLC; older Windows players need the free HEVC extension). Smallest file saves storage and bandwidth. All without the watermark; each row shows the codec and resolution saved.",
            "default": "compatible"
          },
          "maxVideosPerProfile": {
            "title": "👤 Videos per profile (only for profiles)",
            "minimum": 0,
            "type": "integer",
            "description": "Used only when you add a profile (tiktok.com/@user or @user): how many of its latest videos to download, newest first. 0 = every video of the profile. Video links are not affected.",
            "default": 20
          },
          "postedAfter": {
            "title": "📅 Posted after (profiles)",
            "type": "string",
            "description": "Only videos posted after this: a date (2026-09-01) or a relative time (7 days, 2 weeks, 1 month, 1 year). Profiles only."
          },
          "postedBefore": {
            "title": "📅 Posted before (profiles)",
            "type": "string",
            "description": "Only videos posted before this: a date (2026-10-01) or a relative time (30 days). Profiles only."
          },
          "onlyNewVideos": {
            "title": "🆕 Only new videos since the previous run",
            "type": "boolean",
            "description": "For profiles: skip the videos that earlier runs with this option already downloaded (remembered per profile in your key-value store tiktok-downloader-state). Schedule the run daily to back up an account or collect a creator's new posts automatically.",
            "default": false
          },
          "skipPhotoPosts": {
            "title": "🚫 Skip photo posts (profiles)",
            "type": "boolean",
            "description": "For profiles: download only videos, not photo carousels.",
            "default": false
          },
          "createZip": {
            "title": "🗜️ ZIP archive",
            "type": "boolean",
            "description": "Also pack all downloaded files into tiktok-videos.zip (a folder per author, plus metadata.csv with the caption, date, stats and file of every video). Large runs are split into parts of ~200 MB (tiktok-videos-2.zip, ...). The link is in the run's status message and in the Output tab.",
            "default": true
          },
          "downloadCovers": {
            "title": "🖼️ Download covers (JPG)",
            "type": "boolean",
            "description": "Also save each video's cover image as JPG (coverFileUrl). Free. TikTok's own cover links stop working after a few days.",
            "default": false
          },
          "downloadAudio": {
            "title": "🎵 Download sounds (MP3)",
            "type": "boolean",
            "description": "Also save each video's sound (music or original audio) as MP3 (audioFileUrl). Free.",
            "default": false
          },
          "maxConcurrency": {
            "title": "⚡ Parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many TikTok requests run at the same time. Downloads run at most 4 at a time.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "Requests go direct first and switch to Apify datacenter proxies when TikTok refuses them. The default works for most runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "debugLog": {
            "title": "🐞 Debug log",
            "type": "boolean",
            "description": "Log every retried request (for troubleshooting).",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}