Trendtrack
ReferenceAPI

Products

List products

Searches the products catalogue (the app's Products screen) by name, sorted by best-seller rank, recency, estimated sales, ad pressure or EU spend. Use POST /v1/products/query for every filter.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Query Parameters

query?string

Searched in product names. "a + b": all words; "a / b": at least one; "-c" excludes.

Lengthlength <= 200
sortBy?string

relevance: estimated monthly revenue and active ads multiplied (ln(2 + revenue) × ln(2 + active ads)²), so a product needs both to rank high and active ads weigh the most; it multiplies the text match when query is set. best-selling: shop best-seller rank. newest: Shopify publish date. est-sales: estimated revenue. ad-pressure: share of the shop's active ads on the product. spend: EU ad spend (Pro plans and above).

Default"best-selling"
Value in"relevance" | "best-selling" | "newest" | "est-sales" | "active-ads" | "ad-pressure" | "spend" | "spend-14d"
order?string

Defaults to asc for best-selling, desc for the others. Missing values always come last.

Value in"asc" | "desc"
shopId?string

One shop's catalogue instead of the whole index.

Formatuuid
limit?integer
Default25
Range1 <= value <= 100
cursor?string

pagination.nextCursor of the previous page.

Lengthlength <= 2000

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.trendtrack.io/v1/products"
{  "requestId": "string",  "data": [    {      "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",      "shopifyId": "7915404542236",      "title": "Loop Quiet 2",      "description": "string",      "url": "https://loopearplugs.com/products/loop-quiet-2",      "handle": "loop-quiet-2",      "imageUrl": "string",      "publishedAt": "string",      "price": {        "amount": 39.9,        "currency": "EUR",        "amountUsd": 43.5,        "compareAtAmount": 59.9,        "onSale": true,        "discountPercent": 33,        "isSubscription": true,        "promoTypes": [          "percent-off"        ]      },      "reviews": {        "rating": 4.7,        "count": 1280      },      "bestSellerRank": {        "position": 3,        "percentile": 2.5      },      "optionNames": [        "Color",        "Size"      ],      "sales": {        "dailyRevenueUsd": 1200,        "dailyRevenueRangeUsd": {          "min": 0,          "mean": 0,          "max": 0        },        "monthlyRevenueUsd": 36000,        "dailyUnitsSold": 30,        "monthlyUnitsSold": 900      },      "ads": {        "active": 12,        "total": 30,        "launched30d": 8,        "weekOverWeekGrowth": 25,        "adShare": 40,        "advertisersCount": 3,        "hasPartnershipAds": true,        "previewUrls": [          "string"        ],        "activeByCountry": [          {            "countryCode": "US",            "activeAds": 12          }        ],        "sellingCountries": [          "US",          "CA"        ]      },      "euMetrics": {        "locked": true,        "spendUsd": 4500,        "dailySpendUsd": 150,        "reach": 500000,        "spendShare": 12.5,        "reachByCountry": [          {            "countryCode": "FR",            "reach": 500000          }        ]      },      "weeklyHistory": [        {          "from": "2019-08-24",          "to": "2019-08-24",          "activeAds": 0,          "euDailySpendUsd": 0,          "euDailyReach": 0        }      ],      "shop": {        "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8",        "domain": "loopearplugs.com",        "name": "string",        "avatarUrl": "string",        "countryCode": "BE",        "currency": "EUR",        "productsCount": 0,        "monthlyVisits": 0,        "monthlyRevenueUsd": 0,        "createdAt": "2019-08-24",        "categoryIds": [          0        ]      }    }  ],  "pagination": {    "limit": 25,    "total": 1250,    "totalRelation": "eq",    "nextCursor": "string"  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

Query products

The products catalogue with every filter of the app's Products screen: price, reviews, best-seller rank, launch date, promotions, selling countries, estimated sales and units, ads (active, launched, share, partnership), EU/UK spend, and the shop's niche, traffic, origin and technologies. EU/UK data (euAdSpend, spendShare, sortBy=spend, euMetrics) opens on Pro plans and above.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

query?string

Searched in product names. "a + b": all words; "a / b": at least one; "-c" excludes.

Lengthlength <= 200
sortBy?string

relevance: estimated monthly revenue and active ads multiplied (ln(2 + revenue) × ln(2 + active ads)²), so a product needs both to rank high and active ads weigh the most; it multiplies the text match when query is set. best-selling: shop best-seller rank. newest: Shopify publish date. est-sales: estimated revenue. ad-pressure: share of the shop's active ads on the product. spend: EU ad spend (Pro plans and above).

Default"best-selling"
Value in"relevance" | "best-selling" | "newest" | "est-sales" | "active-ads" | "ad-pressure" | "spend" | "spend-14d"
order?string

Defaults to asc for best-selling, desc for the others. Missing values always come last.

Value in"asc" | "desc"
shopId?string

One shop's catalogue instead of the whole index.

Formatuuid
limit?integer
Default25
Range1 <= value <= 100
cursor?string

pagination.nextCursor of the previous page.

Lengthlength <= 2000
searchFields?array<>

Where query is searched.

Default["productName"]
cpm?number

CPM (USD) turning EU reach into estimated spend. Defaults to 9.

Range0.01 <= value <= 1000
subscription?string
Value in"subscription" | "one-time"
publishedAfter?string

Shopify creation date, inclusive.

Formatdate
publishedBefore?string

Shopify creation date, inclusive.

Formatdate
promoTypes?array<>

Only percent-off (a compare-at price) is told apart; any other type finds nothing.

currencies?array<string>

Shop currency, ISO 4217. Values: /v1/products/facets.

shopCountries?array<string>

Shop origin, ISO alpha-2. Values: /v1/products/facets.

sellingCountries?array<string>

Countries where the product has active ads (or active EU/UK reach, see sellingCountriesBasis), ISO alpha-2.

mainSellingCountries?array<string>

The product's main selling country is one of these, ISO alpha-2.

excludeSellingCountries?array<string>

Countries where the product must not be active, ISO alpha-2.

sellingCountriesBasis?string

adCount: countries with active ads. reach: EU/UK countries with active reach.

Default"adCount"
Value in"adCount" | "reach"
categoryIds?array<number>

Shop niche, Google category ids (/v1/facets/categories).

shopCreatedAfter?string

Shop creation date, inclusive.

Formatdate
shopCreatedBefore?string

Shop creation date, inclusive.

Formatdate
shopVisitorCountries?array<string>

The shop's top visitor countries, ISO alpha-2. Values: /v1/products/facets.

pixelIds?array<>

Shop pixels (/v1/facets/pixels).

shopifyAppIds?array<>

Shopify apps (/v1/facets/shopify-apps).

themeIds?array<>

Shopify themes (/v1/facets/themes).

adsLaunchedPeriod?string

Window of minAdsLaunched / maxAdsLaunched: 7, 14 or 30 days, or all time. Required with them.

Value in"7d" | "14d" | "30d" | "all"
minAdsLaunched?integer

Minimum ads launched for the product over adsLaunchedPeriod.

Range0 <= value
maxAdsLaunched?integer

Maximum ads launched for the product over adsLaunchedPeriod.

Range0 <= value
partnership?boolean

true: at least one partnership ad. false: none known.

minPrice?number

Minimum. Product price, USD. Products priced 0 are left out once set.

Range0 <= value
maxPrice?number

Maximum. Product price, USD. Products priced 0 are left out once set.

Range0 <= value
minRating?number

Minimum. Average review rating.

Range0 <= value
maxRating?number

Maximum. Average review rating.

Range0 <= value
minReviewCount?integer

Minimum. Number of reviews.

Range0 <= value
maxReviewCount?integer

Maximum. Number of reviews.

Range0 <= value
minBestSellerRank?integer

Minimum. Rank in the shop's Shopify best-seller collection, 1-100.

Range0 <= value
maxBestSellerRank?integer

Maximum. Rank in the shop's Shopify best-seller collection, 1-100.

Range0 <= value
minMonthlyRevenue?number

Minimum. Estimated revenue over the last 30 days, USD. Products the sales tracker does not follow never match.

Range0 <= value
maxMonthlyRevenue?number

Maximum. Estimated revenue over the last 30 days, USD. Products the sales tracker does not follow never match.

Range0 <= value
minMonthlyUnitsSold?integer

Minimum. Estimated units sold over the last 30 days.

Range0 <= value
maxMonthlyUnitsSold?integer

Maximum. Estimated units sold over the last 30 days.

Range0 <= value
minActiveAds?integer

Minimum. Active Meta ads pushing the product.

Range0 <= value
maxActiveAds?integer

Maximum. Active Meta ads pushing the product.

Range0 <= value
minAdShare?number

Minimum. Share of the shop's active ads pushing the product, in %.

Range0 <= value
maxAdShare?number

Maximum. Share of the shop's active ads pushing the product, in %.

Range0 <= value
minEuAdSpend?number

Minimum. Total EU ad spend, USD (EU reach x cpm / 1000). EU/UK data: Pro plans and above.

Range0 <= value
maxEuAdSpend?number

Maximum. Total EU ad spend, USD (EU reach x cpm / 1000). EU/UK data: Pro plans and above.

Range0 <= value
minSpendShare?number

Minimum. EU reach of the product over the EU reach of the pages pushing it, in %. EU/UK data: Pro plans and above.

Range0 <= value
maxSpendShare?number

Maximum. EU reach of the product over the EU reach of the pages pushing it, in %. EU/UK data: Pro plans and above.

Range0 <= value
minShopMonthlyVisits?integer

Minimum. Shop monthly visits.

Range0 <= value
maxShopMonthlyVisits?integer

Maximum. Shop monthly visits.

Range0 <= value
minShopTrafficGrowth30d?number

Minimum. Shop traffic change over 30 days, in % (negative for a decline).

Range-100 <= value
maxShopTrafficGrowth30d?number

Maximum. Shop traffic change over 30 days, in % (negative for a decline).

Range-100 <= value
minShopProductsCount?integer

Minimum. Number of products in the shop.

Range0 <= value
maxShopProductsCount?integer

Maximum. Number of products in the shop.

Range0 <= value

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.trendtrack.io/v1/products/query" \  -H "Content-Type: application/json" \  -d '{}'
{  "requestId": "string",  "data": [    {      "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",      "shopifyId": "7915404542236",      "title": "Loop Quiet 2",      "description": "string",      "url": "https://loopearplugs.com/products/loop-quiet-2",      "handle": "loop-quiet-2",      "imageUrl": "string",      "publishedAt": "string",      "price": {        "amount": 39.9,        "currency": "EUR",        "amountUsd": 43.5,        "compareAtAmount": 59.9,        "onSale": true,        "discountPercent": 33,        "isSubscription": true,        "promoTypes": [          "percent-off"        ]      },      "reviews": {        "rating": 4.7,        "count": 1280      },      "bestSellerRank": {        "position": 3,        "percentile": 2.5      },      "optionNames": [        "Color",        "Size"      ],      "sales": {        "dailyRevenueUsd": 1200,        "dailyRevenueRangeUsd": {          "min": 0,          "mean": 0,          "max": 0        },        "monthlyRevenueUsd": 36000,        "dailyUnitsSold": 30,        "monthlyUnitsSold": 900      },      "ads": {        "active": 12,        "total": 30,        "launched30d": 8,        "weekOverWeekGrowth": 25,        "adShare": 40,        "advertisersCount": 3,        "hasPartnershipAds": true,        "previewUrls": [          "string"        ],        "activeByCountry": [          {            "countryCode": "US",            "activeAds": 12          }        ],        "sellingCountries": [          "US",          "CA"        ]      },      "euMetrics": {        "locked": true,        "spendUsd": 4500,        "dailySpendUsd": 150,        "reach": 500000,        "spendShare": 12.5,        "reachByCountry": [          {            "countryCode": "FR",            "reach": 500000          }        ]      },      "weeklyHistory": [        {          "from": "2019-08-24",          "to": "2019-08-24",          "activeAds": 0,          "euDailySpendUsd": 0,          "euDailyReach": 0        }      ],      "shop": {        "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8",        "domain": "loopearplugs.com",        "name": "string",        "avatarUrl": "string",        "countryCode": "BE",        "currency": "EUR",        "productsCount": 0,        "monthlyVisits": 0,        "monthlyRevenueUsd": 0,        "createdAt": "2019-08-24",        "categoryIds": [          0        ]      }    }  ],  "pagination": {    "limit": 25,    "total": 1250,    "totalRelation": "eq",    "nextCursor": "string"  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

List product filter values

Currencies, shop origins and shop visitor countries across the products catalogue, with product counts.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.trendtrack.io/v1/products/facets"
{  "requestId": "string",  "data": {    "currencies": [      {        "value": "US",        "count": 120000      }    ],    "shopCountries": [      {        "value": "US",        "count": 120000      }    ],    "shopVisitorCountries": [      {        "value": "US",        "count": 120000      }    ]  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

Look up a product by its page url

Finds the catalogue product behind a Shopify product page url, with its full sheet. Same payload as GET /v1/products/{productId}.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Query Parameters

url*string

A Shopify product page: https:///products/.

Lengthlength <= 2000

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.trendtrack.io/v1/products/lookup?url=https%3A%2F%2Floopearplugs.com%2Fproducts%2Floop-quiet-2"
{  "requestId": "string",  "data": {    "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",    "shopifyId": "7915404542236",    "title": "Loop Quiet 2",    "description": "string",    "url": "https://loopearplugs.com/products/loop-quiet-2",    "handle": "loop-quiet-2",    "imageUrl": "string",    "publishedAt": "string",    "price": {      "amount": 39.9,      "currency": "EUR",      "amountUsd": 43.5,      "compareAtAmount": 59.9,      "onSale": true,      "discountPercent": 33,      "isSubscription": true,      "promoTypes": [        "percent-off"      ]    },    "reviews": {      "rating": 4.7,      "count": 1280    },    "bestSellerRank": {      "position": 3,      "percentile": 2.5    },    "optionNames": [      "Color",      "Size"    ],    "sales": {      "dailyRevenueUsd": 1200,      "dailyRevenueRangeUsd": {        "min": 0,        "mean": 0,        "max": 0      },      "monthlyRevenueUsd": 36000,      "dailyUnitsSold": 30,      "monthlyUnitsSold": 900    },    "ads": {      "active": 12,      "total": 30,      "launched30d": 8,      "weekOverWeekGrowth": 25,      "adShare": 40,      "advertisersCount": 3,      "hasPartnershipAds": true,      "previewUrls": [        "string"      ],      "activeByCountry": [        {          "countryCode": "US",          "activeAds": 12        }      ],      "sellingCountries": [        "US",        "CA"      ]    },    "euMetrics": {      "locked": true,      "spendUsd": 4500,      "dailySpendUsd": 150,      "reach": 500000,      "spendShare": 12.5,      "reachByCountry": [        {          "countryCode": "FR",          "reach": 500000        }      ]    },    "weeklyHistory": [      {        "from": "2019-08-24",        "to": "2019-08-24",        "activeAds": 0,        "euDailySpendUsd": 0,        "euDailyReach": 0      }    ],    "shop": {      "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8",      "domain": "loopearplugs.com",      "name": "string",      "avatarUrl": "string",      "countryCode": "BE",      "currency": "EUR",      "productsCount": 0,      "monthlyVisits": 0,      "monthlyRevenueUsd": 0,      "createdAt": "2019-08-24",      "categoryIds": [        0      ]    },    "detail": {      "images": [        "string"      ],      "productType": "string",      "options": [        {          "name": "Color",          "values": [            "Black",            "White"          ]        }      ],      "sellingPlans": [        {          "name": "Color",          "values": [            "Black",            "White"          ]        }      ],      "mediaCount": 0,      "shopActiveAds": 0,      "dailySales": [        {          "date": "2019-08-24",          "revenueUsd": 0        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

List a product's ads

The Meta ads that link to the product page, newest first, in the /v1/ads format. Ad ids work with /v1/ads/{adId} and as board items.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Path Parameters

productId*string

The id returned by product search: {shopId}:{shopifyId}, or {shopId}:handle:{handle}.

Query Parameters

status?string
Default"all"
Value in"active" | "inactive" | "all"
page?integer
Default1
Range1 <= value <= 100
limit?integer
Default24
Range1 <= value <= 50

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.trendtrack.io/v1/products/3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236/ads"
{  "requestId": "string",  "product": {    "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",    "title": "string",    "url": "string",    "landingPage": "loopearplugs.com/products/loop-quiet-2"  },  "data": [    {      "id": "facebook_123456789",      "collationId": "3810635369204881",      "platform": "facebook",      "status": "active",      "createdAt": "2026-04-18T12:30:00.000Z",      "firstSeenAt": "2026-04-10T00:00:00.000Z",      "lastSeenAt": "2026-04-19T00:00:00.000Z",      "daysRunning": 9,      "media": {        "type": "video",        "thumbnailUrl": "https://cdn.example.com/ads/ad-1-thumb.jpg",        "mediaUrl": "https://cdn.example.com/ads/ad-1.mp4"      },      "advertiser": {        "id": "1234567890",        "name": "Example Brand",        "logoUrl": "https://cdn.example.com/pages/example-brand.png",        "facebookPageId": "1234567890",        "liveAdsCount": 42,        "reach30d": 152340,        "totalReach": 842100,        "countriesCount": 8,        "facebookLikes": 125000,        "instagramFollowers": 89000      },      "content": {        "title": "Summer Sale",        "body": "Up to 30% off selected products.",        "transcript": "Save 30% on every order.",        "callToAction": "Shop now",        "landingPageUrl": "https://example.com/products/summer-sale",        "landingPageDomain": "example.com",        "ctaDescription": "Free shipping on orders over $50.",        "ctaLinkDescription": "Shop the full collection"      },      "metrics": {        "reach": 152340,        "aggregatedReach": 284100,        "estimatedSpend": 4262,        "duplicates": 4,        "reachDelta1d": 1200,        "reachDelta7d": 8200,        "reachDelta30d": 38400      },      "audience": {        "targetedCountries": [          "US",          "FR"        ],        "mainCountry": "FR",        "gender": "all",        "ageMin": 18,        "ageMax": 65      },      "rank": {        "positionInPage": 3,        "currentRank": 12,        "rankDelta": -4,        "improvementPct": 0.25      },      "flags": {        "isEuAd": true,        "isLowReach": false,        "isMediaChanged": false,        "hasPartnerBadge": true      }    }  ],  "pagination": {    "page": 1,    "limit": 25,    "total": 235,    "totalPages": 10  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

Returns the public product sheet link, reusing the caller's active link for this product. The public sheet never carries EU/UK data.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Path Parameters

productId*string

The id returned by product search: {shopId}:{shopifyId}, or {shopId}:handle:{handle}.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.trendtrack.io/v1/products/3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236/share-links"
{  "requestId": "string",  "data": {    "productId": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",    "url": "https://app.trendtrack.io/en/share/product/abc123",    "createdAt": "2019-08-24T14:15:22Z"  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}

Get a product

The product as search returns it, plus its sheet: every photo, options, subscription plans, and estimated sales day by day over 90 days.

Authorization

publicApiBearer
AuthorizationBearer <token>

Provide a Trendtrack Public API key using Authorization: Bearer <api_key>.

In: header

Path Parameters

productId*string

The id returned by product search: {shopId}:{shopifyId}, or {shopId}:handle:{handle}.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.trendtrack.io/v1/products/3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236"
{  "requestId": "string",  "data": {    "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8:7915404542236",    "shopifyId": "7915404542236",    "title": "Loop Quiet 2",    "description": "string",    "url": "https://loopearplugs.com/products/loop-quiet-2",    "handle": "loop-quiet-2",    "imageUrl": "string",    "publishedAt": "string",    "price": {      "amount": 39.9,      "currency": "EUR",      "amountUsd": 43.5,      "compareAtAmount": 59.9,      "onSale": true,      "discountPercent": 33,      "isSubscription": true,      "promoTypes": [        "percent-off"      ]    },    "reviews": {      "rating": 4.7,      "count": 1280    },    "bestSellerRank": {      "position": 3,      "percentile": 2.5    },    "optionNames": [      "Color",      "Size"    ],    "sales": {      "dailyRevenueUsd": 1200,      "dailyRevenueRangeUsd": {        "min": 0,        "mean": 0,        "max": 0      },      "monthlyRevenueUsd": 36000,      "dailyUnitsSold": 30,      "monthlyUnitsSold": 900    },    "ads": {      "active": 12,      "total": 30,      "launched30d": 8,      "weekOverWeekGrowth": 25,      "adShare": 40,      "advertisersCount": 3,      "hasPartnershipAds": true,      "previewUrls": [        "string"      ],      "activeByCountry": [        {          "countryCode": "US",          "activeAds": 12        }      ],      "sellingCountries": [        "US",        "CA"      ]    },    "euMetrics": {      "locked": true,      "spendUsd": 4500,      "dailySpendUsd": 150,      "reach": 500000,      "spendShare": 12.5,      "reachByCountry": [        {          "countryCode": "FR",          "reach": 500000        }      ]    },    "weeklyHistory": [      {        "from": "2019-08-24",        "to": "2019-08-24",        "activeAds": 0,        "euDailySpendUsd": 0,        "euDailyReach": 0      }    ],    "shop": {      "id": "3f8aa146-6f96-46e8-9781-64db5166f9a8",      "domain": "loopearplugs.com",      "name": "string",      "avatarUrl": "string",      "countryCode": "BE",      "currency": "EUR",      "productsCount": 0,      "monthlyVisits": 0,      "monthlyRevenueUsd": 0,      "createdAt": "2019-08-24",      "categoryIds": [        0      ]    },    "detail": {      "images": [        "string"      ],      "productType": "string",      "options": [        {          "name": "Color",          "values": [            "Black",            "White"          ]        }      ],      "sellingPlans": [        {          "name": "Color",          "values": [            "Black",            "White"          ]        }      ],      "mediaCount": 0,      "shopActiveAds": 0,      "dailySales": [        {          "date": "2019-08-24",          "revenueUsd": 0        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}
{  "error": {    "code": "missing_api_key",    "message": "Provide an API key using Authorization: Bearer <api_key>.",    "requestId": "5d93d8de-0f6d-46a4-bd10-2e519b7e96bc",    "details": {      "validationErrors": [        {          "field": "query-string.limit",          "location": "query-string",          "expected": [            "limit must not be greater than 100"          ]        }      ]    }  }}