{
  "openapi": "3.0.1",
  "info": {
    "title": "Social Media Follower Count Tracker - 8 Networks, Change Alerts",
    "description": "For growth teams and agencies: follower, subscriber and member counts for TikTok, YouTube, Twitch, Telegram, Bluesky, Snapchat, GitHub and Discord in one table, with an isRounded column on every row. Five of the eight publish an exact figure. Monitoring returns an account only when its count moves.",
    "version": "0.1",
    "x-build-id": "2bC2Pw5zHJ6yVakdS"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~social-media-follower-count-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-social-media-follower-count-tracker",
        "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/neverempty~social-media-follower-count-tracker/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-social-media-follower-count-tracker",
        "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/neverempty~social-media-follower-count-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-social-media-follower-count-tracker",
        "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": {
          "accounts": {
            "title": "Mixed list: profile URLs, or network:handle",
            "type": "array",
            "description": "One list for all eight networks. Paste a full profile URL (https://www.tiktok.com/@nasa, https://www.youtube.com/@mkbhd, https://www.twitch.tv/shroud, https://t.me/durov, https://bsky.app/profile/bsky.app, https://www.snapchat.com/@fcbarcelona, https://github.com/torvalds, https://discord.gg/python), or write network:handle (tiktok:@nasa, youtube:@mkbhd, twitch:shroud, telegram:durov, bluesky:bsky.app, snapchat:fcbarcelona, github:torvalds, discord:python). A bare handle with no network is rejected with a free row, because the same name exists on several networks and guessing would return an account you did not ask for. Use the per-network lists below if you prefer bare handles. If every list is empty and monitoring is off, a few example accounts are read and every row says so in inputAccount; if monitoring is on, nothing is read and nothing is charged.",
            "items": {
              "type": "string"
            }
          },
          "tiktokAccounts": {
            "title": "TikTok usernames",
            "type": "array",
            "description": "TikTok accounts as @nasa, nasa, or https://www.tiktok.com/@nasa. The follower count comes back exact, not rounded: TikTok publishes both an exact figure and a rounded one on the same page, and the exact one is used (on 14 accounts measured on 2026-09-06 the two differed on 11, by up to 41,519 followers). Tag, music, search and embed URLs are rejected with a free row, because robots.txt does not allow them.",
            "items": {
              "type": "string"
            }
          },
          "youtubeChannels": {
            "title": "YouTube channels",
            "type": "array",
            "description": "YouTube channels as @MrBeast, a channel ID (UCX6OQ3DkcsbYNE6H8uQQuVA), or a channel URL. **YouTube only publishes a rounded subscriber count** (\"21.3M subscribers\"; exact only below 1,000), so isRounded is true on these rows and monitoring sees a change only when the rounded number itself moves. Old /user/ and /c/ URLs are rejected with a free row because resolving them needs a redirect this Actor does not follow.",
            "items": {
              "type": "string"
            }
          },
          "twitchChannels": {
            "title": "Twitch channels",
            "type": "array",
            "description": "Twitch channels as shroud, @shroud, or https://www.twitch.tv/shroud. The follower count comes back exact, read from the channel page's own structured data (5 of 5 channels measured on 2026-09-23 carried it, including channels that were not live). Reserved paths that are not channels (stream, search, login, videos, directory ...) are rejected with a free row, because robots.txt does not allow them.",
            "items": {
              "type": "string"
            }
          },
          "telegramChannels": {
            "title": "Telegram public channels",
            "type": "array",
            "description": "Public Telegram channels as durov, @durov, or https://t.me/durov. The subscriber count comes back exact: the profile page prints the full digits (10 671 668 subscribers), while the /s/ preview page rounds to three significant figures, so only the profile page is requested. Private invite links (t.me/+... and t.me/joinchat/...) are rejected with a free row - they publish no count.",
            "items": {
              "type": "string"
            }
          },
          "blueskyAccounts": {
            "title": "Bluesky handles",
            "type": "array",
            "description": "Bluesky accounts as bsky.app, @bsky.app, a DID (did:plc:...), or https://bsky.app/profile/bsky.app. The follower count comes back exact. Read through Bluesky's public API, whose robots.txt says in full sentences that crawling the public parts is allowed.",
            "items": {
              "type": "string"
            }
          },
          "snapchatAccounts": {
            "title": "Snapchat public profiles",
            "type": "array",
            "description": "Snapchat public profiles as fcbarcelona, @fcbarcelona, or https://www.snapchat.com/@fcbarcelona. **Snapchat rounds the subscriber count to the nearest hundred** (all 17 accounts with a count in a 28-account sample on 2026-09-14 were multiples of 100), so isRounded is true on these rows. Accounts that show no count - including personal accounts - come back as a free row saying so; a count of zero is never assumed.",
            "items": {
              "type": "string"
            }
          },
          "githubAccounts": {
            "title": "GitHub users or organizations",
            "type": "array",
            "description": "GitHub accounts as torvalds, @torvalds, or https://github.com/torvalds. The follower count comes back exact, from GitHub's official public REST API. **GitHub allows 60 unauthenticated requests per hour from one address**; this Actor does not work around that - when it is reached, the remaining GitHub accounts come back as free rows that name the time the allowance resets. Repository URLs (github.com/owner/repo) are rejected with a free row.",
            "items": {
              "type": "string"
            }
          },
          "discordInvites": {
            "title": "Discord servers, by invite code or link",
            "type": "array",
            "description": "Discord servers named by an invite: python, discord.gg/python, or https://discord.com/invite/python. Invite codes are case sensitive and are sent exactly as typed. **Discord itself calls this number approximate** (approximate_member_count), so isRounded is true on these rows, and the answer is cached for up to five minutes. Server URLs such as discord.com/channels/... are not invites and are rejected with a free row.",
            "items": {
              "type": "string"
            }
          },
          "maxAccounts": {
            "title": "Maximum rows to return (monitoring off only)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many charged rows to return when monitoring is off: reading stops once this many accounts have been read, and a free row says how many entries were not checked. **It does not limit spending in monitoring mode** - there, every account you list is checked and every change among them comes back, and the run's maximum total charge is what caps the cost. Cutting changes here would mean the accounts at the end of your list never came back at all.",
            "default": 100
          },
          "monitoringMode": {
            "title": "Monitoring mode: return an account only when its follower count changes",
            "type": "boolean",
            "description": "Off = every account you listed comes back with its counts right now, charged per row. On = the Actor remembers each account and, on later runs, returns it only when the watched count changed, with the previous value and the difference in the row. The first run returns every account once to set the baseline. **In monitoring mode every account checked costs $0.30 per 1,000 checks, changed or not** (handles the network returns nothing for, blocks and rate limits are free), plus the row price for the rows returned. Example: 50 accounts every hour = 36,000 checks a month = $10.80. The Actor reads only as many accounts as the run's maximum total charge can pay for with a check and a change row each. Counts are remembered per account, so do not put the same account in two schedules that can run at the same time.",
            "default": false
          },
          "monitorOn": {
            "title": "What counts as a change",
            "enum": [
              "follower-count",
              "any-count"
            ],
            "type": "string",
            "description": "Which numbers make an account come back in monitoring mode. Follower count only is the default. Any count also returns an account when its following count or its post count changed - useful for spotting activity, but it returns far more rows.",
            "default": "follower-count"
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears every remembered count for this Actor, so the next monitoring run returns each account once again. The counts are stored per account, not per list, so this affects all your monitoring runs. **Turn it off again after that one run**: while it is on, every run starts from scratch and charges a full account row for every account instead of only the ones that changed.",
            "default": false
          },
          "useProxy": {
            "title": "Use an Apify proxy if a request does not reach the network",
            "type": "boolean",
            "description": "Requests go out directly. This option only covers the case where a request does not reach the network at all (a connection failure): it then retries through an Apify proxy. **Blocks and challenge pages are never retried from another address**, and rate limits are never worked around - the Actor waits the time the network asks for, up to 30 seconds, and otherwise returns a free row. With this off, a connection failure is reported as a free row and no proxy is paid for.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}