POST
/api/public/v1/scrape/instagram/profile#
Profile details — bio, follower counts, verification.
Returns profile_api
Parameters
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/profile \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/profile",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/profile", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" } }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/profile"),
{ parameters: { username: "nasa" } }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/profile");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"]]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/profile", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "profile",
"target": "nasa",
"url": "https://www.instagram.com/nasa/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/followers#
Accounts that follow this profile. Use `limit` to say how many.
Returns user_feed_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/followers \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/followers",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/followers", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/followers"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/followers");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/followers", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "followers",
"target": "nasa",
"url": "https://www.instagram.com/nasa/followers/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/following#
Accounts this profile follows. Use `limit` to say how many.
Returns user_feed_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/following \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/following",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/following", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/following"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/following");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/following", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "following",
"target": "nasa",
"url": "https://www.instagram.com/nasa/following/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/posts#
A profile's post feed. Use `limit` to say how many posts you want.
Returns post_feed_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/posts \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/posts",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/posts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/posts"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/posts");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/posts", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "posts",
"target": "nasa",
"url": "https://www.instagram.com/nasa/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/reels#
Reels from a profile's Reels tab.
Returns reel_feed_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/reels \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/reels",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/reels", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/reels"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/reels");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/reels", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "reels",
"target": "nasa",
"url": "https://www.instagram.com/nasa/reels/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/post#
Details of one post — caption, counts, media, dimensions.
Returns post_detail_api
Parameters
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/post \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"shortcode": "C8xY_abcDEF"}}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/post",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"shortcode": "C8xY_abcDEF"}},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/post", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { shortcode: "C8xY_abcDEF" } }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/post"),
{ parameters: { shortcode: "C8xY_abcDEF" } }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/post");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["shortcode" => "C8xY_abcDEF"]]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"shortcode": "C8xY_abcDEF"},
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/post", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "post",
"target": "C8xY_abcDEF",
"url": "https://www.instagram.com/p/C8xY_abcDEF/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/tagged#
Posts where this profile was tagged by someone else.
Returns tagged_feed
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/tagged \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/tagged",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/tagged", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/tagged"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/tagged");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/tagged", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "tagged",
"target": "nasa",
"url": "https://www.instagram.com/nasa/tagged/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/hashtag#
Posts under a hashtag. Use `limit` to say how many you want.
Returns hashtag_feed
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/hashtag \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"tag": "spacex"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/hashtag",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"tag": "spacex"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/hashtag", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { tag: "spacex" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/hashtag"),
{ parameters: { tag: "spacex" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/hashtag");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["tag" => "spacex"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"tag": "spacex"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/hashtag", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "hashtag",
"target": "spacex",
"url": "https://www.instagram.com/explore/tags/spacex/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/location#
Posts tagged at a place. Use `limit` to say how many you want.
Returns location_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/location \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"location_id": "109524955741121"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/location",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"location_id": "109524955741121"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/location", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { location_id: "109524955741121" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/location"),
{ parameters: { location_id: "109524955741121" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/location");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["location_id" => "109524955741121"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"location_id": "109524955741121"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/location", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "location",
"target": "109524955741121",
"url": "https://www.instagram.com/explore/locations/109524955741121/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/search#
Keyword search. Use `limit` to say how many results you want.
Returns hashtag_feed
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/search \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"query": "mars rover"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/search",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"query": "mars rover"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { query: "mars rover" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/search"),
{ parameters: { query: "mars rover" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/search");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["query" => "mars rover"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"query": "mars rover"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/search", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "search",
"target": "mars rover",
"url": "https://www.instagram.com/explore/search/keyword/?q=mars+rover",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/stories#
A profile's stories that are still live. Use `limit` to say how many.
Returns story_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/stories \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/stories",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/stories", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/stories"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/stories");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/stories", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "stories",
"target": "nasa",
"url": "https://www.instagram.com/stories/nasa/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/highlights#
A profile's highlight albums — title, cover and item count.
Returns highlight_tray_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/highlights \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"username": "nasa"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/highlights",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"username": "nasa"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/highlights", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { username: "nasa" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/highlights"),
{ parameters: { username: "nasa" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/highlights");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["username" => "nasa"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"username": "nasa"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/highlights", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "highlights",
"target": "nasa",
"url": "https://www.instagram.com/nasa/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}
POST
/api/public/v1/scrape/instagram/highlight#
The stories saved inside one highlight. Use `limit` to say how many.
Returns story_api
Parameters
Takes limit — how many results you want. The run is sized from it, and you are billed for exactly that many.
Request
curl -X POST https://socialholmes.com/api/public/v1/scrape/instagram/highlight \
-H "Authorization: Bearer $SOCIALHOLMES_KEY" \
-H "Content-Type: application/json" \
-d '{"parameters": {"highlight_id": "17901234567890123"}, "limit": 25}'
import os
import requests
run = requests.post(
"https://socialholmes.com/api/public/v1/scrape/instagram/highlight",
headers={"Authorization": f"Bearer {os.environ['SOCIALHOLMES_KEY']}"},
json={"parameters": {"highlight_id": "17901234567890123"}, "limit": 25},
).json()
print(run["id"], run["status"])
const response = await fetch("https://socialholmes.com/api/public/v1/scrape/instagram/highlight", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOCIALHOLMES_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ parameters: { highlight_id: "17901234567890123" }, limit: 25 }),
})
const run = await response.json()
console.log(run.id, run.status)
require "net/http"
require "json"
response = Net::HTTP.post(
URI("https://socialholmes.com/api/public/v1/scrape/instagram/highlight"),
{ parameters: { highlight_id: "17901234567890123" }, limit: 25 }.to_json,
"Authorization" => "Bearer #{ENV.fetch('SOCIALHOLMES_KEY')}",
"Content-Type" => "application/json"
)
run = JSON.parse(response.body)
puts run["id"], run["status"]
<?php
$ch = curl_init("https://socialholmes.com/api/public/v1/scrape/instagram/highlight");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("SOCIALHOLMES_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["parameters" => ["highlight_id" => "17901234567890123"], "limit" => 25]),
]);
$run = json_decode(curl_exec($ch), true);
echo $run["id"], " ", $run["status"];
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
body, _ := json.Marshal(map[string]any{
"parameters": map[string]string{"highlight_id": "17901234567890123"},
"limit": 25,
})
req, _ := http.NewRequest("POST", "https://socialholmes.com/api/public/v1/scrape/instagram/highlight", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SOCIALHOLMES_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
var run map[string]any
json.NewDecoder(res.Body).Decode(&run)
fmt.Println(run["id"], run["status"])
}
Response
202 Accepted
{
"id": "8f14e45f-ceea-467a-9c2e-1b0f5a4c7d21",
"status": "queued",
"platform": "instagram",
"endpoint": "highlight",
"target": "17901234567890123",
"url": "https://www.instagram.com/stories/highlights/17901234567890123/",
"result_count": 0,
"created_at": "2026-08-27T17:55:19Z"
}