Sendyx Docs
PTEN
Go to consoleConsole

Getting started

Data from the TikTok Shop product catalog in JSON, charged by credit. This is the reference for version 1.

Base URL

https://developers.sendyx.com/v1

The complete contract in OpenAPI format is at /openapi.en.json.

Authentication

Create a key in the Sendyx console and send it in the header Authorization: Bearer sdx_live_.... Store the key in an environment variable and never put it in code, in a repository, or in a browser. It is shown only once.

Test environment (sandbox)

To build and test your integration without spending credits, create a test key in the console and send Authorization: Bearer sdx_test_.... The same /v1 routes respond in the same format, from a fixed set of fictional data: the ids and numbers are always the same, so you can write repeatable tests.

The key decides the environment. A test key works on https://developers.sendyx.com/v1 and on https://sandbox.sendyx.com/v1; the test address accepts test keys only. A production key on the test address, or a test key outside /v1, gets the same 401 invalid_credentials as any invalid key. Each account can have up to 5 active test keys, in addition to the 5 production keys.

With a test key nothing is charged or required: no balance, no acceptance of the terms of use, no mature account. The API does not query the data source or the production database. Every response carries X-Sendyx-Environment: sandbox, x-credits-cost: 0.00, and x-credits-remaining: 1000.00 (fictional balance). The body has the same envelope as production.

Test data

The catalog has 24 fictional products, with the same filters, sort orders, and pagination as GET /v1/products, and Brecha and categories come from it. Names, shops, videos, lives, and creators are made up; images point to exemplo.invalid. Creator contacts (GET /v1/creators/{id}/contacts) are fictional (@exemplo.invalid) and the route responds in test even when it is unavailable in production. The lists of videos, creators, shops, lives, and categories have few items.

Id rule. Every id a test list returns opens the detail, the analysis, the series, and the nested lists: you can go from the list to the detail with the id you received. In practice, any 19-digit id that starts with 999 (the fictional test ids) is accepted and always returns the same body, with the id you asked for. The ones in the table below are examples. Category also opens the taxonomy id that the category ranking returns. Any other id responds 404 on details and an empty list on per-entity lists, like the real route.

RouteTest id
GET /v1/products/{id}, /analysis, /videos, /creators9990969421641471500
GET /v1/products/{id}/trend9990866258189766001
GET /v1/videos/{id}9990766912945219402
GET /v1/videos/{id}/products9990766912945219402
GET /v1/creators/{id} and /contacts9993000000000000001
GET /v1/creators/{id}/products9993000000000000001
GET /v1/shops/{id}9990820431382416103
GET /v1/shops/{id}/products, /videos, /creators9990820431382416103
GET /v1/lives/{id}9990114260194168264
GET /v1/lives/{id}/products9990114260194168264
GET /v1/categories/{id}9990206017089333354

Example of an item from GET /v1/products in test:

{
  "id": "9990969421641471500",
  "name": "Sérum Facial de Exemplo 01",
  "coverUrl": "https://exemplo.invalid/sandbox/produto-01.jpg",
  "productUrl": "https://exemplo.invalid/sandbox/produto/9990969421641471500",
  "categoryL1": {
    "id": "601450",
    "name": "Beleza"
  },
  "categoryL2": {
    "id": "990101",
    "name": "Cuidados com a pele (exemplo)"
  },
  "categoryL3": {
    "id": "990111",
    "name": "Séruns (exemplo)"
  },
  "shopName": "Loja Exemplo 01",
  "reviewCount": 120,
  "minPrice": 3200,
  "maxPrice": 4800,
  "commission": 0.08,
  "revenue": 106375,
  "sales": 2659,
  "revenue30d": 462500,
  "sales30d": 11563,
  "sales7d": 2659,
  "revenuePerCreator": 13602.94,
  "acceleration": 0.89,
  "trend": [
    308,
    578,
    463,
    347,
    617,
    501,
    385,
    270,
    540,
    424,
    308,
    578,
    463,
    347
  ],
  "state": "exploding",
  "launchDate": "2026-02-02",
  "rank": 1,
  "prevRank": 1,
  "channel": {
    "videoRevenue": 231250,
    "liveRevenue": 138750,
    "creatorsMeasured": 34
  }
}

Test limits

Up to 1000 calls per day per account, across all test keys. The day rolls over at midnight in Brasilia (Sao Paulo time). Above that the response is 429 rate_limited with Retry-After until the rollover. There is also a limit of 60 calls per minute per key. The console shows the day's usage and recent calls.

Simulate errors

Send the x-sandbox-scenario header with one of the values below and the API returns exactly the real error, spending nothing. A production key ignores this header. An unknown value is 400.

ValueStatuserrorWhen
insufficient_credits402insufficient_creditsInsufficient balance. The body carries required and available.
rate_limited429rate_limitedRequest limit. Comes with Retry-After.
not_found404not_foundResource not found.
upstream_unavailable503upstream_unavailableData service unavailable. Comes with Retry-After.

Body of the 402 forced by insufficient_credits:

{
  "error": "insufficient_credits",
  "message": "Insufficient credits.",
  "required": 0.1,
  "available": 0,
  "requestId": "3f6c1d2e-8a4b-4c7e-9b1a-5d2e7f9a0c11"
}

Example test call (the test key lives in SENDYX_API_KEY):

Example data (identifiers and contacts are fake): the format is real, so you can build mocks and tests.
curl -G 'https://sandbox.sendyx.com/v1/products' \
  -H "Authorization: Bearer $SENDYX_API_KEY" \
  --data-urlencode 'sortBy=revenue'
const params = new URLSearchParams({
  "sortBy": "revenue",
});

