Act on every member
/v1/collections/{id}/actionsPause, resume, refresh or switch analysis for every live member Tracker at once. A Collection holds no state, so the action writes through to each Tracker, and a Tracker in several Collections is changed for all of them: pausing "Competitors" also pauses a creator you track for "Influencers". Every answer lists those shared members in trackers_in_other_collections (in the Run result, and the estimate, for refresh). pause, resume and intelligence are free, answer at once and are not Runs; resume resumes nothing when the batch would pass the active-Tracker limit. refresh runs every member's cycle now, paused members included, as one Run with one item per member: members that fail are not charged, some failing makes the Run partial, all failing makes it failed and free.
Price
Free, except refresh: one cycle per member refreshed, 6 credits for a creator, 30 credits for an advertiser, plus 20 credits per new video on members with analysis on.
Supports estimate=true: the reply is the price in Credits and whether it would be cached, with no Run created and nothing charged.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
id | path | string | Required | — | Collection id. |
wait | query | integermin 0; max 120 | Optional | 30 | Seconds to hold the response open before handing back a running Run to poll. Default 30, max 120. A POST may send it in the body instead; given in both places with different values it is a 400. Only refresh waits; the other actions answer at once. |
estimate | query | boolean | Optional | — | true returns { estimate_credits, cached } computed from what is already stored, and creates no Run. Nothing is charged. Only true or false; anything else is a 400. A POST may send it in the body instead; given in both places with different values it is a 400. |
Idempotency-Key | header | string | Optional | — | 1-255 printable ASCII characters. Replaying this key with the same payload returns the original Run (202 while it is still running); a different payload, or a different operation, is a 409 idempotency_conflict. |
Request body
application/json
object
actionstringrequiredone ofpause,resume,refresh,intelligencepauseorresumeevery member;refreshruns every member's cycle now (a paid Run);intelligenceswitches analysis of new videos on or off for every member.intelligencebooleanRequired withintelligence: true switches analysis on, false off.
Responses
200 OK
pause, resume, intelligence: { action, collection, trackers, changed_tracker_ids, trackers_in_other_collections }. refresh: the Run envelope { run, result, trackers_in_other_collections }; with estimate=true, { estimate_credits, trackers, per_tracker_credits, trackers_in_other_collections }. With estimate=true the free actions answer { estimate_credits: 0, cached, trackers_in_other_collections } and change nothing: the way to see what a pause would reach before making it.
any of 3 shapes
Option 1object
actionstringrequiredone ofpause,resume,intelligencecollectionobjectrequiredA named set of Trackers of one kind. Holds no state: pausing, analysis and cycles belong to each Tracker.idstringrequirednamestringrequiredUnique per Customer, regardless of case.kindstringrequiredone ofcreator,hashtag,sound,advertiser,videoWhat every member is. Fixed at creation.videois deprecated: existing Video Collections keep working, new ones are refused with 400kind_deprecated.member_countintegerrequiredLive (active or paused) member Trackers.created_atstringrequiredupdated_atstringrequired
trackersarray of objectrequiredEvery live member, as it now is.idstringrequiredkindstringrequiredone ofcreator,hashtag,sound,advertiser,videovideois deprecated (ADR 0024): existing Video Trackers keep working, new ones are refused with 400kind_deprecated.platformstringrequiredmetafor an advertiser Tracker.targetstringrequiredintelligencebooleanrequiredWhether each new video (or Ad) the cycle finds is analysed.statestringrequiredone ofactive,paused,deletedlast_cycle_atstringrequirednullablelast_run_idstringrequirednullablecreated_atstringrequiredupdated_atstringrequired
changed_tracker_idsarray of stringrequiredMembers this call changed. One already in the asked-for state is left alone.trackers_in_other_collectionsarray of objectrequiredtracker_idstringrequiredplatformstringrequiredtargetstringrequiredstatestringrequiredone ofactive,pausedcollectionsarray of objectrequiredThe other Collections it sits in. This one is left out.idstringrequirednamestringrequired
Option 2object
runobjectrequiredEvery charged operation creates a Run. The envelope is identical whether the result came back inline or was polled.idstringrequiredkindstringrequiredWhat was run, e.g.video_lookup.statusstringrequiredone ofrunning,completed,partial,failedpartialkeeps the completed items and charges for them, up to what the Balance covers;failedcharges nothing.created_atstringrequiredRFC 3339.completed_atstringrequirednullableNull while the Run is still running.charge_creditsintegerrequiredWhat this Run actually cost, in Credits. A stored answer costs the same as a fresh one.list_price_creditsintegerrequiredThe full price of the work asked for, in Credits. Equal tocharge_creditsunless the Run charged for only part of it.cachedbooleanrequiredTrue when a stored result answered without paying the vendor.progressobjectWhat a running Research has done so far, refreshed as it works:stage(keywords,searching,filtering,analysing,writing_digest) and the counts known by then —keywords,found,kept,dropped_off_topic, andanalysedofshortlisted. A count is absent until its stage produced it. Absent once the Run settles, and on every other kind.stagestringrequiredone ofkeywords,searching,filtering,analysing,writing_digestkeywordsintegervalue at least 0searchesintegervalue at least 0foundintegervalue at least 0judgedintegervalue at least 0keptintegervalue at least 0dropped_off_topicintegervalue at least 0dropped_unsureintegervalue at least 0shortlistedintegervalue at least 0analysedintegervalue at least 0updated_atstringrequired
resultobjectrequiredWhat a Collection refresh did. One item per member atGET /v1/runs/{id}/items.collection_idstringrequiredcollection_namestringrequiredrequestedintegerrequiredLive members when the refresh started.refreshedintegerrequiredMembers whose cycle completed, and the only ones charged.failedintegerrequiredchange_reportsintegerrequiredChange Reports the refresh produced; read them per Tracker.trackers_in_other_collectionsarray of objectrequiredtracker_idstringrequiredplatformstringrequiredtargetstringrequiredstatestringrequiredone ofactive,pausedcollectionsarray of objectrequiredThe other Collections it sits in. This one is left out.idstringrequirednamestringrequired
waived_creditsnumberOnly when analysis surcharges passed the Balance: the part not charged. The charge stops at the Balance.
trackers_in_other_collectionsarray of objectrequiredtracker_idstringrequiredplatformstringrequiredtargetstringrequiredstatestringrequiredone ofactive,pausedcollectionsarray of objectrequiredThe other Collections it sits in. This one is left out.idstringrequirednamestringrequired
Option 3objectReturned instead of a Run when
estimate=true. Nothing is charged. Operations with more to say about a quote add members; the two above are always present.estimate_creditsintegerrequiredWhat the call would be charged, in Credits.cachedbooleanrequiredWhether a stored result can already answer. It does not change the price.
200 · `pause`, `resume`, `intelligence`: `{ action, collection, trackers, changed_tracker_ids, trackers_in_other_collections }`. `refresh`: the Run envelope `{ run, result, trackers_in_other_collections }`; with `estimate=true`, `{ estimate_credits, trackers, per_tracker_credits, trackers_in_other_collections }`. With `estimate=true` the free actions answer `{ estimate_credits: 0, cached, trackers_in_other_collections }` and change nothing: the way to see what a pause would reach before making it.
{
"action": "pause",
"collection": {
"id": "col_7d20e1b5c4",
"name": "Competitors",
"kind": "creator",
"member_count": 4,
"created_at": "2026-09-02T09:14:40.221Z",
"updated_at": "2026-09-02T09:14:40.221Z"
},
"trackers": [
{
"id": "trk_4b1e90c7aa",
"kind": "creator",
"platform": "tiktok",
"target": "someone",
"intelligence": true,
"state": "paused",
"last_cycle_at": "2026-09-08T04:00:11.402Z",
"last_run_id": "run_c07a41bb92",
"created_at": "2026-09-01T11:20:03.118Z",
"updated_at": "2026-09-08T04:00:11.402Z"
}
],
"changed_tracker_ids": [
"trk_4b1e90c7aa"
],
"trackers_in_other_collections": [
{
"tracker_id": "trk_4b1e90c7aa",
"platform": "tiktok",
"target": "someone",
"state": "paused",
"collections": [
{
"id": "col_51b0a9e2f7",
"name": "Influencers"
}
]
}
]
}200 · `refresh`, finished inside the wait budget. Partial: one of four members could not be fetched and was not charged.
{
"run": {
"id": "run_8f2c1ad04b",
"kind": "collection_refresh",
"status": "partial",
"created_at": "2026-09-08T09:14:02.418Z",
"completed_at": "2026-09-08T09:14:04.930Z",
"charge_credits": 150,
"list_price_credits": 150,
"cached": false
},
"result": {
"collection_id": "col_7d20e1b5c4",
"collection_name": "Competitors",
"requested": 4,
"refreshed": 3,
"failed": 1,
"change_reports": 1,
"trackers_in_other_collections": [
{
"tracker_id": "trk_4b1e90c7aa",
"platform": "tiktok",
"target": "someone",
"state": "active",
"collections": [
{
"id": "col_51b0a9e2f7",
"name": "Influencers"
}
]
}
]
},
"trackers_in_other_collections": [
{
"tracker_id": "trk_4b1e90c7aa",
"platform": "tiktok",
"target": "someone",
"state": "active",
"collections": [
{
"id": "col_51b0a9e2f7",
"name": "Influencers"
}
]
}
]
}200 · `refresh` with `estimate=true`: the price, no Run, no charge.
{
"estimate_credits": 24,
"cached": false,
"trackers": 4,
"per_tracker_credits": 6,
"trackers_with_analysis": 0,
"note": "A member that cannot be refreshed is not charged, so the final charge is at or below this quote.",
"trackers_in_other_collections": [
{
"tracker_id": "trk_4b1e90c7aa",
"platform": "tiktok",
"target": "someone",
"state": "active",
"collections": [
{
"id": "col_51b0a9e2f7",
"name": "Influencers"
}
]
}
]
}202 Accepted
refresh still running: { run, trackers_in_other_collections }. Poll GET /v1/runs/{id}.
object
Still running. Poll GET /v1/runs/{id}.
runobjectrequiredEvery charged operation creates a Run. The envelope is identical whether the result came back inline or was polled.idstringrequiredkindstringrequiredWhat was run, e.g.video_lookup.statusstringrequiredone ofrunning,completed,partial,failedpartialkeeps the completed items and charges for them, up to what the Balance covers;failedcharges nothing.created_atstringrequiredRFC 3339.completed_atstringrequirednullableNull while the Run is still running.charge_creditsintegerrequiredWhat this Run actually cost, in Credits. A stored answer costs the same as a fresh one.list_price_creditsintegerrequiredThe full price of the work asked for, in Credits. Equal tocharge_creditsunless the Run charged for only part of it.cachedbooleanrequiredTrue when a stored result answered without paying the vendor.progressobjectWhat a running Research has done so far, refreshed as it works:stage(keywords,searching,filtering,analysing,writing_digest) and the counts known by then —keywords,found,kept,dropped_off_topic, andanalysedofshortlisted. A count is absent until its stage produced it. Absent once the Run settles, and on every other kind.stagestringrequiredone ofkeywords,searching,filtering,analysing,writing_digestkeywordsintegervalue at least 0searchesintegervalue at least 0foundintegervalue at least 0judgedintegervalue at least 0keptintegervalue at least 0dropped_off_topicintegervalue at least 0dropped_unsureintegervalue at least 0shortlistedintegervalue at least 0analysedintegervalue at least 0updated_atstringrequired
trackers_in_other_collectionsarray of objectrequiredtracker_idstringrequiredplatformstringrequiredtargetstringrequiredstatestringrequiredone ofactive,pausedcollectionsarray of objectrequiredThe other Collections it sits in. This one is left out.idstringrequirednamestringrequired
202 · Example
{
"run": {
"id": "run_8f2c1ad04b",
"kind": "collection_refresh",
"status": "running",
"created_at": "2026-09-08T09:14:02.418Z",
"completed_at": null,
"charge_credits": 0,
"list_price_credits": 0,
"cached": false
},
"trackers_in_other_collections": [
{
"tracker_id": "trk_4b1e90c7aa",
"platform": "tiktok",
"target": "someone",
"state": "active",
"collections": [
{
"id": "col_51b0a9e2f7",
"name": "Influencers"
}
]
}
]
}400 Bad Request
invalid_request — an unknown action, intelligence without intelligence: true|false, or refresh on a Collection with no members.
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": "The Collection \"Competitors\" has no members to refresh."
}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."
}402 Payment Required
insufficient_balance — refresh only, checked against one cycle per member before any work starts.
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
402 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/insufficient_balance",
"title": "Insufficient balance",
"status": 402,
"code": "insufficient_balance",
"detail": "Your balance does not cover this operation. Top up in the console.",
"balance_credits": 0,
"required_credits": 24
}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 Collection with that id for this Customer."
}409 Conflict
tracker_limit_exceeded — resume would pass the active-Tracker limit. Nothing is resumed. Or: idempotency_conflict — the same Idempotency-Key with a different payload.
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 · tracker_limit_exceeded
{
"type": "https://www.shortsintel.com/docs/reference/errors/tracker_limit_exceeded",
"title": "Tracker limit exceeded",
"status": 409,
"code": "tracker_limit_exceeded",
"detail": "Resuming 4 Trackers would take this Customer to 102 active, the limit is 100. Nothing was resumed. Pause or delete some first.",
"limit": 100,
"active": 98,
"requested": 4
}409 · idempotency_conflict
{
"type": "https://www.shortsintel.com/docs/reference/errors/idempotency_conflict",
"title": "Idempotency conflict",
"status": 409,
"code": "idempotency_conflict",
"detail": "This Idempotency-Key was used with a different payload.",
"run_id": "run_8f2c1ad04b"
}422 Unprocessable Content
unsupported_kind — refresh on a Collection of a kind with no cycle yet (video). Nothing is run or charged.
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
422 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/unsupported_kind",
"title": "Unsupported kind",
"status": 422,
"code": "unsupported_kind",
"detail": "Tracking video targets is not available yet. Creator tracking is supported today.",
"supported_kinds": [
"creator"
]
}429 Too Many Requests
rate_limit_exceeded or concurrency_limit_exceeded, with Retry-After.
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
429 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/rate_limit_exceeded",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limit_exceeded",
"detail": "60 requests per minute per key. Retry after the number of seconds in `Retry-After`.",
"limit": 60
}Request samples
curl -X POST "https://www.shortsintel.com/v1/collections/col_7d20e1b5c4/actions?wait=30" \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"pause"}'const response = await fetch(
"https://www.shortsintel.com/v1/collections/col_7d20e1b5c4/actions?wait=30",
{
method: "POST",
headers: {
"Authorization": "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"action": "pause"
}),
},
);
if (!response.ok) {
throw new Error(`ShortsIntel ${response.status}`);
}
const data = await response.json();import requests
response = requests.post(
"https://www.shortsintel.com/v1/collections/col_7d20e1b5c4/actions?wait=30",
headers={
"Authorization": "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
json={
"action": "pause",
},
)
response.raise_for_status()
data = response.json()Related guides
This call creates a Run. With wait it holds the response open until the Run finishes or the wait runs out, then answers with the finished result or 202 and the running Run. Poll GET /v1/runs/{id} until it settles; re-reading a Run is free.
- Runs: How a call becomes a Run, waiting inline, polling and free re-reads.