Submit URLs
POST /submissions takes up to 100 canonical Instagram URLs for one connected
account.
https://instagram.com or https://www.instagram.com
with a /reel/, /reels/, /p/, or /tv/ path. A bare shortcode is not a
URL and is rejected.
One result per URL
The request succeeds even when some URLs do not resolve. Readstatus on each
item.
Submitting is idempotent per project and shortcode, so retrying a whole batch
never creates duplicates.
Why tracked media can come back not_found
ClipStake finds each URL by looking for the post among the connected
account’s recent media, up to its 500 most recent posts.
Media can therefore be reported not_found when it is older than that window,
when it belongs to a different account than the username you sent, or when it
was deleted or made private.
Concurrent requests for the same account share one lookup, so the
account’s rate limit is spent once. If a lookup is already running and does
not finish in time, the request returns
409 conflict with a Retry-After
header.
Retry once and the warmed result is used.Errors that fail the whole request
Status lifecycle
next_read_at is the earliest moment ClipStake is allowed to read the media.
It is not a promise that a read happens at that instant. It is null once the
media is no longer read at all.
A billing hold does not change any status. When a renewal fails and the grace
period ends, reads stop but every media keeps its status. Paying the invoice
starts reads again, with nothing to resume. See
Plans and limits.
Parked media
A media isparked when ClipStake stops reading it for a reason that is not
about the media itself. There are two causes:
parked_reason is set only while status is parked, and is null in every
other status. GET /accounts carries the same field for an account whose
tracking_status is parked.
Resume a parked media with POST /submissions/{shortcode}/resume. Resuming
clears the hold and the failure count, and the media is due at once.
An automatic resume after a reconnect respects your submission capacity. Media
that does not fit stays parked until you raise the plan and resume it.
Pause and resume
Pause one media, keeping everything already collected:POST /submissions/pause and
POST /submissions/resume. Both take project_id and return how many rows
they affected. A resume also returns left_paused: rows it could not admit
because the workspace is at its submission limit.
The bulk resume acts on paused and stopped media only. It does not resume
parked media. Resume those one at a time, or reconnect the account.
Resumed media is due at once. Views are a running total, so the first reading
after a pause picks up the current figure. The gap in the series is real and
stays visible. It is never backfilled.
Reads happen on a fixed UTC schedule. A media read every 4 hours is read at
00:00, 04:00, 08:00 and so on, UTC. A bulk resume puts each row on the next
slot of that schedule, not at the moment of the resume.
pause and resume are reserved, so the project-wide
routes can never be read as a shortcode.
Reading the data
GET /submissions lists tracked media in a project. It filters on status,
external_user_id, and username, and pages with limit and cursor.
GET /submissions/{shortcode}/stats returns the time series: one point per
reading, with captured_at, the metrics, and watch time where Instagram
reports it.
null never means zero
Every metric is nullable. null means Instagram did not report the metric for
that media. A 0 is a real reading.
Do not coerce one into the other. An account that is not eligible for a metric
would become indistinguishable from an account measuring zero.
Deleting
There is no delete endpoint, and that is deliberate. The old delete only changed a status, so it was an irreversible pause with no other effect. Pause stops reads and keeps history, and thestatus filter on GET /submissions
covers list hygiene.