const res = await fetch(`https://sandbox.sendyx.com/v1/products?${params}`, {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.SENDYX_API_KEY}` },
});

if (!res.ok) {
  const error = await res.json();
  throw new Error(`${res.status} ${error.error}: ${error.message}`);
}

console.log(
  "cost:", res.headers.get("x-credits-cost"),
  "balance:", res.headers.get("x-credits-remaining"),
);
const body = await res.json();
console.log(body);
import os
import requests

response = requests.get(
    "https://sandbox.sendyx.com/v1/products",
    headers={"Authorization": f"Bearer {os.environ['SENDYX_API_KEY']}"},
    params={
        "sortBy": "revenue",
    },
)
response.raise_for_status()

print(
    "cost:", response.headers.get("x-credits-cost"),
    "balance:", response.headers.get("x-credits-remaining"),
)
print(response.json())

Credits

Each list or detail request for any entity consumes 0.10 credits. So 1 credit equals 10 requests. The category tree (GET /v1/categories) and the balance (GET /v1/account/usage) are free; the other category routes, such as GET /v1/categories/ranking, consume the same as the others. The cost of each route appears at the top of its page.

A creator's contacts are an extra lookup: 0.02 credits when you already looked up the creator in the last 24 hours, or 0.12 credits (0.10 for the creator plus 0.02 for the contacts) when the creator has not been looked up yet. Requesting the same creator's contacts again costs 0.02 per request. You must have accepted the API terms of use in the console.

If the data service is unavailable, the response is 503 and no credits are charged.

You must buy credits to use the API. A new account starts with a zero balance, with no courtesy credits, and paid routes respond 402 until the first purchase, made in the Sendyx console. Purchased credits do not expire.

The cost is debited before the response is served. A request with an invalid parameter (400) charges nothing, and if it ends in an error after the charge the credit is refunded immediately. Without enough balance the response is 402.

Response headers

HeaderMeaning
x-credits-costCredits charged for this response, always with two decimal places (for example 0.10, 0.02, or 0.12). It comes on 200 responses, on 402 (with 0.00), and on errors that happen after the charge and were refunded, such as 404 and 503 (with 0.00). It does not come on 401, on 429, or on parameter 400s, which are rejected before the charge.
x-credits-remainingRemaining balance in credits, always with two decimal places (for example 4.90). On the same responses as the header above; on 402 it is the current balance.
x-request-idRequest identifier. Include it when contacting support.
Retry-AfterPresent on 429 and 503: seconds until you can try again.

The /v1 routes accept GET only. A HEAD gets 405 with Allow: GET, with no lookup and no charge.

In headers, credits are text with two decimal places. In the JSON body, numbers are numeric and JSON does not preserve trailing zeros: 0.10 in the header becomes 0.1 in the body.

Markets

The region parameter picks the market and the default is BR. Two routes exist for Brazil only: asking for region=US on them is 400 and nothing is charged. All the others accept BR and US.

MarketRoutesCurrency
BRBR only: category tree (GET /v1/categories) and creator contacts (GET /v1/creators/{id}/contacts).BRL
BR and USCatalog (GET /v1/products), product detail (GET /v1/products/{id}), and Brecha (GET /v1/brecha); overall product ranking (GET /v1/products/ranking) and the other gateway routes: rankings and details of videos, creators, categories, shops, and lives, products of an entity, and videos, creators, analysis, and series of a product.BRL in BR, USD in the US

US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. The meta.currency field tells the currency of each response.

On GET /v1/products, GET /v1/products/{id}, and GET /v1/brecha, while the US catalog is not yet visible, the US response comes back empty (404 on detail) and nothing is charged (x-credits-cost: 0.00). In US Brecha, the minRevenue30d floor (default 10000) applies in dollars.

Data age

The video, creator, category (ranking and detail), shop, live, and product analysis routes carry meta.fetchedAt, the moment (ISO 8601) the data was obtained. The product routes and the category tree carry meta.dataUpTo, the most recent day of data, in yyyy-MM-dd format; the source is one day behind. If the data service is unavailable, the response is 503 and nothing is charged.

Error format

Every error has the format { "error", "message", "requestId" }. The error field is stable and can be used in code.

The message field is human-readable text and follows the Accept-Language header: English if the header prefers en, Portuguese otherwise. Integrate by error, never by the sentence.

CodeerrorWhen
401missing_credentialsAuthorization header missing.
401invalid_credentialsInvalid or revoked key.
402insufficient_creditsBalance lower than the cost. Carries required and available, in credits.
429rate_limitedRequest limit exceeded. See the Retry-After header.
400validation_errorInvalid, unknown, or out-of-range parameter.
404not_foundResource does not exist.
500internal_errorOur failure. The credit is refunded.
503upstream_disabledThe data service is turned off. Nothing is charged.
503upstream_budget_exceededThe data service query limit is used up for now. Try later. Nothing is charged.
503upstream_unavailableThe data service failed, is busy, or the live lookup queue is full. Try again after the Retry-After time. Nothing is charged.
429contacts_daily_limitDaily limit of contact lookups for the account reached (sum of all keys). See Retry-After. Nothing is charged.
429miss_quota_exceededQuota of new lookups in the last 60 minutes reached, per key and per account (cached lookups do not count). The window is rolling: slots come back gradually, see Retry-After. Nothing is charged.
429daily_spend_limit_exceededDaily spending limit of the account reached (sum of all keys; resets at midnight UTC). See Retry-After. Nothing is charged.
403terms_not_acceptedThe API terms of use have not been accepted by the key owner. Accept them in the console. Nothing is charged.

Rate limits

Up to 60 requests per minute and 10000 per day, per key. There is also a limit of 300 requests per minute per IP address, which applies even to attempts with a wrong key. When exceeded, the response is 429 with Retry-After.

Pagination and data freshness

Lists have a fixed page size of 10, with page from 1 to 50. The response carries pagination with page, pageSize, total, and totalPages. total is the real result count, and totalPages never exceeds 50, which is the last page the API delivers (asking for page 51 is 400). To reach what lies beyond the first 500, narrow down by filter and sort order.

Every data response carries meta.dataUpTo, the most recent day of data (the source is one day behind), and meta.currency, the currency of the values.

Your first call

Check your balance. It is free:

Example data (identifiers and contacts are fake): the format is real, so you can build mocks and tests.
curl 'https://developers.sendyx.com/v1/account/usage' \
  -H "Authorization: Bearer $SENDYX_API_KEY"
const res = await fetch("https://developers.sendyx.com/v1/account/usage", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.SENDYX_API_KEY}` },
});

if (!res.ok) {
  const error = await res.json();
  throw new Error(`${res.status} ${error.error}: ${error.message}`);
}

console.log(
  "cost:", res.headers.get("x-credits-cost"),
  "balance:", res.headers.get("x-credits-remaining"),
);
const body = await res.json();
console.log(body);
import os
import requests

response = requests.get(
    "https://developers.sendyx.com/v1/account/usage",
    headers={"Authorization": f"Bearer {os.environ['SENDYX_API_KEY']}"},
)
response.raise_for_status()

print(
    "cost:", response.headers.get("x-credits-cost"),
    "balance:", response.headers.get("x-credits-remaining"),
)
print(response.json())

Products / List catalog products

List catalog products

GEThttps://developers.sendyx.com/v1/products

0.10 credits per request

Lists the catalog products with the Radar filters and sort orders: category, revenue range, price, commission, signals, and product momentum.

Parameters

18
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US. While the US catalog is not visible, the US response comes back empty (404 on detail) and nothing is charged.
searchstringNoup to 100 charactersPart of the product name (up to 100 characters).
categoryL1IdstringNoformat ^\d{1,32}$Level 1 category id.
categoryL2IdstringNoformat ^\d{1,32}$Level 2 category id.
categoryL3IdstringNoformat ^\d{1,32}$Level 3 category id.
categoryL1IdsstringNoUp to 5 level 1 ids separated by commas (OR between them).
categoryL2IdsstringNoUp to 5 level 2 ids separated by commas.
categoryL3IdsstringNoUp to 5 level 3 ids separated by commas.
sortBystringNorevenue, sales, revenue30d, sales30d, acceleration, revenuePerCreator, commissionDescending sort order. Defaults to revenue.
flagsstringNoSignals, separated by commas (all of them must hold).
statesstringNoProduct momentum, separated by commas (OR between them): exploding, accelerating, stable, cooling, idle.
windowintegerNo1, 7, 30Window of the revenue and sales metrics, in days. Defaults to 7.
minGmvintegerNominimum 0Minimum revenue over 30 days, in the market currency (integer).
maxGmvintegerNominimum 0Maximum revenue over 30 days, in the market currency (integer).
minCommissionnumberNominimum 1; maximum 100Minimum commission as a percentage (20 = 20%).
launchedWithinDaysintegerNo1, 7, 30, 90Only products launched in the last N days.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

