{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Video Stats: Views, Likes & Shares by URL",
    "description": "TikTok video scraper without login, for n8n, Make, Clay or the API: paste video links and get one row per video - plays, likes, comments, shares, saves, caption, hashtags, sound, creator, post date. Track a video's views daily and get a Discord, Slack or Telegram alert. Misses are free.",
    "version": "1.0",
    "x-build-id": "tFesSONP8WLwBSrMV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~tiktok-video-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-tiktok-video-lookup",
        "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/accountable_eel~tiktok-video-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-tiktok-video-lookup",
        "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/accountable_eel~tiktok-video-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-tiktok-video-lookup",
        "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 video links to look up",
            "type": "array",
            "description": "One TikTok video per line: the video link, a vm.tiktok.com short link, @handle/video/<id>, or just the numeric video id. Photo posts are not supported. Accepted formats: https://www.tiktok.com/@tiktok/video/6718335390845095173, https://vm.tiktok.com/ZMabc123/, @tiktok/video/6718335390845095173, 6718335390845095173. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "deltaMode": {
            "title": "Track these videos across runs",
            "type": "boolean",
            "description": "Turns this actor into a video tracker. Each run compares a video's plays, likes, comments and shares against the snapshot from that video's previous run and fills in 'Plays change', 'Moved?' and the other change columns. Every video is still looked up and billed once, exactly as with this off. The first run has nothing to compare against, so every change column comes back empty and that run becomes the baseline.",
            "default": false
          },
          "alertOnChangeOnly": {
            "title": "Only report videos that moved",
            "type": "boolean",
            "description": "When on, a video whose plays, likes, comments and shares all moved by less than 'Smallest change to report' since its previous run is left out of the results and not charged, so a scheduled run only bills the videos that actually moved. Needs 'Track these videos across runs'; without it there is nothing to compare against.",
            "default": false
          },
          "minChangePercent": {
            "title": "Smallest change to report (%)",
            "type": "integer",
            "description": "A video counts as moved when its plays, likes, comments or shares changed by at least this many percent since its previous run. TikTok rounds large counts, so very small percentages on a huge video can be rounding noise. Used by 'Only report videos that moved' and by alerts; 0 means any change.",
            "default": 10
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and we derive one from your video list, so two schedules watching different videos keep separate memories. Editing the list then starts a fresh watchlist that re-baselines once; type your own name to keep one memory across list edits. Naming a watchlist with tracking off still fills every change column (but never drops a row), so you can filter it yourself in Sheets, n8n or Make.",
            "default": ""
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional. Needs 'Track these videos across runs'. After a video's row is billed, a video whose plays, likes, comments or shares moved by at least the threshold is posted here as one message listing what moved. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. The first run only stores a baseline, so it sends nothing. Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on \"Detect from the link\": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. Above this, further moved videos get no message (they are all in the run's dataset, and their notifyErrors says so), so a big watchlist never floods the channel. 0 sends no messages.",
            "default": 20
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "videoId",
                "url",
                "description",
                "createdAt",
                "plays",
                "likes",
                "comments",
                "shares",
                "saves",
                "durationSec",
                "authorHandle",
                "authorVerified",
                "musicTitle",
                "musicAuthor",
                "hashtags",
                "isAd",
                "coverUrl",
                "checkedAt",
                "playsDelta",
                "likesDelta",
                "commentsDelta",
                "sharesDelta",
                "playsDeltaPct",
                "likesDeltaPct",
                "commentsDeltaPct",
                "sharesDeltaPct",
                "moved",
                "previousSnapshotAt",
                "daysSincePrevious"
              ],
              "enumTitles": [
                "Video ID",
                "Video link",
                "Caption",
                "Posted at",
                "Plays",
                "Likes",
                "Comments",
                "Shares",
                "Saves",
                "Duration (sec)",
                "Creator handle",
                "Creator verified",
                "Sound title",
                "Sound author",
                "Hashtags",
                "Marked as ad",
                "Cover image",
                "Checked at",
                "Plays change",
                "Likes change",
                "Comments change",
                "Shares change",
                "Plays change (%)",
                "Likes change (%)",
                "Comments change (%)",
                "Shares change (%)",
                "Moved?",
                "Previous snapshot at",
                "Days since previous snapshot"
              ]
            },
            "default": [
              "videoId",
              "url",
              "description",
              "createdAt",
              "plays",
              "likes",
              "comments",
              "shares",
              "saves",
              "durationSec",
              "authorHandle",
              "authorVerified",
              "musicTitle",
              "musicAuthor",
              "hashtags",
              "isAd",
              "coverUrl",
              "checkedAt",
              "playsDelta",
              "likesDelta",
              "commentsDelta",
              "sharesDelta",
              "playsDeltaPct",
              "likesDeltaPct",
              "commentsDeltaPct",
              "sharesDeltaPct",
              "moved",
              "previousSnapshotAt",
              "daysSincePrevious"
            ]
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy config. Residential recommended for anti-bot-sensitive targets.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}