Get an API key; the examples use
api.socialscrape.dev.Set up
You need Python 3 and the requests package.
1python -m venv .venv2source .venv/bin/activate3pip install requests4export SOCIALSCRAPE_API_KEY=ss_live_...The script
Save as scrape.py and run python scrape.py. It calls GET /v1/instagram/search/hashtag.
1import csv2import os3import time45import requests67URL = "https://api.socialscrape.dev/v1/instagram/search/hashtag"8HEADERS = {"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]}9PARAMS = {10 "hashtag": "baking",11 "enrich": False,12}13MAX_ITEMS = 100141516def pick(obj, *path):17 """Follow a path through nested dicts; None if any step is missing or null."""18 for key in path:19 obj = obj.get(key) if isinstance(obj, dict) else None20 return obj212223def get(params):24 """One request. Failures cost nothing; retry the ones the API marks retryable."""25 for attempt in range(3):26 body = requests.get(URL, headers=HEADERS, params=params, timeout=60).json()27 if body["ok"]:28 return body29 err = body["error"]30 if not err["retryable"] or attempt == 2:31 raise RuntimeError(f'{err["code"]}: {err["message"]}')32 time.sleep(2**attempt)333435items = []36params = dict(PARAMS)37while len(items) < MAX_ITEMS:38 body = get(params)39 items += body["data"]["items"]40 if not body["has_more"]:41 break42 params["cursor"] = body["cursor"]43items = items[:MAX_ITEMS]4445with open("out.csv", "w", newline="", encoding="utf-8") as f:46 writer = csv.writer(f)47 writer.writerow(["text", "id", "stats.likes"])48 for item in items:49 writer.writerow([pick(item, "text"), pick(item, "id"), pick(item, "stats", "likes")])5051print(f"saved {len(items)} rows to out.csv, credits left: {body['credits_remaining']}")How it works
get()sends one request and retries the failures the API marksretryable. A failed request costs nothing.- The loop follows
cursoruntilhas_moreis false or 100 items are collected. Each page costs its own price. pick()reads nested fields and givesNoneinstead of crashing when the platform returnednull.- Rows go to
out.csv, one column per field.
What you get back
These fields come from a recorded sample. The full field list is on the endpoint page.
SampleFields in the script
1{2 "text": "Reappearing on your feed, mine's on the reel cover😭 #baking #handmade #aesthetic #pinterest",3 "id": "De1XqvcOC4p",4 "stats": {5 "likes": 1530006 }7}The short version
Without paging, saving or retries, the request is this.
1import os2import requests34params = {5 "hashtag": "baking",6 "enrich": False,7}8res = requests.get(9 "https://api.socialscrape.dev/v1/instagram/search/hashtag",10 headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},11 params=params,12 timeout=60,13)14body = res.json()1516if body["ok"]:17 print(body["data"])18else:19 print(body["error"]["code"], body["error"]["message"])With the SDK
The Python client does the retries and the paging for you: see the SDKs.
1from socialscrape import SocialScrape23client = SocialScrape() # reads SOCIALSCRAPE_API_KEY45for item in client.paginate(client.instagram.search_hashtag, hashtag="baking", enrich=False, max_items=100):6 print(item["text"])What it costs
1 credit. A failed request costs nothing. Add max_age_days to reuse a cached result for 0 credits. Results are kept 30 days.
Next
- The same request in nine languages.
- Instagram posts by hashtag API: sample response and every parameter.
- The JavaScript version.
- All Instagram endpoints.