43
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop. Use it in GET /v1/products/{id}.
data[].namestringProduct name.
data[].coverUrlstring | nullCover URL.
data[].productUrlstringProduct page on TikTok Shop.
data[].categoryL1object | nullLevel 1 category (id and name).
data[].categoryL1.idstring
data[].categoryL1.namestring
data[].categoryL2object | nullLevel 2 category, when it exists.
data[].categoryL2.idstring
data[].categoryL2.namestring
data[].categoryL3object | nullLevel 3 category, when it exists.
data[].categoryL3.idstring
data[].categoryL3.namestring
data[].shopNamestring | nullShop name.
data[].reviewCountinteger | nullNumber of reviews. Only once the product detail has been collected.
data[].minPriceinteger | nullLowest variation price, in cents. Only once the product detail has been collected.
data[].maxPriceinteger | nullHighest variation price, in cents. Only once the product detail has been collected.
data[].commissionnumber | nullFraction: 0.1 is 10%.
data[].revenuenumber | nullRevenue in the requested window, in the market currency.
data[].salesinteger | nullUnits sold in the requested window.
data[].revenue30dnumber | nullRevenue over the last 30 days, in the market currency.
data[].sales30dinteger | nullUnits sold in the last 30 days.
data[].sales7dinteger | nullUnits sold in the last 7 days.
data[].revenuePerCreatornumber | null30-day revenue divided by the measured creators. Only exists when the creator count was measured; otherwise null.
data[].accelerationnumber | nullYesterday's pace divided by the 30-day daily average. Above 1 means acceleration.
data[].trendarray of numberSales per day to draw a curve, from the oldest day to the most recent.
data[].statestring | nullProduct momentum: exploding, accelerating, cooling, stable, or idle.
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd), when measured.
data[].rankinteger | nullPosition in the catalog by 7-day sales.
data[].prevRankinteger | nullPosition in the previous cycle.
data[].channelobjectRevenue by channel (video and live) and measured creators.
data[].channel.videoRevenuenumber | null
data[].channel.liveRevenuenumber | null
data[].channel.creatorsMeasuredinteger | null
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.totalinteger
pagination.totalPagesinteger
metaobject
meta.dataUpTostring | nullMost recent day of data (yyyy-MM-dd).
meta.currencystring

Possible errors

4
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limitedRequest limit exceeded. See the Retry-After header.

Notes

  • The page size is fixed at 10. Sending pageSize with any other value returns 400.
  • Pages run from 1 to 50. To go further, narrow down with filters and sorting.
  • An unknown parameter returns 400. Items outside the allowed list in flags, states, and sortBy also return 400.
  • meta.dataUpTo is the most recent day of data. The source is one day behind.
  • commission is a fraction (0.15 is 15%). minPrice and maxPrice, in cents, are only returned once the product detail has been collected.
  • A request with a validation error does not consume credits.
  • region accepts BR (default) and US. US data comes as stored: names in English and values in USD (meta.currency tells the currency). While the US catalog is not visible, the US response comes back empty, with a null meta.dataUpTo, and costs 0.00 (nothing is charged). With sortBy=acceleration, a product without the yesterday and 30-day windows from the same collection has no value and goes to the end of the list, as in BR.

Products / Product detail

Product detail

GEThttps://developers.sendyx.com/v1/products/{id}

0.10 credits per request

Detail of a catalog product, with the extra short-window fields (7 days and yesterday) and saturation. Returns what is in the current catalog.

Parameters

2
NameTypeRequiredAllowed valuesDescription
id (path)stringYesProduct id (the id field of GET /v1/products).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US. While the US catalog is not visible, the US response comes back empty (404 on detail) and nothing is charged.

Response fields

41
FieldTypeDescription
dataobject
data.idstringProduct id on TikTok Shop. Use it in GET /v1/products/{id}.
data.namestringProduct name.
data.coverUrlstring | nullCover URL.
data.productUrlstringProduct page on TikTok Shop.
data.categoryL1object | nullLevel 1 category (id and name).
data.categoryL1.idstring
data.categoryL1.namestring
data.categoryL2object | nullLevel 2 category, when it exists.
data.categoryL2.idstring
data.categoryL2.namestring
data.categoryL3object | nullLevel 3 category, when it exists.
data.categoryL3.idstring
data.categoryL3.namestring
data.shopNamestring | nullShop name.
data.reviewCountinteger | nullNumber of reviews. Only once the product detail has been collected.
data.minPriceinteger | nullLowest variation price, in cents. Only once the product detail has been collected.
data.maxPriceinteger | nullHighest variation price, in cents. Only once the product detail has been collected.
data.commissionnumber | nullFraction: 0.1 is 10%.
data.revenuenumber | nullRevenue in the requested window, in the market currency.
data.salesinteger | nullUnits sold in the requested window.
data.revenue30dnumber | nullRevenue over the last 30 days, in the market currency.
data.sales30dinteger | nullUnits sold in the last 30 days.
data.sales7dinteger | nullUnits sold in the last 7 days.
data.revenuePerCreatornumber | null30-day revenue divided by the measured creators. Only exists when the creator count was measured; otherwise null.
data.accelerationnumber | nullYesterday's pace divided by the 30-day daily average. Above 1 means acceleration.
data.trendarray of numberSales per day to draw a curve, from the oldest day to the most recent.
data.statestring | nullProduct momentum: exploding, accelerating, cooling, stable, or idle.
data.launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd), when measured.
data.rankinteger | nullPosition in the catalog by 7-day sales.
data.prevRankinteger | nullPosition in the previous cycle.
data.channelobjectRevenue by channel (video and live) and measured creators.
data.channel.videoRevenuenumber | null
data.channel.liveRevenuenumber | null
data.channel.creatorsMeasuredinteger | null
data.revenue7dnumber | nullRevenue over the last 7 days.
data.revenue1dnumber | nullYesterday's revenue.
data.saturationnumber | nullCreators per 10,000 of revenue over 30 days. Only exists when the creator count was measured; otherwise null.
metaobject
meta.dataUpTostring | nullMost recent day of data (yyyy-MM-dd).
meta.currencystring

Possible errors

