List a research's creators
/v1/research/{id}/creatorsThe outlier creators a research surfaced, past the 25 the research response carries inline. Ordered by outlier by default — the best multiple any one of their videos in this research hit — and narrowable by follower count and platform. best_outlier and median_views are null, never zero, for a creator no video of whose was scored, and those sort last whichever way you sort: unknown is not the same as smallest. median_views is the baseline the outlier was measured against, frozen at collection time. Paging, total and as_of work exactly as they do on the videos read. A research that has not finished answers 409 run_not_ready.
Open in Playground(no API Key needed)
Price
Free, forever, filtered or not. Collection is the only thing charged.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
id | path | string | Required | — | Research id — the id of the Run that collected it. |
min_followers | query | integermin 0 | Optional | — | Keep creators with at least this many followers. A creator with no follower count is excluded rather than assumed to be at zero. Follower count is the one the research recorded, under either as_of: latest does not refresh it. |
max_followers | query | integermin 0 | Optional | — | Keep creators with at most this many followers. Follower count is the one the research recorded, under either as_of: latest does not refresh it. |
platforms | query | string | Optional | — | Comma-separated, or repeated, each one of tiktok, instagram, youtube, facebook; any other value is a 400. Omit for every platform the research covered. |
order_by | query | stringone of outlier, median_views, followers, video_count, views | Optional | outlier | outlier is the best multiple any one of their videos hit. median_views is the baseline it was measured against, views their total across the shortlist, video_count how many of the shortlist is theirs, followers their follower count (unknown last; as recorded by the research, under either as_of). Ties break on total views (most first), then creator id, whatever the order_by or sort — the same order as the 25 inline on the research, so under as_of=run (the default) the default first page is that list and offset=25 continues it. |
sort | query | stringone of asc, desc | Optional | desc | Direction. desc is best-first for every order_by. Creators missing the value being sorted on come last in both directions: unknown is not the same as smallest. |
limit | query | integermin 1; max 100 | Optional | 25 | Creators per page. Over the maximum, or negative, is a 400 rather than a silent clamp. |
offset | query | integermin 0 | Optional | 0 | Creators to skip. Past the end returns an empty page with the true total. |
as_of | query | stringone of run, latest | Optional | run | Which snapshots to read. run (the default) is what the research itself saw, frozen, so the list always agrees with the digest. latest serves the newest snapshot this API holds for each video instead, and the filters and ordering then run over those numbers — a min_ filter under latest means "over that many now". Under latest, outlier and outlier_p90 are recomputed against the research's baseline; velocity and percentile stay as the research measured them. Be aware that latest is uneven until you refresh: a video is only as fresh as the last time anything looked at it, and a video nothing has looked at since keeps the numbers the research recorded rather than coming back empty. POST /research/{id}/refresh brings its refreshable videos (TikTok today) up to date; the rest keep what the research recorded. Every response states the basis it served. |
Responses
200 OK
{ items, total, limit, offset, as_of }.
object
itemsarray of objectrequiredplatformstringrequiredidstringrequiredhandlestringrequirednullablenamestringrequiredfollower_countnumberrequirednullablevideo_countintegerrequiredbest_outliernumberrequirednullablemedian_viewsnumberrequirednullableThe Creator baseline median viewsbest_outlierwas measured against, frozen at collection time. Null, never zero, when no video of theirs carried Scores.total_viewsnumberrequiredvideo_idsarray of stringrequired
totalintegerrequiredRows matching the filters, beforelimitandoffset.limitintegerrequiredoffsetintegerrequiredas_ofstringrequiredone ofrun,latestWhich snapshots the numbers come from:runis what the research itself saw, frozen, so a read always agrees with the digest;latestis the newest snapshot this API holds for each video.
200 · `{ items, total, limit, offset, as_of }`.
{
"items": [
{
"platform": "tiktok",
"id": "cre_9d4b2a7f1c",
"handle": "someone",
"name": "Someone",
"follower_count": 184300,
"video_count": 3,
"best_outlier": 4.21,
"median_views": 305000,
"total_views": 1611400,
"video_ids": [
"tiktok:7300000000000000000"
]
}
],
"total": 31,
"limit": 25,
"offset": 0,
"as_of": "run"
}400 Bad Request
invalid_request — an unknown platform, a min_followers or max_followers that is not a non-negative integer, an unknown order_by, sort or as_of, a limit outside 1 to 100, or a negative or non-integer offset.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
400 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "`limit` must be an integer between 1 and 100, and `offset` a non-negative integer."
}401 Unauthorized
missing_authorization, invalid_key, key_revoked or invalid_token.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
401 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/invalid_key",
"title": "Invalid key",
"status": 401,
"code": "invalid_key",
"detail": "That API key does not exist. Keys look like `sk_live_...` and are created in the console."
}404 Not Found
not_found.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
404 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No research with that id for this Customer."
}409 Conflict
run_not_ready — the research is still running, or failed with nothing to serve. If it is still running, poll GET /v1/runs/{id} and read again once it settles; a failed research never becomes readable.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
409 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/run_not_ready",
"title": "Run not ready",
"status": 409,
"code": "run_not_ready",
"detail": "Research `run_c07a41bb92` is still running. Poll GET /v1/runs/run_c07a41bb92 until it reaches a terminal status."
}Request samples
curl "https://www.shortsintel.com/v1/research/id_example/creators?platforms=tiktok%2Cyoutube&order_by=outlier&sort=desc&limit=25&offset=0&as_of=run" \
-H "Authorization: Bearer sk_live_YOUR_KEY"const response = await fetch(
"https://www.shortsintel.com/v1/research/id_example/creators?platforms=tiktok%2Cyoutube&order_by=outlier&sort=desc&limit=25&offset=0&as_of=run",
{
method: "GET",
headers: {
"Authorization": "Bearer sk_live_YOUR_KEY",
},
},
);
if (!response.ok) {
throw new Error(`ShortsIntel ${response.status}`);
}
const data = await response.json();import requests
response = requests.get(
"https://www.shortsintel.com/v1/research/id_example/creators?platforms=tiktok%2Cyoutube&order_by=outlier&sort=desc&limit=25&offset=0&as_of=run",
headers={
"Authorization": "Bearer sk_live_YOUR_KEY",
},
)
response.raise_for_status()
data = response.json()Related guides
- Research: How an intent becomes a digest, why a research id is a run id, and how to re-slice what you collected for free instead of paying for it twice.