{
  "actorSpecification": 1,
  "fields": {
    "adFlags": {
      "description": "adAuthorization, brandOrganicType, adLabelVersion, aigcLabelType, moderationAigcLabelType and isAiGenerated; empty subkeys are omitted",
      "title": "Ad / AI Flags",
      "type": "object"
    },
    "ageHours": {
      "description": "(run start - createTime) / 3600, 2 decimals",
      "title": "Age Hours",
      "type": "number"
    },
    "author": {
      "description": "Author profile snapshot; includes commentSetting, duetSetting, stitchSetting, downloadSetting and isEmbedBanned when present. avatarUrl uses a KV URL after rehosting and avatarUrlOriginal keeps the signed source.",
      "title": "Author",
      "type": "object"
    },
    "caption": {
      "description": "Post caption/description text",
      "title": "Caption",
      "type": "string"
    },
    "categoryId": {
      "description": "Requested category ID. All is 120; legacy 123 inputs are normalized to 120.",
      "title": "Category ID",
      "type": "integer"
    },
    "categoryName": {
      "description": "Canonical requested category name (e.g. All, Sports, Technology)",
      "title": "Category Name",
      "type": "string"
    },
    "collectCount": {
      "description": "Number of times post was saved/collected",
      "title": "Collect Count",
      "type": "integer"
    },
    "commentCount": {
      "description": "Number of comments",
      "title": "Comment Count",
      "type": "integer"
    },
    "createTime": {
      "description": "Unix timestamp when the post was created",
      "title": "Create Time",
      "type": "integer"
    },
    "createdAt": {
      "description": "ISO 8601 UTC timestamp of post creation",
      "title": "Created At",
      "type": "string"
    },
    "duetEnabled": {
      "description": "Whether duets are allowed on this post",
      "title": "Duet Enabled",
      "type": "boolean"
    },
    "engagementRate": {
      "description": "(likes + comments + shares + collects) / plays, 6 decimals. Omitted when playCount is zero or missing.",
      "title": "Engagement Rate",
      "type": "number"
    },
    "feedType": {
      "description": "Always 'explore' for rows from this actor",
      "title": "Feed Type",
      "type": "string"
    },
    "firstSeen": {
      "description": "Present only for onlyNew runs: ISO timestamp when the post first entered the state store",
      "title": "First Seen",
      "type": "string"
    },
    "hashtags": {
      "description": "Hashtags used in the post",
      "title": "Hashtags",
      "type": "array"
    },
    "images": {
      "description": "Slideshow images for photo posts (postType='slideshow'). With rehosting, urlList becomes a single KV image URL and urlListOriginal keeps the signed candidate list.",
      "title": "Images",
      "type": "array"
    },
    "isAd": {
      "description": "Whether the post is marked as an advertisement",
      "title": "Is Ad",
      "type": "boolean"
    },
    "isNew": {
      "description": "Present only for onlyNew runs; true for posts emitted during this run",
      "title": "Is New",
      "type": "boolean"
    },
    "itemCategoryId": {
      "description": "The item's own CategoryType. Explore feeds are mixed, so this can differ from categoryId.",
      "title": "Item Category ID",
      "type": "integer"
    },
    "itemCategoryName": {
      "description": "Canonical name for itemCategoryId",
      "title": "Item Category Name",
      "type": "string"
    },
    "lastSeen": {
      "description": "Present only for onlyNew runs: ISO timestamp for this observation",
      "title": "Last Seen",
      "type": "string"
    },
    "likeCount": {
      "description": "Number of likes (from statsV2)",
      "title": "Like Count",
      "type": "integer"
    },
    "locationCreated": {
      "description": "Declared for backward compatibility. The Explore item payload does not contain it; it is emitted only when includePostDetails=true and the post detail page supplies a value.",
      "title": "Location Created (legacy)",
      "type": "string"
    },
    "marketRegion": {
      "description": "Selected ISO country, or the actual region detected from the Explore page state when no country was requested. Never guessed.",
      "title": "Market Region",
      "type": "string"
    },
    "mediaExpiresAt": {
      "description": "Per-asset ISO 8601 expiries: video, cover, avatar, music, subtitles",
      "title": "Media Expiries",
      "type": "object"
    },
    "mediaRehosted": {
      "description": "True when the video bytes were stored in the default Key-Value Store, or, for a post without video, when at least one other signed media field was stored. False when no media field succeeded; the original signed URLs remain.",
      "title": "Media Rehosted",
      "type": "boolean"
    },
    "mediaRehostedAll": {
      "description": "True when every attempted media field was stored in the Key-Value Store. False when any field failed or was skipped.",
      "title": "All Media Rehosted",
      "type": "boolean"
    },
    "mediaRehostedFields": {
      "description": "Boolean per-field success map derived from rehostStatusByField.",
      "title": "Media Rehosted Fields",
      "type": "object"
    },
    "mediaSources": {
      "description": "Original signed URL or URL list for every rehosted field. Rehosted fields also keep a matching <field>Original value.",
      "title": "Media Sources",
      "type": "object"
    },
    "mediaUrlExpiresAt": {
      "description": "Earliest ISO 8601 UTC expiry across the original signed video, cover, avatar, music and subtitle URLs. It remains the source expiry after rehosting; KV URLs do not use it.",
      "title": "Media URL Expires At",
      "type": "string"
    },
    "mentions": {
      "description": "@mentions in the caption",
      "title": "Mentions",
      "type": "array"
    },
    "music": {
      "description": "Sound/music used in the post (id, title, authorName, duration, album, playUrl, coverUrl). After rehosting, playUrl and coverUrl use KV URLs and playUrlOriginal/coverUrlOriginal keep the signed sources.",
      "title": "Music",
      "type": "object"
    },
    "place": {
      "description": "POI object when present: id, name, address, city, province, country, countryCode, category, typeName. No latitude/longitude is invented.",
      "title": "Place / POI",
      "type": "object"
    },
    "playCount": {
      "description": "Number of video plays",
      "title": "Play Count",
      "type": "integer"
    },
    "playsPerHour": {
      "description": "playCount / ageHours, 1 decimal. Omitted when ageHours is not positive.",
      "title": "Plays Per Hour",
      "type": "number"
    },
    "position": {
      "description": "0-based emitted order within the market/category after filters and dedupe",
      "title": "Position",
      "type": "integer"
    },
    "postId": {
      "description": "Unique TikTok post/video ID (string)",
      "title": "Post ID",
      "type": "string"
    },
    "postType": {
      "description": "Either 'video' or 'slideshow'",
      "title": "Post Type",
      "type": "string"
    },
    "postUrl": {
      "description": "Direct URL to the TikTok post",
      "title": "Post URL",
      "type": "string"
    },
    "rank": {
      "description": "1-based emitted order within the market/category after filters and dedupe",
      "title": "Rank",
      "type": "integer"
    },
    "recordType": {
      "description": "Always 'explorePost'",
      "title": "Record Type",
      "type": "string"
    },
    "rehostStatus": {
      "description": "Record-level outcome: ok, partial, no_media_fields, no_post_url, missing_post_id, no_video_response, navigation_failed, playwright_unavailable, browser_unavailable, body_unavailable, empty_body, invalid_content_type, not_mp4, not_vtt, http_<status>, network_error, capture_error, kv_error, or kv_url_error. Failures keep the original URLs and never drop the record.",
      "title": "Rehost Status",
      "type": "string"
    },
    "rehostStatusByField": {
      "description": "Per-field status keyed by output path, for example video.playUrl, video.cover, video.zoomCover.240, music.playUrl, author.avatarUrl, images[0].urlList and subtitles[0].url. Values are ok or a fail-soft status.",
      "title": "Rehost Status By Field",
      "type": "object"
    },
    "repostCount": {
      "description": "Number of reposts",
      "title": "Repost Count",
      "type": "integer"
    },
    "scrapedAt": {
      "description": "ISO 8601 UTC timestamp of the run start",
      "title": "Scraped At",
      "type": "string"
    },
    "shareCount": {
      "description": "Number of shares",
      "title": "Share Count",
      "type": "integer"
    },
    "shareEnabled": {
      "description": "Whether sharing is enabled on this post",
      "title": "Share Enabled",
      "type": "boolean"
    },
    "sourceUrl": {
      "description": "Provenance alias for postUrl",
      "title": "Source URL",
      "type": "string"
    },
    "stitchEnabled": {
      "description": "Whether stitching is allowed on this post",
      "title": "Stitch Enabled",
      "type": "boolean"
    },
    "subtitles": {
      "description": "Subtitle metadata from subtitleInfos, or video.claInfo.captionInfos when subtitleInfos is absent. text is added only with includeTranscripts=true. With rehosting, url is a KV VTT URL and urlOriginal keeps the signed source.",
      "title": "Subtitles",
      "type": "array"
    },
    "textLanguage": {
      "description": "Language code of the caption",
      "title": "Text Language",
      "type": "string"
    },
    "video": {
      "description": "Video metadata. With rehostVideo=true, playUrl, downloadUrl, cover, originCover, dynamicCover and zoomCover are stable Key-Value Store URLs, each with a matching <field>Original value and a mediaSources entry. sourcePlayUrl keeps the original signed play URL, and sourceDownloadUrl keeps a distinct signed download URL. Without rehosting, playUrl prefers the working www.tiktok.com/aweme/v1/play/ carrier and downloadUrl falls back to it.",
      "title": "Video",
      "type": "object"
    }
  },
  "title": "TikTok Explore/Trending Scraper Dataset",
  "views": {
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "ageHours": {
            "format": "number",
            "label": "Age (hours)"
          },
          "caption": {
            "format": "text",
            "label": "Caption"
          },
          "categoryId": {
            "format": "number",
            "label": "Category ID"
          },
          "categoryName": {
            "format": "text",
            "label": "Category"
          },
          "createdAt": {
            "format": "text",
            "label": "Created At"
          },
          "engagementRate": {
            "format": "number",
            "label": "Engagement Rate"
          },
          "feedType": {
            "format": "text",
            "label": "Feed Type"
          },
          "itemCategoryName": {
            "format": "text",
            "label": "Item Category"
          },
          "likeCount": {
            "format": "number",
            "label": "Likes"
          },
          "marketRegion": {
            "format": "text",
            "label": "Market"
          },
          "mediaRehosted": {
            "format": "text",
            "label": "Media Rehosted"
          },
          "mediaRehostedAll": {
            "format": "text",
            "label": "All Media Rehosted"
          },
          "playCount": {
            "format": "number",
            "label": "Plays"
          },
          "playsPerHour": {
            "format": "number",
            "label": "Plays / Hour"
          },
          "postId": {
            "format": "text",
            "label": "Post ID"
          },
          "postUrl": {
            "format": "link",
            "label": "Post URL"
          },
          "rank": {
            "format": "number",
            "label": "Rank"
          },
          "rehostStatus": {
            "format": "text",
            "label": "Rehost Status"
          }
        }
      },
      "title": "Overview",
      "transformation": {
        "fields": [
          "rank",
          "marketRegion",
          "categoryName",
          "categoryId",
          "itemCategoryName",
          "feedType",
          "postId",
          "caption",
          "playCount",
          "likeCount",
          "engagementRate",
          "ageHours",
          "playsPerHour",
          "createdAt",
          "postUrl",
          "mediaRehosted",
          "mediaRehostedAll",
          "rehostStatus"
        ]
      }
    }
  }
}