5
CodeerrorWhen
400validation_errorInvalid parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
404not_foundProduct not found.
429rate_limitedRequest limit exceeded. See the Retry-After header.

Notes

  • Returns only what is already in our database. A product outside the current catalog returns 404.
  • The 404 does not consume credits: the debited amount is refunded immediately.
  • The id is the id field returned by GET /v1/products.
  • region accepts BR (default) and US. While the US catalog is not visible, the US detail responds 404 and costs 0.00 (nothing is charged). US data comes as stored: names in English and values in USD.

Products / Product analysis

Product analysis

GEThttps://developers.sendyx.com/v1/products/{id}/analysis

0.10 credits per request

Product highlights and attributes, as text in the language of the market (Portuguese for BR, English for US).

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Product id (the id field of GET /v1/products).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

14
FieldTypeDescription
dataobject
data.productIdstring
data.regionstring | null
data.languagestring | null
data.highlightsarray of objectProduct highlights.
data.highlights[].keywordstring | null
data.highlights[].textstring | null
data.attributesarray of objectProduct attributes.
data.attributes[].keystring | null
data.attributes[].valuestring | null
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Descriptive product text, as it was registered in the shop.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Daily revenue series of a product

Daily revenue series of a product

GEThttps://developers.sendyx.com/v1/products/{id}/trend

0.10 credits per request

Revenue per day of the product, with derived dates. Use it to draw the product curve.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Product id (the id field of GET /v1/products).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

9
FieldTypeDescription
dataobject
data.productIdstring
data.seriesarray of objectThe dates in series are DERIVED, not provided by the source: the last point is the day before the UTC date of meta.fetchedAt and each earlier point steps back one day. The rule was checked against the real daily series (63% of the positions matched within 0.5%), but the source may revise values already published, and around the UTC day rollover the label may shift by one day (assumption not proven at those hours). The number of points depends on the source and does not necessarily follow the window. A product without a series returns an empty series, with no error.
data.series[].datestringDerived day (yyyy-MM-dd, UTC).
data.series[].revenuenumberRevenue of the day, in the market currency.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • The dates in series are DERIVED, not provided by the source: the last point is the day before the UTC date of meta.fetchedAt and each earlier point steps back one day. The rule was checked against the real daily series (63% of the positions matched within 0.5%), but the source may revise values already published, and around the UTC day rollover the label may shift by one day (assumption not proven at those hours). The number of points depends on the source and does not necessarily follow the window. A product without a series returns an empty series, with no error.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Overall product ranking

Overall product ranking

GEThttps://developers.sendyx.com/v1/products/ranking

0.10 credits per request

OVERALL ranking of the market's products by revenue in the window, with no shop, creator, video, or live filter. Accepts BR and US.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

25
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop.
data[].namestring | null
data[].coverUrlstring | nullCover URL, when the source provides it.
data[].shopobject
data[].shop.idstring | null
data[].shop.namestring | null
data[].revenuenumber | nullProduct revenue in the window, in the market currency.
data[].salesinteger | nullUnits sold in the window.
data[].unitPricenumber | nullRevenue divided by sales, in the market currency. It is not a list price.
data[].commissionnumber | nullFraction (0.11 is 11%). Inferred unit, not confirmed.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].showcaseRevenuenumber | null
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd).
data[].skuCountinteger | nullNumber of SKUs, when the source provides it.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Only products that sold in the window appear: the entity's total number of products may be larger. The page of 100 rows is the same for pages 1 to 10.
  • commission is a fraction (0.11 is 11%). The source delivers percentage points and we divide by 100, as in GET /v1/products. In the per-entity ranking this unit is inferred, not confirmed; revenueGrowthRate is the raw number from the source and must not be treated as a percentage.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Products of a shop

Products of a shop

GEThttps://developers.sendyx.com/v1/shops/{id}/products

0.10 credits per request

Ranking of the shop's products by revenue in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Shop id (the id field of GET /v1/shops).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

25
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop.
data[].namestring | null
data[].coverUrlstring | nullCover URL, when the source provides it.
data[].shopobject
data[].shop.idstring | null
data[].shop.namestring | null
data[].revenuenumber | nullProduct revenue in the window, in the market currency.
data[].salesinteger | nullUnits sold in the window.
data[].unitPricenumber | nullRevenue divided by sales, in the market currency. It is not a list price.
data[].commissionnumber | nullFraction (0.11 is 11%). Inferred unit, not confirmed.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].showcaseRevenuenumber | null
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd).
data[].skuCountinteger | nullNumber of SKUs, when the source provides it.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Only products that sold in the window appear: the entity's total number of products may be larger. The page of 100 rows is the same for pages 1 to 10.
  • commission is a fraction (0.11 is 11%). The source delivers percentage points and we divide by 100, as in GET /v1/products. In the per-entity ranking this unit is inferred, not confirmed; revenueGrowthRate is the raw number from the source and must not be treated as a percentage.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Products of a creator

Products of a creator

GEThttps://developers.sendyx.com/v1/creators/{id}/products

0.10 credits per request

Ranking of the products the creator promoted that sold in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Creator id (the id field of GET /v1/creators).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

25
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop.
data[].namestring | null
data[].coverUrlstring | nullCover URL, when the source provides it.
data[].shopobject
data[].shop.idstring | null
data[].shop.namestring | null
data[].revenuenumber | nullProduct revenue in the window, in the market currency.
data[].salesinteger | nullUnits sold in the window.
data[].unitPricenumber | nullRevenue divided by sales, in the market currency. It is not a list price.
data[].commissionnumber | nullFraction (0.11 is 11%). Inferred unit, not confirmed.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].showcaseRevenuenumber | null
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd).
data[].skuCountinteger | nullNumber of SKUs, when the source provides it.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Only products that sold in the window appear: the entity's total number of products may be larger. The page of 100 rows is the same for pages 1 to 10.
  • commission is a fraction (0.11 is 11%). The source delivers percentage points and we divide by 100, as in GET /v1/products. In the per-entity ranking this unit is inferred, not confirmed; revenueGrowthRate is the raw number from the source and must not be treated as a percentage.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Products of a video

Products of a video

GEThttps://developers.sendyx.com/v1/videos/{id}/products

0.10 credits per request

The products the video promotes that sold in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Video id (the id field of GET /v1/videos).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

25
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop.
data[].namestring | null
data[].coverUrlstring | nullCover URL, when the source provides it.
data[].shopobject
data[].shop.idstring | null
data[].shop.namestring | null
data[].revenuenumber | nullProduct revenue in the window, in the market currency.
data[].salesinteger | nullUnits sold in the window.
data[].unitPricenumber | nullRevenue divided by sales, in the market currency. It is not a list price.
data[].commissionnumber | nullFraction (0.11 is 11%). Inferred unit, not confirmed.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].showcaseRevenuenumber | null
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd).
data[].skuCountinteger | nullNumber of SKUs, when the source provides it.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Only products that sold in the window appear: the entity's total number of products may be larger. The page of 100 rows is the same for pages 1 to 10.
  • commission is a fraction (0.11 is 11%). The source delivers percentage points and we divide by 100, as in GET /v1/products. In the per-entity ranking this unit is inferred, not confirmed; revenueGrowthRate is the raw number from the source and must not be treated as a percentage.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Products / Products of a live

