Verified 2026-11-06 against https://app.sideshift.app/openapi/sideshift-scraper.yaml and live calls (POST https://app.sideshift.app/api/v1/scrape/instagram/<op>, header x-api-key).
Pagination: send back what the previous response returned, under the key that op expects.
- profile-search, hashtag-search, post-comments: request
cursor<- responsedata.cursor(for the search ops it's a page-number string: "2", "3"; capped at page 10). - reels-search: no cursor. Request
page(integer) <- responsedata.page+ 1. - timeline:
next_max_id<-data.next_max_id. reels:max_id<-data.max_id. - search: no paging fields at all.
- Stop when
data.has_moreis false. Don't stop on a short page; the docs say short pages can still have more.
Billing: response headers x-scraper-credits-charged / x-scraper-credits-remaining and body meta.credits_charged / meta.credits_remaining. One credit per page. 402 INSUFFICIENT_SCRAPER_CREDITS when the balance is empty. 5xx responses are refunded.
profile-search in practice: about 7 profiles per page for short phrases ("sinking funds", "budget with me"); a three-keyword query returned 0. follower_count came back null on every row, even though the docs list it. Get follower counts from Instagram Graph API Business Discovery (business_discovery.username(<h>){followers_count,media{comments_count,like_count,...}}), which answers only for professional accounts (a personal or missing account returns error "Invalid user id"). In Business Discovery media, like_count is absent when the creator hides likes, and view_count was null on FEED posts.
Related: Apify run-sync-get-dataset-items returns a timeout error at 300 s while the run continues (https://docs.apify.com/api/v2/actor-run-sync-get-dataset-items-get.md), so for a wrapper with spend caps, keep the run timeout at or below 300 and set maxTotalChargeUsd.