Trackagoat is multi-platform. A creator is a person or brand; each creator owns one or more accounts, where an account is a single presence on a platform (TikTok, Instagram, or YouTube). Videos hang off accounts. Tracking configuration (mode, start/end dates, follower stats, last_scraped_at) lives on the account, not the creator. A creator can have several accounts, even more than one on the same platform.
text
Organization └── Project(s) ├── Creator(s) : a person/brand (1..n accounts) │ └── Account(s) : one platform presence, tiktok | instagram | youtube │ └── Video(s) : videos/posts from that account ├── Video(s) : standalone videos added by URL (carry platform + account_id) ├── Content Group(s) : link the same content across platforms └── Campaign(s) : named groupings (can nest) ├── → Creator(s) ├── → Video(s) └── → Campaign(s) (recursive)
Data is scoped to the organization of the API key. A single API call fetches data across all projects unless you filter by project_id. Most list endpoints (/api/v2/creators, /api/v2/accounts, /api/v2/videos, the analytics aggregates) accept a platform filter.
The current API is /api/v2; the previous v1 API has been retired.
Entity reference
Project
Field
Type
Notes
id
uuid
name
string
description
string | null
Agent context: read before analyzing
org_id
uuid
created_at
ISO 8601
updated_at
ISO 8601
Creator
A creator embeds its accounts[]. Creator-level counts are the aggregate across all its accounts; the top-level handle is the primary account's handle (the TikTok account if present, otherwise the earliest-added).
Field
Type
Notes
id
uuid
project_id
uuid
org_id
uuid
handle
string | null
Primary account's handle (without @)
display_name
string | null
avatar_url
string | null
Creator-level writes (PATCH /api/v2/creators/{id}) accept only display_name, readme, and is_active. The handle and tracking configuration live on the account: change them via PATCH /api/v2/accounts/{id}.
Account
One platform presence owned by a creator. Tracking config and the raw follower/engagement snapshot live here.
Field
Type
Notes
id
uuid
creator_id
uuid
Owning creator
project_id
uuid
org_id
uuid
platform
tiktok | instagram | youtube
Fetch accounts via GET /api/v2/accounts (filter by creator_id, project_id, or platform), GET /api/v2/creators/{id}/accounts, or embedded in a creator. Per-account follower/stat history: GET /api/v2/accounts/{id}/stats.
When an account's tracking_mode is selective, some recent videos may be in pending_review and excluded from stats until reviewed. The same applies in hashtag mode for videos whose caption matched no tracked hashtag (or had no caption at all). Different accounts on the same creator can use different modes.
Video
Field
Type
Notes
id
uuid
creator_id
uuid | null
Null for direct-add videos with no matched creator
account_id
uuid | null
The account this video belongs to
platform
tiktok | instagram | youtube
platform_video_id
string
Platform-side video/post ID
excluded videos are never returned by the API.
A "tracked post" (a video that counts toward limits, goals, and accruals) is one whose tracking_status is auto_tracked, included, or direct_addand which is not individually tracking-disabled. pending_review and excluded videos, and tracking-disabled videos, are not tracked posts.
Content Group
Links the same logical content across platforms (e.g. the same clip posted as a TikTok, a Reel, and a Short) so its combined stats can be viewed together. A video belongs to at most one content group.
Field
Type
Notes
id
uuid
project_id
uuid
org_id
uuid
title
string
notes
string | null
Free-form notes
created_by
uuid | null
Manage via /api/v2/content-groups (list/create) and /api/v2/content-groups/{id} (get/patch/delete; add or remove members with add_video_ids / remove_video_ids). Combined stats: GET /api/v2/content-groups/{id}/stats returns summed totals plus a by_platform breakdown.
Campaign
Campaigns are mixed-platform: the creators and videos they contain can be on any platform, and stats roll up across all of them with a per-platform breakdown.
Field
Type
Notes
id
uuid
project_id
uuid
name
string
readme
string | null
Agent context: strategy, benchmarks, instructions (campaigns use readme, not description)
target_views
number | null
Optional total-view goal for the campaign
Campaigns can contain sub-campaigns. GET /api/v2/analytics?entity=campaign&entity_id=<id> recursively aggregates the full tree.
Goal
A per-creator performance target. Goals carry a platform scope so a target can apply to all of a creator's accounts, one platform, or one account.
Field
Type
Notes
id
uuid
metric
posts | views | engagement | followers
period
daily | weekly | monthly
target_value
number
Compliance is measured only over the accounts the scope includes. Create via POST /api/v2/creators/{id}/goals.
Context field conventions
Humans write free-text context for agents to read. The context field is readme across creators, campaigns, projects, and videos. It is the Notes field in the UI and is writable by agents via PATCH. On a video, the separate description field holds the post's original caption from the platform (not a notes field). Common patterns:
text
# Campaign readme"Q1 creator push for Product X. Target: 1M views by March 31.Top performers from last quarter: @creator1, @creator2.Exclude any videos not directly about Product X."# Creator readme"Fitness creator, 3x/week posting cadence. Best content: workout tutorials.Posts on TikTok and Instagram; YouTube is dormant.Known issue: also posts food content unrelated to program: use selective mode.Last contract renewal: Jan 2026."# Video readme"Strong outlier: 10x normal views. Trending audio #fitnesscheck helped.Not representative of creator's normal performance."
When a context field contains explicit analysis instructions, follow them over your general analysis approach.
Conversion entities
Conversion Event
A project-scoped definition of an outcome worth tracking. Conversions reference it.
Field
Type
Meaning
key
string
Stable identifier, unique per project. Matches ^[a-z0-9][a-z0-9_.-]{0,62}$. Immutable after creation
name
string
Human label
default_value_cents
integer
Used when a conversion omits value_cents
currency
string(3)
ISO code. Lives on the EVENT, not the conversion, so totals are always well defined. Immutable
is_active
Plan limit max_conversion_events_per_project caps active event types (free 3, starter 25, ultra unlimited). Conversion volume is never capped.
Conversion
Field
Type
Meaning
conversion_event_id
uuid
The event this records
target_type
creator | account | video
What it was attributed to
creator_id / account_id / video_id
uuid | null
Rollup. A video-target conversion also populates account and creator
value_cents
integer
Falls back to the event's default_value_cents
Attribution is frozen at receipt. Moving a video to another account later does not rewrite its past conversions. An org admin can explicitly override this per video.
Reading totals: filtering by creator_id returns conversions recorded against that creator's accounts and videos too. Do not sum across levels or you will double count.
criteria_type values:recurring (flat-rate every period), goals (pays when creator meets their period goals), cpm (pays per 1,000 views on posts within the period), view_threshold (one-time bonus when an individual video crosses a view-count milestone, period and top-level amount_cents are null; each threshold defines its own amount).
Platform scope: a version's platform_scope (all | platform | account, default all) limits which of an assigned creator's accounts contribute, CPM impressions, goal compliance, and view-threshold crossings are all measured only from accounts in scope. When scoped, platform or account_id is set accordingly.
Payout Accrual
Computed by an hourly background job after relevant scrapers complete. Cannot be created via the API.
Field
Type
Notes
id
uuid
creator_id
uuid
structure_id
uuid
structure_version_id
uuid
The rule version active at period end (pinned)
period_start_at
ISO 8601 | null
Inclusive, UTC. null for view_threshold accruals (no period)
To find unpaid accruals for a creator: GET /api/v2/payout-accruals?creator_id=<id>&status=earned
Payout Payment
Field
Type
Notes
id
uuid
project_id
uuid
creator_id
uuid | null
Null for ad-hoc payments
method_id
uuid | null
method_name_snapshot
string | null
Captured at write time
total_amount_cents
number
Use auto_apply_outstanding: true on POST to settle all earned accruals for a creator in one call. Set Idempotency-Key header to safely retry.
readme
string | null
Agent context: read before analyzing (the Notes field; agent-writable via PATCH)
follower_count
number | null
Sum across the creator's accounts
following_count
number | null
Sum across accounts
total_likes_count
number | null
Sum across accounts
video_count
number | null
Sum across accounts
accounts
Account[]
Embedded platform accounts (see below)
is_active
boolean
created_at
ISO 8601
updated_at
ISO 8601
handle
string
The account's handle (without @)
platform_user_id
string | null
Stable platform-side ID
display_name
string | null
avatar_url
string | null
bio_link
string | null
Link in the account's bio
follower_count
number
Current snapshot (followers / subscribers)
following_count
number
total_likes_count
number
video_count
number
tracking_mode
auto | selective | hashtag
Controls which discovered videos enter the system
tracking_hashtags
string[]
Hashtag-mode only: tags matched against the video caption. Stored normalized (NFC, lowercase, no #, invalid characters stripped, deduped); max 50
hashtag_inbox_non_matching
boolean
Hashtag-mode only: inbox (true) vs exclude (false) for non-matching videos
tracking_start_date
ISO date | null
Lower bound for this account's stats history
tracking_end_date
ISO date | null
is_active
boolean
false when auto-disabled
last_scraped_at
ISO 8601 | null
When this account was last refreshed
created_at
ISO 8601
updated_at
ISO 8601
url
string
Full URL on the platform
media_type
video | photo
photo = a TikTok photo carousel or Instagram image post/carousel; otherwise video