Products of a live

GEThttps://developers.sendyx.com/v1/lives/{id}/products

0.10 credits per request

Ranking of the products sold in the live in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Live id (the id field of GET /v1/lives).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

25
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop.
data[].namestring | null
data[].coverUrlstring | nullCover URL, when the source provides it.
data[].shopobject
data[].shop.idstring | null
data[].shop.namestring | null
data[].revenuenumber | nullProduct revenue in the window, in the market currency.
data[].salesinteger | nullUnits sold in the window.
data[].unitPricenumber | nullRevenue divided by sales, in the market currency. It is not a list price.
data[].commissionnumber | nullFraction (0.11 is 11%). Inferred unit, not confirmed.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].showcaseRevenuenumber | null
data[].launchDatestring | nullLaunch date on TikTok Shop (yyyy-MM-dd).
data[].skuCountinteger | nullNumber of SKUs, when the source provides it.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Only products that sold in the window appear: the entity's total number of products may be larger. The page of 100 rows is the same for pages 1 to 10.
  • commission is a fraction (0.11 is 11%). The source delivers percentage points and we divide by 100, as in GET /v1/products. In the per-entity ranking this unit is inferred, not confirmed; revenueGrowthRate is the raw number from the source and must not be treated as a percentage.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Videos / Videos that sold a product

Videos that sold a product

GEThttps://developers.sendyx.com/v1/products/{id}/videos

0.10 credits per request

Ranking of the videos that sold the product in the window, with views, likes, and revenue.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Product id (the id field of GET /v1/products).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

27
FieldTypeDescription
dataarray of object
data[].idstringVideo id.
data[].titlestring | null
data[].creatorobject
data[].creator.idstring | null
data[].creator.handlestring | nullThe profile's public @, including the @.
data[].revenuenumber | nullVideo revenue in the window, in the market currency.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].viewsinteger | null
data[].likesinteger | null
data[].sharesinteger | null
data[].commentsinteger | null
data[].publishedAtstring | nullText as the source sends it (yyyy/MM/dd HH:mm:ss). Time zone not confirmed.
data[].creatorDebutstring | nullCreator debut date (yyyy-MM-dd).
data[].isAdboolean | nullWhether the video is an ad.
data[].isAiGeneratedboolean | nullWhether the video was generated by AI.
data[].adsRoasnumber | null
data[].adRevenueRationumber | nullRaw ratio, unit not confirmed.
data[].adViewRationumber | nullRaw ratio, unit not confirmed (it has appeared above 1).
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Videos sorted by revenue in the window.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Videos / Video detail

Video detail

GEThttps://developers.sendyx.com/v1/videos/{id}

0.10 credits per request

Metrics of a video: revenue, sales, views, ad performance, and duration.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Video id.
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

28
FieldTypeDescription
dataobject
data.idstring
data.titlestring | null
data.regionstring | null
data.creatorobject
data.creator.idstring | null
data.creator.handlestring | nullThe profile's public @, including the @.
data.productCountinteger | nullHow many products the video promotes.
data.revenuenumber | null
data.salesinteger | null
data.viewsinteger | null
data.likesinteger | null
data.sharesinteger | null
data.commentsinteger | null
data.gpmnumber | nullRevenue per thousand views.
data.adsViewsinteger | null
data.adsRoasnumber | null
data.adsPeriodinteger | null
data.adCpanumber | null
data.adViewRationumber | nullRaw ratio, unit not confirmed.
data.durationnumber | nullVideo duration. Unit not confirmed (probably seconds).
data.isAdboolean | null
data.isAiGeneratedboolean | null
data.revenueTrendarray of numberrevenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • revenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Videos / Overall video ranking

Overall video ranking

GEThttps://developers.sendyx.com/v1/videos

0.10 credits per request

OVERALL ranking of the market's videos by revenue in the window. It is not the ranking of a product or a shop.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

27
FieldTypeDescription
dataarray of object
data[].idstringVideo id.
data[].titlestring | null
data[].creatorobject
data[].creator.idstring | null
data[].creator.handlestring | nullThe profile's public @, including the @.
data[].revenuenumber | nullVideo revenue in the window, in the market currency.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].viewsinteger | null
data[].likesinteger | null
data[].sharesinteger | null
data[].commentsinteger | null
data[].publishedAtstring | nullText as the source sends it (yyyy/MM/dd HH:mm:ss). Time zone not confirmed.
data[].creatorDebutstring | nullCreator debut date (yyyy-MM-dd).
data[].isAdboolean | nullWhether the video is an ad.
data[].isAiGeneratedboolean | nullWhether the video was generated by AI.
data[].adsRoasnumber | null
data[].adRevenueRationumber | nullRaw ratio, unit not confirmed.
data[].adViewRationumber | nullRaw ratio, unit not confirmed (it has appeared above 1).
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Videos sorted by revenue in the window.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Videos / Videos of a shop

Videos of a shop

GEThttps://developers.sendyx.com/v1/shops/{id}/videos

0.10 credits per request

Ranking of the videos that sold the shop's products in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Shop id (the id field of GET /v1/shops).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

27
FieldTypeDescription
dataarray of object
data[].idstringVideo id.
data[].titlestring | null
data[].creatorobject
data[].creator.idstring | null
data[].creator.handlestring | nullThe profile's public @, including the @.
data[].revenuenumber | nullVideo revenue in the window, in the market currency.
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].viewsinteger | null
data[].likesinteger | null
data[].sharesinteger | null
data[].commentsinteger | null
data[].publishedAtstring | nullText as the source sends it (yyyy/MM/dd HH:mm:ss). Time zone not confirmed.
data[].creatorDebutstring | nullCreator debut date (yyyy-MM-dd).
data[].isAdboolean | nullWhether the video is an ad.
data[].isAiGeneratedboolean | nullWhether the video was generated by AI.
data[].adsRoasnumber | null
data[].adRevenueRationumber | nullRaw ratio, unit not confirmed.
data[].adViewRationumber | nullRaw ratio, unit not confirmed (it has appeared above 1).
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Videos sorted by revenue in the window.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Creators / Creators who promoted a product

Creators who promoted a product

GEThttps://developers.sendyx.com/v1/products/{id}/creators

0.10 credits per request

Ranking of the creators who promoted the product in the window, with revenue by channel and sales.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Product id (the id field of GET /v1/products).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

