{
  "data": {
    "id": "IewtZ1qwYr8qhwUl2",
    "actId": "P50cIhupfxfmYN9hW",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-05T04:04:06.788Z",
    "finishedAt": "2026-11-05T04:04:36.567Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 29664,
      "runTimeSecs": 29.664,
      "computeUnits": 0.03296,
      "imageSizeBytes": 3112572416
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"TikTok For You Feed Scraper Input\",\n  \"description\": \"Capture an anonymous snapshot of TikTok's For You feed. No cookies, login, or proxy configuration required.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"maxItems\": {\n      \"title\": \"Maximum Posts\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of For You posts to collect. Set to 0 to return no items.\",\n      \"default\": 30,\n      \"minimum\": 0,\n      \"maximum\": 300,\n      \"prefill\": 3\n    },\n    \"region\": {\n      \"title\": \"Region\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Market hint for the feed. AUTO follows the connection region. A selected market asks TikTok for that market and uses a matching datacenter exit when one is available; TikTok may still override the hint.\",\n      \"enum\": [\n        \"AUTO\",\n        \"US\",\n        \"GB\",\n        \"CA\",\n        \"AU\",\n        \"NZ\",\n        \"IE\",\n        \"DE\",\n        \"FR\",\n        \"ES\",\n        \"IT\",\n        \"NL\",\n        \"SE\",\n        \"NO\",\n        \"DK\",\n        \"FI\",\n        \"PL\",\n        \"PT\",\n        \"BR\",\n        \"MX\",\n        \"AR\",\n        \"CL\",\n        \"CO\",\n        \"IN\",\n        \"PK\",\n        \"BD\",\n        \"ID\",\n        \"MY\",\n        \"PH\",\n        \"SG\",\n        \"TH\",\n        \"VN\",\n        \"JP\",\n        \"KR\",\n        \"TR\",\n        \"SA\",\n        \"AE\",\n        \"ZA\",\n        \"NG\",\n        \"EG\",\n        \"KE\"\n      ],\n      \"enumTitles\": [\n        \"Automatic (connection region)\",\n        \"United States\",\n        \"United Kingdom\",\n        \"Canada\",\n        \"Australia\",\n        \"New Zealand\",\n        \"Ireland\",\n        \"Germany\",\n        \"France\",\n        \"Spain\",\n        \"Italy\",\n        \"Netherlands\",\n        \"Sweden\",\n        \"Norway\",\n        \"Denmark\",\n        \"Finland\",\n        \"Poland\",\n        \"Portugal\",\n        \"Brazil\",\n        \"Mexico\",\n        \"Argentina\",\n        \"Chile\",\n        \"Colombia\",\n        \"India\",\n        \"Pakistan\",\n        \"Bangladesh\",\n        \"Indonesia\",\n        \"Malaysia\",\n        \"Philippines\",\n        \"Singapore\",\n        \"Thailand\",\n        \"Vietnam\",\n        \"Japan\",\n        \"South Korea\",\n        \"Turkey\",\n        \"Saudi Arabia\",\n        \"United Arab Emirates\",\n        \"South Africa\",\n        \"Nigeria\",\n        \"Egypt\",\n        \"Kenya\"\n      ],\n      \"default\": \"AUTO\",\n      \"prefill\": \"AUTO\"\n    },\n    \"minPlayCount\": {\n      \"title\": \"Minimum Play Count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer plays than this value. 0 disables the filter.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000000,\n      \"prefill\": 0\n    },\n    \"postedWithinDays\": {\n      \"title\": \"Posted Within (Days)\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep posts created in the last N days. 0 disables the filter.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 365,\n      \"prefill\": 0\n    },\n    \"excludeAds\": {\n      \"title\": \"Exclude Ads\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts that TikTok marks as advertisements.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# TikTok Anonymous For You Feed Snapshot Scraper\n\nTikTok's For You feed is a moving recommendation stream. This actor captures an anonymous snapshot of the posts surfacing on it — no account, cookies, or login — and returns the ranking, engagement counts, creator details, music, video metadata, subtitles, tagged places, and category labels for each post.\n\n## What this actor does\n\n- Collects posts from TikTok's anonymous For You feed, starting with the warm page payload and extending the snapshot across fresh anonymous sessions.\n- Deduplicates by post ID and stops when the requested count is reached or the rotating feed stops producing new posts.\n- Labels each post with its snapshot `rank`, `collectedAt`, and a derived `engagementRate`.\n- Supports a best-effort `region` market hint, plus client-side filters for minimum plays, recency, and ads.\n- Omits fields a post does not carry instead of writing nulls or placeholders.\n- Falls back to a headless browser only when the lightweight collection path returns nothing.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `maxItems` | integer | `30` | Maximum posts to collect (0–300). `0` returns no rows. |\n| `region` | select | `AUTO` | `AUTO` follows the connection region. A market code (40 supported markets) asks TikTok for that market and uses a matching exit when available; TikTok may still override the hint. |\n| `minPlayCount` | integer | `0` | Drop posts below this play count. `0` disables the filter. |\n| `postedWithinDays` | integer | `0` | Keep only posts created in the last N days (0–365). `0` disables the filter. |\n| `excludeAds` | boolean | `false` | Remove posts TikTok marks as advertisements. |\n\n### Example: quick US snapshot\n\n```json\n{\n  \"maxItems\": 20,\n  \"region\": \"US\"\n}\n```\n\n### Example: recent high-reach posts, no ads\n\n```json\n{\n  \"maxItems\": 50,\n  \"region\": \"GB\",\n  \"minPlayCount\": 100000,\n  \"postedWithinDays\": 7,\n  \"excludeAds\": true\n}\n```\n\n### Example: daily trend check\n\n```json\n{\n  \"maxItems\": 40,\n  \"region\": \"AUTO\",\n  \"postedWithinDays\": 1\n}\n```\n\nSaved tasks that still send the old `regionObservation` key keep working: when `region` is absent, a supported `regionObservation` value is used as the market hint. Other values are kept only as the informational `observedRegion` label.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `rank` | 1-based position in this snapshot after filters. |\n| `postId` | TikTok's unique post ID. |\n| `postUrl` | Direct URL to the post. |\n| `postType` | `\"video\"` or `\"slideshow\"`. |\n| `caption` | Caption text, including hashtags and mentions as typed. |\n| `feedType` | Always `\"foryou\"` for this actor. |\n| `observedRegion` | Requested market label, or `AUTO` when following the connection region. |\n| `isPersonalized` | Always `false` — the feed is anonymous. |\n| `createTime` | Unix timestamp when the post was created. |\n| `createdAt` | Creation time as an ISO 8601 UTC string. |\n| `collectedAt` | Collection time as an ISO 8601 UTC string. |\n| `locationCreated` | Country code where the post was created, when the source provides it. |\n| `playCount` / `likeCount` / `commentCount` / `shareCount` / `collectCount` / `repostCount` | Engagement counters, preferring TikTok's exact string counters. |\n| `engagementRate` | `(likes + comments + shares) / plays`, rounded to four decimals. |\n| `textLanguage` | Language code detected for the caption. |\n| `textTranslatable` | Whether TikTok offers a caption translation. |\n| `stitchEnabled` / `duetEnabled` / `shareEnabled` | Whether each interaction type is enabled. |\n| `isAd` / `adAuthorization` | Ad-related flags. |\n| `isAigc` / `aigcLabelType` | AI-generated-content labels when TikTok provides them. |\n| `categoryType` | TikTok's numeric content category. |\n| `diversificationId` / `diversificationLabels` | Feed diversification metadata when present. |\n| `author` | Object: `id`, `secUid`, `username`, `displayName`, `bio`, `verified`, `privateAccount`, `roomId`, `avatarUrl`, `followerCount`, `followingCount`, `heartCount`, `videoCount`. |\n| `music` | Object: `id`, `title`, `authorName`, `original`, `duration`, `album`, `playUrl`, `coverUrl`. |\n| `video` | Object: `width`, `height`, `duration`, `ratio`, `definition`, `codecType`, `format`, `size`, `quality`, `playUrl`, `cover`, `originCover`, `dynamicCover`, `subtitles[]` (`languageCode`, `languageName`, `format`, `url`, `expiresAt`). |\n| `poi` | Tagged place when present: `id`, `name`, `address`, `category`, `city`, `cityCode`, `countryCode`, `province`, `latitude`, `longitude`. |\n| `itemControl` | Interaction permissions: `canComment`, `canRepost`, `canShare`, `canMusicRedirect`, `canCreatorRedirect`. |\n| `hashtags` | Array of `{id, name, isCommerce}` objects. |\n| `mentions` | Array of `{username, start, end, awemeId}` objects. |\n| `images` | Slideshow image URLs for photo posts. |\n| `mediaUrlExpiresAt` | ISO 8601 UTC time when signed media URLs expire. |\n\n## Use cases\n\n- **Trend researchers** tracking which formats, sounds, and creators the recommendation engine is surfacing.\n- **Brand and sponsorship teams** spotting promoted posts and ad labels in an organic feed.\n- **Competitive intelligence** comparing creator reach and engagement across markets.\n- **Academic researchers** building anonymous feed snapshots for content-distribution studies.\n- **Media and dashboard teams** feeding live trend monitoring with ranked post data.\n\n## FAQ\n\n**Q: Do I need a TikTok account or cookies?**  \nA: No. The actor works as an anonymous visitor. It accepts no credentials, session IDs, API keys, or proxy configuration.\n\n**Q: Can I choose a specific country's feed?**  \nA: `region` is a best-effort hint. TikTok decides the feed from the connection location, so a selected market may be partially or fully overridden. The actor reports the requested label in `observedRegion` and never fabricates a detected country.\n\n**Q: How many posts can I get in one run?**  \nA: You can request up to 300. The anonymous feed rotates and has no resumable cursor; one fresh session usually yields around 20–25 unique posts, so deeper requests rotate sessions. If the source exhausts first, the run reports the honest delivered count.\n\n**Q: Why did I get fewer posts than `maxItems`?**  \nA: Either TikTok stopped serving new posts, the run reached its bounded session search cap, or the active filters removed them. The status message states which case applies and how many posts were filtered out.\n\n**Q: Will two runs return the same posts?**  \nA: Not necessarily. Each run negotiates fresh anonymous sessions, so the snapshot changes over time.\n\n**Q: Are media links permanent?**  \nA: No. Video, cover, and subtitle URLs are signed and expire, usually within about two days. `mediaUrlExpiresAt` records the expiry where it can be parsed; use `postUrl` as the stable reference.\n\n**Q: Why are some fields missing on some posts?**  \nA: TikTok only includes fields such as `poi`, `locationCreated`, subtitles, or music album for some posts. Empty values are omitted rather than written as null.\n\n**Q: Does this return personalized recommendations?**  \nA: No. The feed is an anonymous, non-personalized observation and every row carries `isPersonalized: false`.\n\n## Notes and limits\n\n- The snapshot is a point-in-time observation, not a replayable list. Posts may repeat across sessions and are deduplicated by ID.\n- A deep request is bounded by a session search cap. If the cap is reached first, the status message says so instead of claiming the source is exhausted.\n- `locationCreated` is supplied mainly by the initial page payload and is absent for most API-served posts.\n- Region selection can consume Apify Proxy traffic when a matching datacenter exit is available; `AUTO` uses the connection directly.\n- Signed media URLs should be refreshed by re-running the actor when they expire.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "tiktok-anonymous-for-you-feed-snapshot-scraper",
      "title": "TikTok Anonymous For You Feed Snapshot Scraper",
      "description": "Capture an anonymous TikTok For You feed snapshot with rank, engagement rate, author and music details, video metadata, subtitles, POI, hashtags, and filters for plays, recency, and ads.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# TikTok Anonymous For You Feed Snapshot Scraper\n\nTikTok's For You feed is a moving recommendation stream. This actor captures an anonymous snapshot of the posts surfacing on it — no account, cookies, or login — and returns the ranking, engagement counts, creator details, music, video metadata, subtitles, tagged places, and category labels for each post.\n\n## What this actor does\n\n- Collects posts from TikTok's anonymous For You feed, starting with the warm page payload and extending the snapshot across fresh anonymous sessions.\n- Deduplicates by post ID and stops when the requested count is reached or the rotating feed stops producing new posts.\n- Labels each post with its snapshot `rank`, `collectedAt`, and a derived `engagementRate`.\n- Supports a best-effort `region` market hint, plus client-side filters for minimum plays, recency, and ads.\n- Omits fields a post does not carry instead of writing nulls or placeholders.\n- Falls back to a headless browser only when the lightweight collection path returns nothing.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `maxItems` | integer | `30` | Maximum posts to collect (0–300). `0` returns no rows. |\n| `region` | select | `AUTO` | `AUTO` follows the connection region. A market code (40 supported markets) asks TikTok for that market and uses a matching exit when available; TikTok may still override the hint. |\n| `minPlayCount` | integer | `0` | Drop posts below this play count. `0` disables the filter. |\n| `postedWithinDays` | integer | `0` | Keep only posts created in the last N days (0–365). `0` disables the filter. |\n| `excludeAds` | boolean | `false` | Remove posts TikTok marks as advertisements. |\n\n### Example: quick US snapshot\n\n```json\n{\n  \"maxItems\": 20,\n  \"region\": \"US\"\n}\n```\n\n### Example: recent high-reach posts, no ads\n\n```json\n{\n  \"maxItems\": 50,\n  \"region\": \"GB\",\n  \"minPlayCount\": 100000,\n  \"postedWithinDays\": 7,\n  \"excludeAds\": true\n}\n```\n\n### Example: daily trend check\n\n```json\n{\n  \"maxItems\": 40,\n  \"region\": \"AUTO\",\n  \"postedWithinDays\": 1\n}\n```\n\nSaved tasks that still send the old `regionObservation` key keep working: when `region` is absent, a supported `regionObservation` value is used as the market hint. Other values are kept only as the informational `observedRegion` label.\n\n## Output per post\n\n| Field | Description |\n|---|---|\n| `rank` | 1-based position in this snapshot after filters. |\n| `postId` | TikTok's unique post ID. |\n| `postUrl` | Direct URL to the post. |\n| `postType` | `\"video\"` or `\"slideshow\"`. |\n| `caption` | Caption text, including hashtags and mentions as typed. |\n| `feedType` | Always `\"foryou\"` for this actor. |\n| `observedRegion` | Requested market label, or `AUTO` when following the connection region. |\n| `isPersonalized` | Always `false` — the feed is anonymous. |\n| `createTime` | Unix timestamp when the post was created. |\n| `createdAt` | Creation time as an ISO 8601 UTC string. |\n| `collectedAt` | Collection time as an ISO 8601 UTC string. |\n| `locationCreated` | Country code where the post was created, when the source provides it. |\n| `playCount` / `likeCount` / `commentCount` / `shareCount` / `collectCount` / `repostCount` | Engagement counters, preferring TikTok's exact string counters. |\n| `engagementRate` | `(likes + comments + shares) / plays`, rounded to four decimals. |\n| `textLanguage` | Language code detected for the caption. |\n| `textTranslatable` | Whether TikTok offers a caption translation. |\n| `stitchEnabled` / `duetEnabled` / `shareEnabled` | Whether each interaction type is enabled. |\n| `isAd` / `adAuthorization` | Ad-related flags. |\n| `isAigc` / `aigcLabelType` | AI-generated-content labels when TikTok provides them. |\n| `categoryType` | TikTok's numeric content category. |\n| `diversificationId` / `diversificationLabels` | Feed diversification metadata when present. |\n| `author` | Object: `id`, `secUid`, `username`, `displayName`, `bio`, `verified`, `privateAccount`, `roomId`, `avatarUrl`, `followerCount`, `followingCount`, `heartCount`, `videoCount`. |\n| `music` | Object: `id`, `title`, `authorName`, `original`, `duration`, `album`, `playUrl`, `coverUrl`. |\n| `video` | Object: `width`, `height`, `duration`, `ratio`, `definition`, `codecType`, `format`, `size`, `quality`, `playUrl`, `cover`, `originCover`, `dynamicCover`, `subtitles[]` (`languageCode`, `languageName`, `format`, `url`, `expiresAt`). |\n| `poi` | Tagged place when present: `id`, `name`, `address`, `category`, `city`, `cityCode`, `countryCode`, `province`, `latitude`, `longitude`. |\n| `itemControl` | Interaction permissions: `canComment`, `canRepost`, `canShare`, `canMusicRedirect`, `canCreatorRedirect`. |\n| `hashtags` | Array of `{id, name, isCommerce}` objects. |\n| `mentions` | Array of `{username, start, end, awemeId}` objects. |\n| `images` | Slideshow image URLs for photo posts. |\n| `mediaUrlExpiresAt` | ISO 8601 UTC time when signed media URLs expire. |\n\n## Use cases\n\n- **Trend researchers** tracking which formats, sounds, and creators the recommendation engine is surfacing.\n- **Brand and sponsorship teams** spotting promoted posts and ad labels in an organic feed.\n- **Competitive intelligence** comparing creator reach and engagement across markets.\n- **Academic researchers** building anonymous feed snapshots for content-distribution studies.\n- **Media and dashboard teams** feeding live trend monitoring with ranked post data.\n\n## FAQ\n\n**Q: Do I need a TikTok account or cookies?**  \nA: No. The actor works as an anonymous visitor. It accepts no credentials, session IDs, API keys, or proxy configuration.\n\n**Q: Can I choose a specific country's feed?**  \nA: `region` is a best-effort hint. TikTok decides the feed from the connection location, so a selected market may be partially or fully overridden. The actor reports the requested label in `observedRegion` and never fabricates a detected country.\n\n**Q: How many posts can I get in one run?**  \nA: You can request up to 300. The anonymous feed rotates and has no resumable cursor; one fresh session usually yields around 20–25 unique posts, so deeper requests rotate sessions. If the source exhausts first, the run reports the honest delivered count.\n\n**Q: Why did I get fewer posts than `maxItems`?**  \nA: Either TikTok stopped serving new posts, the run reached its bounded session search cap, or the active filters removed them. The status message states which case applies and how many posts were filtered out.\n\n**Q: Will two runs return the same posts?**  \nA: Not necessarily. Each run negotiates fresh anonymous sessions, so the snapshot changes over time.\n\n**Q: Are media links permanent?**  \nA: No. Video, cover, and subtitle URLs are signed and expire, usually within about two days. `mediaUrlExpiresAt` records the expiry where it can be parsed; use `postUrl` as the stable reference.\n\n**Q: Why are some fields missing on some posts?**  \nA: TikTok only includes fields such as `poi`, `locationCreated`, subtitles, or music album for some posts. Empty values are omitted rather than written as null.\n\n**Q: Does this return personalized recommendations?**  \nA: No. The feed is an anonymous, non-personalized observation and every row carries `isPersonalized: false`.\n\n## Notes and limits\n\n- The snapshot is a point-in-time observation, not a replayable list. Posts may repeat across sessions and are deduplicated by ID.\n- A deep request is bounded by a session search cap. If the cap is reached first, the status message says so instead of claiming the source is exhausted.\n- `locationCreated` is supplied mainly by the initial page payload and is absent for most API-served posts.\n- Region selection can consume Apify Proxy traffic when a matching datacenter exit is available; `AUTO` uses the connection directly.\n- Signed media URLs should be refreshed by re-running the actor when they expire.\n",
      "input": {
        "title": "TikTok For You Feed Scraper Input",
        "description": "Capture an anonymous snapshot of TikTok's For You feed. No cookies, login, or proxy configuration required.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "maxItems": {
            "title": "Maximum Posts",
            "type": "integer",
            "description": "Maximum number of For You posts to collect. Set to 0 to return no items.",
            "default": 30,
            "minimum": 0,
            "maximum": 300,
            "prefill": 3
          },
          "region": {
            "title": "Region",
            "type": "string",
            "editor": "select",
            "description": "Market hint for the feed. AUTO follows the connection region. A selected market asks TikTok for that market and uses a matching datacenter exit when one is available; TikTok may still override the hint.",
            "enum": [
              "AUTO",
              "US",
              "GB",
              "CA",
              "AU",
              "NZ",
              "IE",
              "DE",
              "FR",
              "ES",
              "IT",
              "NL",
              "SE",
              "NO",
              "DK",
              "FI",
              "PL",
              "PT",
              "BR",
              "MX",
              "AR",
              "CL",
              "CO",
              "IN",
              "PK",
              "BD",
              "ID",
              "MY",
              "PH",
              "SG",
              "TH",
              "VN",
              "JP",
              "KR",
              "TR",
              "SA",
              "AE",
              "ZA",
              "NG",
              "EG",
              "KE"
            ],
            "enumTitles": [
              "Automatic (connection region)",
              "United States",
              "United Kingdom",
              "Canada",
              "Australia",
              "New Zealand",
              "Ireland",
              "Germany",
              "France",
              "Spain",
              "Italy",
              "Netherlands",
              "Sweden",
              "Norway",
              "Denmark",
              "Finland",
              "Poland",
              "Portugal",
              "Brazil",
              "Mexico",
              "Argentina",
              "Chile",
              "Colombia",
              "India",
              "Pakistan",
              "Bangladesh",
              "Indonesia",
              "Malaysia",
              "Philippines",
              "Singapore",
              "Thailand",
              "Vietnam",
              "Japan",
              "South Korea",
              "Turkey",
              "Saudi Arabia",
              "United Arab Emirates",
              "South Africa",
              "Nigeria",
              "Egypt",
              "Kenya"
            ],
            "default": "AUTO",
            "prefill": "AUTO"
          },
          "minPlayCount": {
            "title": "Minimum Play Count",
            "type": "integer",
            "description": "Drop posts with fewer plays than this value. 0 disables the filter.",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000,
            "prefill": 0
          },
          "postedWithinDays": {
            "title": "Posted Within (Days)",
            "type": "integer",
            "description": "Only keep posts created in the last N days. 0 disables the filter.",
            "default": 0,
            "minimum": 0,
            "maximum": 365,
            "prefill": 0
          },
          "excludeAds": {
            "title": "Exclude Ads",
            "type": "boolean",
            "description": "Drop posts that TikTok marks as advertisements.",
            "default": false,
            "prefill": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "TikTok Anonymous For You Feed Snapshot Scraper Output",
        "description": "Posts captured from the anonymous TikTok For You feed, with rank, engagement metrics, author, music, video, subtitles, POI, and category details.",
        "properties": {
          "data": {
            "title": "For You Feed Posts",
            "type": "string",
            "description": "Dataset containing TikTok For You feed post records. Each row includes rank, postId, postUrl, caption, feedType, observedRegion, isPersonalized, engagement counts and rate, collectedAt, author, music, video, subtitles, POI, hashtags, and category labels.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "TikTok For You Feed Posts",
          "views": {
            "overview": {
              "title": "Feed Overview",
              "description": "TikTok For You page posts with engagement metrics and snapshot position.",
              "transformation": {
                "fields": [
                  "rank",
                  "postId",
                  "postUrl",
                  "caption",
                  "observedRegion",
                  "playCount",
                  "likeCount",
                  "commentCount",
                  "engagementRate",
                  "createdAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rank": {
                    "label": "Rank",
                    "format": "number"
                  },
                  "postId": {
                    "label": "Post ID",
                    "format": "text"
                  },
                  "postUrl": {
                    "label": "Post URL",
                    "format": "link"
                  },
                  "caption": {
                    "label": "Caption",
                    "format": "text"
                  },
                  "observedRegion": {
                    "label": "Region",
                    "format": "text"
                  },
                  "playCount": {
                    "label": "Plays",
                    "format": "number"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "commentCount": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "engagementRate": {
                    "label": "Engagement Rate",
                    "format": "number"
                  },
                  "createdAt": {
                    "label": "Created At",
                    "format": "text"
                  }
                }
              }
            }
          },
          "fields": {
            "rank": {
              "type": "integer",
              "title": "Rank",
              "description": "1-based position in this snapshot after filters"
            },
            "postId": {
              "type": "string",
              "title": "Post ID",
              "description": "TikTok's unique post ID (64-bit int as string)"
            },
            "postUrl": {
              "type": "string",
              "title": "Post URL",
              "description": "Direct URL to the TikTok post"
            },
            "postType": {
              "type": "string",
              "title": "Post Type",
              "description": "Either 'video' or 'slideshow'"
            },
            "caption": {
              "type": "string",
              "title": "Caption",
              "description": "Post caption text including hashtags and mentions"
            },
            "feedType": {
              "type": "string",
              "title": "Feed Type",
              "description": "Always 'foryou' for this actor"
            },
            "observedRegion": {
              "type": "string",
              "title": "Observed Region",
              "description": "Requested market label (or AUTO when following the connection region)"
            },
            "isPersonalized": {
              "type": "boolean",
              "title": "Is Personalized",
              "description": "Always false — the feed is anonymous (no login required)"
            },
            "createTime": {
              "type": "integer",
              "title": "Create Time (Unix)",
              "description": "Unix timestamp when the post was created"
            },
            "createdAt": {
              "type": "string",
              "title": "Created At",
              "description": "ISO 8601 UTC datetime when the post was created"
            },
            "collectedAt": {
              "type": "string",
              "title": "Collected At",
              "description": "ISO 8601 UTC datetime when the snapshot was collected"
            },
            "locationCreated": {
              "type": "string",
              "title": "Location Created",
              "description": "Country code where the post was created, when the source provides it"
            },
            "playCount": {
              "type": "integer",
              "title": "Play Count",
              "description": "Number of video plays (from statsV2)"
            },
            "likeCount": {
              "type": "integer",
              "title": "Like Count",
              "description": "Number of likes (from statsV2)"
            },
            "commentCount": {
              "type": "integer",
              "title": "Comment Count",
              "description": "Number of comments (from statsV2)"
            },
            "shareCount": {
              "type": "integer",
              "title": "Share Count",
              "description": "Number of shares (from statsV2)"
            },
            "collectCount": {
              "type": "integer",
              "title": "Collect Count",
              "description": "Number of bookmarks/collects (from statsV2)"
            },
            "repostCount": {
              "type": "integer",
              "title": "Repost Count",
              "description": "Number of reposts (from statsV2)"
            },
            "engagementRate": {
              "type": "number",
              "title": "Engagement Rate",
              "description": "Likes plus comments plus shares divided by plays, rounded to 4 decimals"
            },
            "textLanguage": {
              "type": "string",
              "title": "Text Language",
              "description": "Language code of the caption text"
            },
            "stitchEnabled": {
              "type": "boolean",
              "title": "Stitch Enabled",
              "description": "Whether stitching is allowed"
            },
            "duetEnabled": {
              "type": "boolean",
              "title": "Duet Enabled",
              "description": "Whether duets are allowed"
            },
            "shareEnabled": {
              "type": "boolean",
              "title": "Share Enabled",
              "description": "Whether sharing is enabled"
            },
            "isAd": {
              "type": "boolean",
              "title": "Is Ad",
              "description": "Whether this post is a paid advertisement"
            },
            "adAuthorization": {
              "type": "boolean",
              "title": "Ad Authorization",
              "description": "Ad authorization flag reported by TikTok for some promoted posts"
            },
            "isAigc": {
              "type": "boolean",
              "title": "Is AIGC",
              "description": "Present and true when TikTok labels the content as AI-generated"
            },
            "aigcLabelType": {
              "type": "integer",
              "title": "AIGC Label Type",
              "description": "TikTok's AI-generated-content label type when present"
            },
            "textTranslatable": {
              "type": "boolean",
              "title": "Text Translatable",
              "description": "Whether TikTok offers a translation for the caption"
            },
            "categoryType": {
              "type": "integer",
              "title": "Category Type",
              "description": "TikTok's numeric content category for the post"
            },
            "diversificationId": {
              "type": [
                "integer",
                "string"
              ],
              "title": "Diversification ID",
              "description": "Feed diversification identifier when the source provides it"
            },
            "diversificationLabels": {
              "type": "array",
              "title": "Diversification Labels",
              "description": "Content diversification labels from the SSR payload",
              "items": {
                "type": "string"
              }
            },
            "author": {
              "type": "object",
              "title": "Author",
              "description": "Post author/creator information",
              "properties": {
                "id": {
                  "type": "string"
                },
                "secUid": {
                  "type": "string"
                },
                "username": {
                  "type": "string"
                },
                "displayName": {
                  "type": "string"
                },
                "bio": {
                  "type": "string"
                },
                "verified": {
                  "type": "boolean"
                },
                "privateAccount": {
                  "type": "boolean"
                },
                "roomId": {
                  "type": "string"
                },
                "avatarUrl": {
                  "type": "string"
                },
                "followerCount": {
                  "type": "integer"
                },
                "followingCount": {
                  "type": "integer"
                },
                "heartCount": {
                  "type": "integer"
                },
                "videoCount": {
                  "type": "integer"
                }
              }
            },
            "music": {
              "type": "object",
              "title": "Music",
              "description": "Sound/music used in the post",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "authorName": {
                  "type": "string"
                },
                "original": {
                  "type": "boolean"
                },
                "duration": {
                  "type": "integer"
                },
                "album": {
                  "type": "string"
                },
                "playUrl": {
                  "type": "string"
                },
                "coverUrl": {
                  "type": "string"
                }
              }
            },
            "video": {
              "type": "object",
              "title": "Video",
              "description": "Video technical metadata and media URLs",
              "properties": {
                "width": {
                  "type": "integer"
                },
                "height": {
                  "type": "integer"
                },
                "duration": {
                  "type": "integer"
                },
                "ratio": {
                  "type": "string"
                },
                "definition": {
                  "type": "string"
                },
                "codecType": {
                  "type": "string"
                },
                "format": {
                  "type": "string"
                },
                "size": {
                  "type": "integer"
                },
                "quality": {
                  "type": "string"
                },
                "playUrl": {
                  "type": "string"
                },
                "cover": {
                  "type": "string"
                },
                "originCover": {
                  "type": "string"
                },
                "dynamicCover": {
                  "type": "string"
                },
                "subtitles": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "languageCode": {
                        "type": "string"
                      },
                      "languageName": {
                        "type": "string"
                      },
                      "format": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string"
                      },
                      "expiresAt": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            },
            "poi": {
              "type": "object",
              "title": "Point of Interest",
              "description": "Place tagged on the post when present",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "address": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "city": {
                  "type": "string"
                },
                "cityCode": {
                  "type": "string"
                },
                "countryCode": {
                  "type": "string"
                },
                "province": {
                  "type": "string"
                },
                "latitude": {
                  "type": "number"
                },
                "longitude": {
                  "type": "number"
                }
              }
            },
            "itemControl": {
              "type": "object",
              "title": "Item Control",
              "description": "Per-post interaction permissions reported by TikTok",
              "properties": {
                "canComment": {
                  "type": "boolean"
                },
                "canRepost": {
                  "type": "boolean"
                },
                "canShare": {
                  "type": "boolean"
                },
                "canMusicRedirect": {
                  "type": "boolean"
                },
                "canCreatorRedirect": {
                  "type": "boolean"
                }
              }
            },
            "hashtags": {
              "type": "array",
              "title": "Hashtags",
              "description": "Hashtags used in the post",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "isCommerce": {
                    "type": "boolean"
                  }
                }
              }
            },
            "mentions": {
              "type": "array",
              "title": "Mentions",
              "description": "@mentions in the post caption",
              "items": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string"
                  },
                  "start": {
                    "type": "integer"
                  },
                  "end": {
                    "type": "integer"
                  },
                  "awemeId": {
                    "type": "string"
                  }
                }
              }
            },
            "images": {
              "type": "array",
              "title": "Images",
              "description": "Slideshow images for photo posts (postType='slideshow')"
            },
            "mediaUrlExpiresAt": {
              "type": "string",
              "title": "Media URL Expires At",
              "description": "ISO 8601 UTC timestamp when the signed media URLs (playUrl, cover, etc.) expire"
            }
          }
        }
      },
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 1800,
        "memoryMbytes": 1024
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "b4fc517cf2b6bc7b79e0f489856ec44275e80453125d706b36d0332c7ac9aab9",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03296
    }
  }
}