This section applies only if you currently use Traackr's Data Lake offering. Start with The API and the Data Lake, side by side.
You will find here one table per Data Lake file. Use it to check, before you migrate, that every field your pipeline reads has somewhere to come from. Each row gives the API field and the endpoint that returns it. The definition of each API field is in the API reference.
"not available" means there is no equivalent anywhere in the API. If one of those matters to you, tell support@traackr.com before you build.
Before you start
The ids do not change. Project ID is the campaign id, UID and Influencer UID are the creator_id, and Post id is the post_id. You can join your Data Lake history to API data directly.
Every endpoint is a GET. In the paths below, {campaignId} is the campaign id and {creatorId} is the creator_id.
Amounts stay in minor units, as in the Data Lake. Read currency before you convert: see Spend Data.
A metric the platform did not report is null, where the Data Lake left the cell empty or wrote -. It means "not measured", never zero. Spend is different: see the Total Spend and Total Cost rows.
Some labels become codes, and some names swap. The Data Lake column Content Type (Feed, Story) is the API's publication_type. The API's content_type is the Data Lake's Post Type. Each case is in the tables below.
projects/projects/projects.csv
Campaign metadata. → Campaign metadata and compliance
/v1/campaigns lists every campaign, 100 per request. /v1/campaigns/{campaignId} returns one campaign with all its fields: some fields are only there.
Data Lake | API field | Endpoint |
Account ID | implicit: your key is account-scoped | - |
Project ID | id | /v1/campaigns or /v1/campaigns/{campaignId} |
Name | name | /v1/campaigns or /v1/campaigns/{campaignId} |
Brand | brand.name (and brand.id, which the CSV did not have) | /v1/campaigns or /v1/campaigns/{campaignId} |
Product Line | product_line | /v1/campaigns/{campaignId} |
Objective | objective. The text "None" is a real value | /v1/campaigns/{campaignId} |
Type | collaboration_type, as a code. Content Creation is SPONSORED_CONTENT. The others follow their label: PRODUCT_SEND, PRODUCT_COLLABORATION, EVENT, PHOTOSHOOT, TRIP, OTHER. null when no type is set | /v1/campaigns/{campaignId} |
Created | created_at: a UTC timestamp, without the "by name" part | /v1/campaigns or /v1/campaigns/{campaignId} |
Start Date / End Date | start_date / end_date: the same dates as in the file | /v1/campaigns or /v1/campaigns/{campaignId} |
Keywords | keywords: one text expression, not a list | /v1/campaigns/{campaignId} |
Influencers | stats.creators: every creator on the campaign, posted or not | /v1/campaigns or /v1/campaigns/{campaignId} |
Categories | category: comma-separated text | /v1/campaigns or /v1/campaigns/{campaignId} |
Currency | currency | /v1/campaigns or /v1/campaigns/{campaignId} |
Budget | budget. null when no budget is set | /v1/campaigns/{campaignId} |
Total Spend | spend. 0, not null, when nothing is recorded | /v1/campaigns or /v1/campaigns/{campaignId} |
CPP, CPVID, CPE, CPV, CPSV | not computed: see Cost efficiency | - |
New in the API, absent from the CSV: country_iso, modified_at, refreshed_at and the whole stats object, which includes activated_creators, the creators who posted (on both endpoints); po_number and instagram_story_tracking_enabled (on /v1/campaigns/{campaignId} only).
projects/influencers/influencers-all.json
Per-creator spend and deliverables. → Spend Data, Deliverables and fulfilment
Data Lake | API field | Endpoint |
accountId | implicit | - |
projectId | the campaign id in the path | - |
uid | creator_id | /v1/campaigns/{campaignId}/creators |
name | name | /v1/campaigns/{campaignId}/creators |
customFirstName / customLastName | not available | - |
not available | - | |
bio | description | /v1/campaigns/{campaignId}/creators |
location | location.display, with .country and .country_iso | /v1/campaigns/{campaignId}/creators |
audience | audience | /v1/campaigns/{campaignId}/creators |
postsCount | Σ contracted_posts in deliverables.by_platform. It counts contracted posts, not published ones | /v1/campaigns/{campaignId}/creators/spend |
costType[].name / .value | additional_costs.by_category[].category / .amount. The file gives the 4 system categories as codes; the API gives their labels: USAGE_RIGHTS → Usage Rights, EXCLUSIVITY → Exclusivity, AGENCY_FEE → Agency Fee, OTHER_COST → Other Cost. Custom categories keep their name. The file's text values become integers | /v1/campaigns/{campaignId}/creators/spend |
productCosts[].name / .total_value / .total_count | name / cost / quantity. total_value was the cost of one unit, as cost is. subtotal gives cost × quantity | /v1/campaigns/{campaignId}/creators/{creatorId}/products |
platforms.<platform> | platform, in lowercase: Instagram → instagram, YouTube → youtube. On each channel and each deliverable | /v1/creators/{creatorId}, /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
platforms.<platform>.metrics (cpp … cpsv) | not computed | - |
platforms.<platform>.channels[].uid | not available: an internal Traackr channel id. Match channels on platform and url | - |
platforms.<platform>.channels[].url / .username | channels[].url / channels[].username | /v1/creators/{creatorId} |
platforms.<platform>.channels[].audience | channels[].metrics.audience | /v1/creators/{creatorId} |
platforms.<platform>.channels[].engagementRate | channels[].metrics.engagement_rate. The creator's figure on that channel, not scoped to the campaign | /v1/creators/{creatorId} |
platforms.<platform>.channels[].totalAudienceCredibility | audiences[].credibility.from_followers, one entry per channel | /v1/creators/{creatorId}/audience |
platforms.<platform>.channels[].engagedAudienceCredibility | audiences[].credibility.from_engaged_audience. Instagram only | /v1/creators/{creatorId}/audience |
platforms.<platform>.deliverables[].type | media_type | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].count | number_of_posts | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].contentFee | content_cost: the fee for the whole line. agreed_rate gives the fee per post | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].engagementCollected | not available. It was false on story deliverables: media_type story tells you the same | - |
…deliverables[].usageRights | usage_rights | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].externalBoosted | boosted_cost greater than 0 | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].reviewBy / publishBy | review_by / publish_by | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].boostedFees[].value / .date | boosted_cost / boosted_on, one total per deliverable | /v1/campaigns/{campaignId}/creators/{creatorId}/deliverables |
…deliverables[].boostedFees[].postId | not available: boosting is not tied to a post in the API | - |
The structure is the same on both sides: deliverables belong to a platform, not to a channel. Each API deliverable carries its platform.
projects/influencers/influencers-summary.csv
→ Creators
Data Lake | API field | Endpoint |
Account ID, Project ID | implicit / the campaign id in the path | - |
UID | creator_id | /v1/campaigns/{campaignId}/creators |
Name | name | /v1/campaigns/{campaignId}/creators |
Custom First Name / Last Name | not available | - |
not available | - | |
Audience | audience | /v1/campaigns/{campaignId}/creators |
Eng. Rate (Min) / (Max) | not available | - |
Posts Count | Σ contracted_posts in deliverables.by_platform. An empty cell means 0 | /v1/campaigns/{campaignId}/creators/spend |
Total Cost | total_spend. A creator with nothing recorded is not listed. Asked directly on /v1/campaigns/{campaignId}/creators/{creatorId}/spend, it returns 0 | /v1/campaigns/{campaignId}/creators/spend |
CPP, CPVID, CPE, CPV, CPSV | not computed | - |
Review Status ID / Label | review_status.id / review_status.label | /v1/creators/{creatorId}/segments |
Review Status Expiration Date | not available: expired statuses cannot be detected | - |
reports/posts/*.csv
Identity and content
Data Lake | API field | Endpoint |
Account ID | implicit | - |
Project ID | the campaign id in the path | - |
Report ID | not needed: the API serves each campaign’s default report only. | - |
Keyword Group | not needed. A campaign’s default report has one keyword group, | /v1/campaigns/{campaignId} |
Date | published_at (UTC, as in the file) | /v1/campaigns/{campaignId}/posts |
Influencer Name | name, matched on creator_id | /v1/campaigns/{campaignId}/creators |
Influencer UID | creator_id | /v1/campaigns/{campaignId}/posts |
Platform | platform | /v1/campaigns/{campaignId}/posts |
Handle | channels[].username for that platform. A creator can have several channels on one platform, and handles change over time | /v1/creators/{creatorId} |
Channel id | not available: an internal Traackr channel id | - |
Post URL | url | /v1/campaigns/{campaignId}/posts |
Post Title | description (the caption). On YouTube, title (the video title) | /v1/campaigns/{campaignId}/posts |
Post id | post_id | /v1/campaigns/{campaignId}/posts |
Post Native id | not available as a field. On TikTok and YouTube the platform's id is in url. On Instagram, url carries the short code, not the numeric id | - |
Post Oauth Native id | not available | - |
Content Type | publication_type: Feed → feed, Story → story. Also clip, stream, and video_on_demand on Twitch | /v1/campaigns/{campaignId}/posts |
Post Type, Content Format | content_type: VIDEO → video, IMAGE (Photo) → image, CAROUSEL → album, MICRO_BLOG (Text) → text, UNKNOWN → unknown. null while a post is not yet collected | /v1/campaigns/{campaignId}/posts |
Video Length | video_type: short_form, long_form, or null. A new classification: do not compare it with the old column | /v1/campaigns/{campaignId}/posts |
Deliverable Type | not a field: apply Traackr's classification table in Deliverables and fulfilment | - |
Metrics
All on /v1/campaigns/{campaignId}/posts, except the last 2 rows.
Data Lake | API field |
Likes | metrics.reactions |
Comments | metrics.comments |
Shares, Instagram Shares | metrics.shares |
Saves, Tiktok Saves | metrics.saves. On Instagram, it is filled where Instagram reports saves to Traackr, which the Saves column never showed |
Engagements (total) | metrics.engagements, the same figure |
Video Views, Video Plays | metrics.video_views: plays on Instagram and TikTok, views on YouTube. On Instagram, both raw figures stay in raw_metrics |
Reach | metrics.actualized_reach |
Impressions | metrics.impressions |
Potential Reach | metrics.potential_reach |
Engagement Rate | metrics.engagement_rate |
Vitality Score | metrics.vit, on the same scale |
Earned Media Value | not a field: compute it, see below |
Video Plays Organic / Paid | metrics.organic_video_views / metrics.paid_video_views |
TikTok Engagements Organic / Paid | metrics.organic_engagements / metrics.paid_engagements. The API fields exclude saves |
TikTok Likes, Comments, Shares Organic / Paid | raw_metrics, for example tiktok_video_diggs_organic (diggs are TikTok likes) |
TikTok Engagement Rate Organic / Paid | raw_metrics: tiktok_video_engagement_rate_organic / _paid |
TikTok Two / Six Seconds Views | raw_metrics: tiktok_video_two_second_video_play / tiktok_video_six_second_video_play |
Story Replies, Story Tap Forward, Story Tap Back, Story Exits | raw_metrics: instagram_story_replies, instagram_story_taps_forward, instagram_story_taps_back, instagram_story_exits |
Avg View Time Secs, View Time Secs | raw_metrics on Instagram: instagram_avg_watch_time, instagram_video_view_total_time |
Snapchat columns | raw_metrics. The names start with snapchat_ but do not follow the column names |
Interactions, Screenshots, Subscribes, Swipe Ups, Swipe Downs, Unique Sessions | raw_metrics, where the platform reports them |
TikTok Audience Gender, Age, Device | not available per post. /v1/creators/{creatorId}/audience gives the follower audience of each channel |
Stream Avg / Peak Viewers, Stream Duration | not available |
raw_metrics names depend on the platform and the post. Read the names present in each response rather than expecting a fixed list.
Earned Media Value
The API has no EMV field, but it has its main ingredient. If your post files carry the Earned Media Value column, divide it by the Vitality Score on the same row: within one account, the result is the same on every post. Multiply metrics.vit by that number to get the EMV the Data Lake gave you. The number comes from your account's EMV factor, so it changes if an administrator changes the factor.
reports/influencers/*.csv
Per-creator figures. The API computes them for you on /v1/campaigns/{campaignId}/creators/metrics: one row per creator who posted, paginated and sortable. → Campaign performance without doing the maths
Data Lake | API field | Endpoint |
Account ID, Project ID | implicit / the campaign id in the path | - |
Report ID, Keyword Group | not needed: see the same rows in reports/posts | - |
Influencer UID | creator_id | /v1/campaigns/{campaignId}/creators/metrics |
Influencer Name | name, matched on creator_id | /v1/campaigns/{campaignId}/creators |
Audience | audience, matched on creator_id | /v1/campaigns/{campaignId}/creators |
Mentions | post_count | /v1/campaigns/{campaignId}/creators/metrics |
Engagements | engagements | /v1/campaigns/{campaignId}/creators/metrics |
Video Views | video_views | /v1/campaigns/{campaignId}/creators/metrics |
Story Views | impressions. Despite its name, the column summed the impressions of all the creator's posts, not only stories | /v1/campaigns/{campaignId}/creators/metrics |
Potential Reach | potential_reach | /v1/campaigns/{campaignId}/creators/metrics |
Engagement Rate | engagement_rate: computed differently, see below | /v1/campaigns/{campaignId}/creators/metrics |
Brand Safety Status | removed | - |
(new) | measured_post_count, reactions, comments, shares, saves, actualized_reach, vit, the other rates, and the organic/paid split | /v1/campaigns/{campaignId}/creators/metrics |
For one creator only, /v1/campaigns/{campaignId}/creators/{creatorId}/metrics returns the same row.
Expect more rows. The Data Lake file held at most 25 creators. The API returns every creator who posted.
Expect a different engagement rate. The API divides the summed engagements by the summed potential reach of the posts that report engagements. The Data Lake column was not computed that way, so the two rarely match. Take the API rate as served, and do not recompute it from engagements ÷ potential_reach on the same row: the denominators differ.
reports/summary/reports-overview-summary.csv
The QA file. Its figures are on the campaign itself, in 2 places:
Data Lake | stats on /v1/campaigns or /v1/campaigns/{campaignId} | /v1/campaigns/{campaignId}/metrics |
Account ID | implicit | implicit |
Project ID, Project Name | id, name | campaign_id |
Report ID | not available | not available |
Unique Influencers | stats.activated_creators | creator_count |
Total Posts | stats.posts | post_count |
Engagements (total) | stats.engagements | engagements |
Video Views | stats.video_views | video_views |
/metrics is computed on each request; stats is refreshed on a schedule and can be up to a day behind. For a QA check against the posts, use /metrics. Both cover the campaign’s default report. Figures from custom reports are not in the API.
clickConversions/ and benchmark/
Not available in the API. See What the API does not cover yet.
Concept mapping
Data Lake | API |
Project | Campaign |
Influencer | Creator |
Default report | the campaign itself: its posts are attached to it directly |
Custom report | (not in the API) |
Contracted post | Deliverable |
Published post | Post |
Export date, partition | (no equivalent: the API serves the current state only) |
Aggregating a report yourself | /v1/campaigns/{campaignId}/metrics and /v1/campaigns/{campaignId}/creators/metrics |
One folder per campaign | the campaign id in the URL |
Last reviewed: 30 October 2026.