23
FieldTypeDescription
dataarray of object
data[].idstringCreator id.
data[].nicknamestring | null
data[].handlestring | nullThe profile's public @, including the @.
data[].followersinteger | null
data[].contentViewsinteger | null
data[].revenuenumber | nullCreator revenue with the product in the window.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].salesinteger | null
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].categoryNamesarray of stringComes empty in the per-product ranking.
data[].categoryIdsarray of string
data[].tertiaryCategoryNamesarray of string
data[].tertiaryCategoryIdsarray of string
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Performance only and the profile's public @. This route never returns creator contacts or bio. Contacts exist only in GET /v1/creators/{id}/contacts.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Creators / Creator detail

Creator detail

GEThttps://developers.sendyx.com/v1/creators/{id}

0.10 credits per request

Performance of a creator in the window: revenue by channel, followers, views, and counts of videos, lives, shops, and products.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Creator id.
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

27
FieldTypeDescription
dataobject
data.idstring
data.nicknamestring | null
data.handlestring | nullThe profile's public @, including the @.
data.regionstring | null
data.statusstring | null
data.followersinteger | null
data.newFollowersinteger | null
data.revenuenumber | null
data.videoRevenuenumber | null
data.liveRevenuenumber | null
data.salesinteger | null
data.unitPricenumber | null
data.videoViewsinteger | null
data.liveViewsinteger | null
data.videoGpmnumber | null
data.liveGpmnumber | null
data.videoCountinteger | null
data.liveCountinteger | null
data.shopCountinteger | null
data.productCountinteger | null
data.top3ProductIdsarray of string
data.revenueTrendarray of numberrevenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

6
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
404not_foundCreator not found or unavailable. Nothing is charged.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • This route never returns creator contacts or bio. Contacts exist only in GET /v1/creators/{id}/contacts.
  • Looking up the creator here counts as "creator already looked up" for 24 hours: within that period, contacts cost only 0.02 credits.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • revenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Creators / Creator contacts

Creator contacts

GEThttps://developers.sendyx.com/v1/creators/{id}/contacts

0.02 credits with the creator already looked up in the last 24 h; 0.12 credits when the creator has not been looked up yet

Public contacts provided by the creator (email, TikTok, WhatsApp, Line, Facebook, Instagram, and Zalo). It is an extra lookup of 0.02 credits. If you have not looked up the creator in the last 24 hours, the route looks up the creator and charges 0.12 credits (0.10 for the creator plus 0.02 for the contacts), returning creator and contacts together.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Creator id.
regionstringNoBRMarket. Defaults to BR. This route accepts BR only. US is rejected with 400.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

36
FieldTypeDescription
dataobject
data.creatorobjectOnly appears when the creator had not yet been looked up in the last 24 hours.
data.creator.idstring
data.creator.nicknamestring | null
data.creator.handlestring | nullThe profile's public @, including the @.
data.creator.regionstring | null
data.creator.statusstring | null
data.creator.followersinteger | null
data.creator.newFollowersinteger | null
data.creator.revenuenumber | null
data.creator.videoRevenuenumber | null
data.creator.liveRevenuenumber | null
data.creator.salesinteger | null
data.creator.unitPricenumber | null
data.creator.videoViewsinteger | null
data.creator.liveViewsinteger | null
data.creator.videoGpmnumber | null
data.creator.liveGpmnumber | null
data.creator.videoCountinteger | null
data.creator.liveCountinteger | null
data.creator.shopCountinteger | null
data.creator.productCountinteger | null
data.creator.top3ProductIdsarray of string
data.creator.revenueTrendarray of numberrevenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
data.contactsobjectPersonal data. See the notes for this route.
data.contacts.emailstring | null
data.contacts.tiktokstring | null
data.contacts.whatsappstring | null
data.contacts.linestring | null
data.contacts.facebookstring | null
data.contacts.instagramstring | null
data.contacts.zalostring | null
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

7
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
403terms_not_acceptedThe API terms of use have not been accepted yet by the key owner. Accept them in the console. Nothing is charged.
404not_foundCreator not found or unavailable. Nothing is charged.
429rate_limited ou miss_quota_exceeded ou contacts_daily_limitRequest limit, hourly quota of new lookups, or daily limit of contact lookups reached. The error field says which: rate_limited, miss_quota_exceeded, or contacts_daily_limit.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • PERSONAL DATA. Each lookup is logged (who, which key, which creator, and when) and there is a daily cap on lookups per account (all keys combined). Use it only for the purpose that justified the lookup and comply with data protection law.
  • With the creator already looked up in the last 24 hours by this user, the response carries only contacts and the cost is 0.02. Otherwise it carries creator and contacts and the cost is 0.12. Requesting the same creator's contacts again costs 0.02 per request.
  • We do not store contacts for more than 24 hours.
  • Requires the key owner to have accepted the API terms of use in the console (otherwise, 403 terms_not_accepted). Creators who asked for their data to be removed have no contact served (404).
  • Not every creator has contact details filled in: missing fields come as null.
  • BR only.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Creators / Overall creator ranking

Overall creator ranking

GEThttps://developers.sendyx.com/v1/creators

0.10 credits per request

OVERALL ranking of the market's creators by revenue in the window.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

23
FieldTypeDescription
dataarray of object
data[].idstringCreator id.
data[].nicknamestring | null
data[].handlestring | nullThe profile's public @, including the @.
data[].followersinteger | null
data[].contentViewsinteger | null
data[].revenuenumber | nullCreator revenue with the product in the window.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].salesinteger | null
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].categoryNamesarray of stringComes empty in the per-product ranking.
data[].categoryIdsarray of string
data[].tertiaryCategoryNamesarray of string
data[].tertiaryCategoryIdsarray of string
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Performance only and the profile's public @. This route never returns creator contacts or bio. Contacts exist only in GET /v1/creators/{id}/contacts.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Creators / Creators of a shop

Creators of a shop

GEThttps://developers.sendyx.com/v1/shops/{id}/creators

0.10 credits per request

Ranking of the creators who sold the shop's products in the window.

Parameters

5
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Shop id (the id field of GET /v1/shops).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

23
FieldTypeDescription
dataarray of object
data[].idstringCreator id.
data[].nicknamestring | null
data[].handlestring | nullThe profile's public @, including the @.
data[].followersinteger | null
data[].contentViewsinteger | null
data[].revenuenumber | nullCreator revenue with the product in the window.
data[].videoRevenuenumber | null
data[].liveRevenuenumber | null
data[].salesinteger | null
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].categoryNamesarray of stringComes empty in the per-product ranking.
data[].categoryIdsarray of string
data[].tertiaryCategoryNamesarray of string
data[].tertiaryCategoryIdsarray of string
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Performance only and the profile's public @. This route never returns creator contacts or bio. Contacts exist only in GET /v1/creators/{id}/contacts.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Categories / Category tree

Category tree

GEThttps://developers.sendyx.com/v1/categories

Free

Catalog category tree, with the number of products in each node. The ids work as filters in GET /v1/products.

Parameters

1
NameTypeRequiredAllowed valuesDescription
regionstringNoBRMarket. Defaults to BR. This route accepts BR only. US is rejected with 400.

Response fields

12
FieldTypeDescription
dataobject
data.nodesarray of object
data.nodes[].idstring
data.nodes[].namestring
data.nodes[].levelinteger
data.nodes[].parentIdstring | null
data.nodes[].productCountinteger
data.nodes[].childrenarray of object
data.catalogTotalinteger
metaobject
meta.dataUpTostring | nullMost recent day of data (yyyy-MM-dd).
meta.currencystring

Possible errors

3
CodeerrorWhen
400validation_errorInvalid parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
429rate_limitedRequest limit exceeded. See the Retry-After header.

Notes

  • Only categories that have a product in the current catalog are included.
  • Use a category id in the categoryL1Id, categoryL2Id, and categoryL3Id filters of GET /v1/products.

Categories / Category ranking

Category ranking

GEThttps://developers.sendyx.com/v1/categories/ranking

0.10 credits per request

OVERALL ranking of the market's categories by revenue in the window. It is not the product ranking of a category.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

17
FieldTypeDescription
dataarray of object
data[].idstring
data[].namestring | null
data[].rankinteger | null
data[].revenuenumber | null
data[].salesinteger | null
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].top3ShopRevenueRationumber | nullRaw ratio, unit not confirmed.
data[].averageRevenuenumber | null
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Categories / Category detail

Category detail

GEThttps://developers.sendyx.com/v1/categories/{id}

0.10 credits per request

Revenue by channel, number of shops and active products, and revenue series of a category.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Category id (the id field of GET /v1/categories).
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

19
FieldTypeDescription
dataobject
data.idstring
data.namestring | null
data.revenuenumber | null
data.salesinteger | null
data.shopCountinteger | null
data.activeProductCountinteger | null
data.liveRevenuenumber | null
data.videoRevenuenumber | null
data.affiliateRevenuenumber | null
data.selfOperatedRevenuenumber | null
data.shoppingMallRevenuenumber | null
data.averageShopRevenuenumber | null
data.revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data.revenueTrendarray of numberrevenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • revenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Shops / Shop ranking

Shop ranking

GEThttps://developers.sendyx.com/v1/shops

0.10 credits per request

Ranking of the market's shops by revenue in the window.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

23
FieldTypeDescription
dataarray of object
data[].idstring
data[].namestring | null
data[].rankinteger | null
data[].revenuenumber | null
data[].salesinteger | null
data[].revenueGrowthRatenumber | nullRaw number from the source. Unit NOT confirmed: do not treat it as a percentage.
data[].unitPricenumber | null
data[].shopTypestring | null
data[].onSaleProductCountinteger | null
data[].affiliateRevenuenumber | null
data[].selfPromotionRevenuenumber | null
data[].shoppingMallRevenuenumber | null
data[].categoryNamesarray of string
data[].categoryIdsarray of string
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • The shop image is not exposed.
  • Units NOT confirmed: revenueGrowthRate is the raw number from the source (in categories and shops it looks like percentage points, but in videos -180.99 has appeared, so do not treat it as a percentage) and the ads and adViewRatio ratios are also raw.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Shops / Shop detail

Shop detail

GEThttps://developers.sendyx.com/v1/shops/{id}

0.10 credits per request

Revenue by source, counts of creators, products, videos, and lives, and revenue series of a shop.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Shop id.
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

21
FieldTypeDescription
dataobject
data.idstring
data.namestring | null
data.regionstring | null
data.sellerTypestring | null
data.revenuenumber | null
data.salesinteger | null
data.unitPricenumber | null
data.shoppingMallRevenuenumber | null
data.selfAccountRevenuenumber | null
data.affiliateRevenuenumber | null
data.creatorCountinteger | null
data.productCountinteger | null
data.videoCountinteger | null
data.liveCountinteger | null
data.top3ProductIdsarray of string
data.revenueTrendarray of numberrevenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • revenueTrend is a daily revenue series WITHOUT dates: the source does not label the points and the chronological order is not proven (the 30-day window returned 30 points). Use it as a curve, not as a dated series.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Lives / Live ranking

Live ranking

GEThttps://developers.sendyx.com/v1/lives

0.10 credits per request

Ranking of the market's lives by revenue in the window.

Parameters

4
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.
pageintegerNominimum 1; maximum 50Page, from 1 to 50.
pageSizeintegerNo10FIXED page size of 10. Any other value is rejected with 400.

Response fields

21
FieldTypeDescription
dataarray of object
data[].idstring
data[].titlestring | null
data[].creatorobject
data[].creator.idstring | null
data[].creator.handlestring | nullThe profile's public @, including the @.
data[].startedAtstring (date-time) | null
data[].endedAtstring (date-time) | null
data[].durationSecondsinteger | nullDuration in seconds (matches end minus start).
data[].revenuenumber | null
data[].unitPricenumber | null
data[].viewsinteger | null
data[].recordTypestring | nullValue from the source (for example SHORT, SCREENSHOT). Meaning not confirmed.
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.hasMorebooleanThere may be more items on the next page.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Times in ISO 8601 UTC. Duration is in seconds.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Lives / Live detail

Live detail

GEThttps://developers.sendyx.com/v1/lives/{id}

0.10 credits per request

Revenue, viewers, products, and GPM of a live.

Parameters

3
NameTypeRequiredAllowed valuesDescription
id (path)stringYesformat ^\d{1,20}$Live id.
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US.
windowintegerNo7, 30, 90Window in days. Defaults to 7.

Response fields

19
FieldTypeDescription
dataobject
data.idstring
data.titlestring | null
data.creatorobject
data.creator.idstring | null
data.creator.handlestring | nullThe profile's public @, including the @.
data.startedAtstring (date-time) | null
data.endedAtstring (date-time) | null
data.durationSecondsinteger | nullDuration in seconds.
data.productCountinteger | null
data.viewersinteger | null
data.revenuenumber | null
data.gpmnumber | null
data.top3ProductIdsarray of string
data.recordTypestring | nullValue from the source. Meaning not confirmed.
metaobject
meta.currencystring
meta.windowintegerWindow used, in days.
meta.fetchedAtstring (date-time)Moment the data was obtained.

Possible errors

5
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limited ou miss_quota_exceededRequest limit (rate_limited) or hourly quota of new lookups per key and per account (miss_quota_exceeded). Cached lookups do not count toward the quota. See the Retry-After header. Nothing is charged.
503upstream_unavailable ou upstream_budget_exceeded ou upstream_disabledData service unavailable at the moment. Nothing is charged. The error field gives the reason.

Notes

  • Times in ISO 8601 UTC. Duration is in seconds.
  • region accepts BR (default) and US. US data comes as the source delivers it: names, titles, and categories in English and values in USD, with no translation or currency conversion. meta.currency tells the currency.
  • meta.fetchedAt is the moment the data was obtained. A daily ranking is valid until the next publication of the day (around 14:00 UTC). The route cost is the same on every successful request.
  • pageSize is fixed at 10. window accepts 7, 30, or 90 days. Pages run from 1 to 50.
  • If the data service is unavailable, the response is 503 and no credits are charged. The error field gives the reason: upstream_disabled, upstream_budget_exceeded, or upstream_unavailable (source failing or busy, including a full live lookup queue: try again after Retry-After).
  • An empty list may be temporary: try again in a minute.
  • The x-credits-cost and x-credits-remaining headers come on 200 responses, on 402, and on errors refunded after the charge (such as 404 and 503, with cost 0.00); they do not come on 401, 429, or validation 400. They always carry two decimal places (for example 0.10 and 4.90). In the JSON body, numbers are numeric and do not keep trailing zeros.

Brecha / Products with room for new creators

Products with room for new creators

GEThttps://developers.sendyx.com/v1/brecha

0.10 credits per request

Lists the products with proven demand and room for new creators (the Brecha, or "gap"), with the stage of each one (open, tight, or closed), the newcomer's leverage, and the estimated commission that creators split.

Parameters

7
NameTypeRequiredAllowed valuesDescription
regionstringNoBR, USMarket. Defaults to BR. Accepts BR and US. While the US catalog is not visible, the US response comes back empty (404 on detail) and nothing is charged.
categoryL1IdstringNoformat ^\d{1,32}$Level 1 category id.
minCommissionnumberNominimum 0; maximum 100Minimum commission as a percentage (15 is 15%). Defaults to 10; 0 turns off the floor. Values between 0 and 1 are rejected (write 15, not 0.15).
minRevenue30dintegerNominimum 0Minimum revenue over 30 days, in the market currency (integer). Defaults to 10000.
stagestringNoStages, separated by commas (OR between them): open, tight, closed. Defaults to open,tight.
sortBystringNoleverage, revenue1d, revenue7d, commissionDescending sort order, with nulls last. Defaults to leverage.
pageintegerNominimum 1; maximum 50Page, from 1 to 50. Each page has 10 items.

Response fields

37
FieldTypeDescription
dataarray of object
data[].idstringProduct id on TikTok Shop. Use it in GET /v1/products/{id}.
data[].namestringProduct name.
data[].coverUrlstring | nullCover URL.
data[].productUrlstringProduct page on TikTok Shop.
data[].categoryL1object | nullLevel 1 category (id and name).
data[].categoryL1.idstring
data[].categoryL1.namestring
data[].revenue1dnumber | nullYesterday's revenue, in the market currency.
data[].revenue7dnumber | nullRevenue over the last 7 days.
data[].revenue30dnumber | nullRevenue over the last 30 days.
data[].sales7dinteger | nullUnits sold in the last 7 days.
data[].sales30dinteger | nullUnits sold in the last 30 days.
data[].commissionnumber | nullAffiliate commission, as a fraction (0.15 is 15%).
data[].creatorRevenue30dnumber | null30-day revenue that went through creators (video plus live). The rest comes from search, ads, and the shop's own traffic.
data[].capturedCommission30dnumber | nullEstimate of the commission creators split over 30 days: creatorRevenue30d times commission. Null when the channel was not measured.
data[].accelerationnumber | nullYesterday's pace divided by the 30-day daily average. Above 1 means acceleration.
data[].statestring | nullProduct momentum: exploding, accelerating, cooling, stable, or idle.
data[].rankinteger | nullPosition in the catalog by 7-day sales.
data[].stagestringRoom for new creators: open (the newcomer gets at least the share it produces), tight (gets between half and the share it produces), or closed (gets less than half).
data[].newcomerLeveragenumber | nullShare of video revenue that goes to new creators divided by the share of videos they record. 1.0 is the boundary: above it, the newcomer earns more than the product average.
data[].newcomerVideoSharenumber | nullFraction of the measured videos made by creators with less than 12 months on TikTok.
data[].newcomerRevenueSharenumber | nullFraction of the revenue of those videos that goes to new creators.
data[].newcomerVideosMeasuredinteger | nullHow many videos went into the calculation (minimum 10).
paginationobject
pagination.pageinteger
pagination.pageSizeinteger
pagination.totalinteger
pagination.totalPagesinteger
summaryobject
summary.stageTotalsobjectProducts per stage in the cut, before the stage filter.
summary.stageTotals.openinteger
summary.stageTotals.tightinteger
summary.stageTotals.closedinteger
metaobject
meta.dataUpTostring | nullMost recent day of data (yyyy-MM-dd).
meta.currencystring

Possible errors

4
CodeerrorWhen
400validation_errorInvalid or unknown parameter.
401invalid_credentials ou missing_credentialsMissing or invalid key.
402insufficient_creditsInsufficient credits. Includes required and available, in credits.
429rate_limitedRequest limit exceeded. See the Retry-After header.

Notes

  • Each page has 10 items and costs 0.10 credits. There is no pageSize: sending it returns 400. Pages run from 1 to 50.
  • An empty page or one past the end also costs 0.10 credits, as with any list. A validation error (400) does not consume credits.
  • Only products already measured by the video rotation are included (the head of the catalog by revenue, revisited every few days). A product without a measurement does not appear, and total may be small.
  • By default the list returns the open and tight stages. closed only appears when requested in stage. summary.stageTotals counts the full cut, before the stage filter.
  • minCommission is a percentage (15 is 15%), default 10; 0 turns off the floor. minRevenue30d is the minimum revenue over 30 days in the market currency, default 10000.
  • commission and the newcomer* fractions are fractions (0.15 is 15%). meta.dataUpTo is the most recent day of data.
  • The field list may gain new items without notice: do not treat an unknown field as an error.
  • region accepts BR (default) and US. US data comes as stored: names in English and values in USD (meta.currency tells the currency). While the US catalog is not visible, the US response comes back empty, with a null meta.dataUpTo, and costs 0.00 (nothing is charged). With sortBy=acceleration, a product without the yesterday and 30-day windows from the same collection has no value and goes to the end of the list, as in BR.
  • In US Brecha the revenue floor (minRevenue30d, default 10000) applies in dollars, like any value of the market.

Account / Balance and recent usage

Balance and recent usage

GEThttps://developers.sendyx.com/v1/account/usage

Free

Credit balance of the account that owns the key and the latest ledger entries: purchases, debits, and refunds.

Response fields

11
FieldTypeDescription
dataobject
data.balancenumberBalance in credits.
data.recentarray of object
data.recent[].createdAtstring (date-time)
data.recent[].kindstring
data.recent[].deltanumberChange in credits (negative on a debit).
data.recent[].balanceAfternumber
data.recent[].routestring | null
metaobject
meta.dataUpTostring | null
meta.currencystring | null

Possible errors

2
CodeerrorWhen
401invalid_credentials ou missing_credentialsMissing or invalid key.
429rate_limitedRequest limit exceeded. See the Retry-After header.

Notes

  • Balance and entries in decimal credits. The delta of a debit is negative.
  • Shows only the owner of the key used in the request.