curl --request POST \
--url https://api.recoupable.dev/api/socials/{id}/scrapeimport requests
url = "https://api.recoupable.dev/api/socials/{id}/scrape"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.recoupable.dev/api/socials/{id}/scrape', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.recoupable.dev/api/socials/{id}/scrape",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.dev/api/socials/{id}/scrape"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.dev/api/socials/{id}/scrape")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/socials/{id}/scrape")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"runId": "<string>",
"datasetId": "<string>",
"error": "<string>"
}{
"status": "error",
"message": "<string>"
}{
"error": "insufficient_credits",
"remaining_credits": 0,
"required_credits": 25,
"billingUrl": "https://app.recoupable.dev"
}Social Scrape
Trigger a scrape of one social profile. Use Get Artist Socials first to get the social id. The response is the Apify run metadata; poll it with the Scraper Results API.
Credits: 5 + posts per scrape (5 when posts is omitted).
What posts does per platform
| Platform | posts | When posts is omitted |
|---|---|---|
| ignored | the profile’s latest posts (up to 12), always | |
| TikTok | resultsPerPage | 1 video |
| YouTube | maxResults, maxResultsShorts, maxResultStreams (per content type) | 1 video, 0 Shorts, 0 streams |
| X / Twitter | timeline items; retweets and replies are fetched but not stored | 1 item |
maxPosts on the posts actor (runs instead of the profile actor) | profile only, no posts | |
| Threads | ignored | profile only |
| ignored | profile only |
What gets stored. Once the run succeeds, the webhook handler persists every item in the dataset; nothing is discarded after the response is read:
- The profile: username, avatar, bio, follower and following counts, region. Served by Get Artist Socials.
- One follower snapshot per social per day whenever the run reports a follower count (following and post counts too, where the platform reports them). Served by the
historyparameter of Get Artist Socials. - Every returned post with its engagement (
views,likes,comments,reposts, where the platform reports them). Served by Get Artist Posts. - Instagram only: the comments on the returned posts (one follow-up comments run), then one batched profile run over the distinct commenters that fills avatar, bio, follower and following counts on every commenter. Served by Get Artist Fans.
Fan discovery is one hop deep. The commenter profile run is terminal: it never schedules comments or profile runs of its own. One Instagram scrape therefore produces at most three runs (profile, comments, commenter profiles). Pass subtitles=true on a YouTube social to include each video’s transcript in the run results.
curl --request POST \
--url https://api.recoupable.dev/api/socials/{id}/scrapeimport requests
url = "https://api.recoupable.dev/api/socials/{id}/scrape"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.recoupable.dev/api/socials/{id}/scrape', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.recoupable.dev/api/socials/{id}/scrape",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.dev/api/socials/{id}/scrape"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.dev/api/socials/{id}/scrape")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/socials/{id}/scrape")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"runId": "<string>",
"datasetId": "<string>",
"error": "<string>"
}{
"status": "error",
"message": "<string>"
}{
"error": "insufficient_credits",
"remaining_credits": 0,
"required_credits": 25,
"billingUrl": "https://app.recoupable.dev"
}Path Parameters
The unique identifier (UUID) of the social profile to scrape. Obtain this from the Get Artist Socials API.
Query Parameters
Recent-post depth. Honored on TikTok, YouTube (per content type), X and LinkedIn; ignored on Instagram (always the profile's latest posts, up to 12), Threads and Facebook. Without it TikTok, YouTube and X return a single latest item, so pass it whenever you need post history. Every returned post is stored with its engagement counts. See the per-platform table above.
1 <= x <= 100YouTube only. When true, the scrape also downloads each returned video's captions (auto-generated captions preferred, English, plain text). The transcript is returned on the run's dataset items as subtitles[0].plaintext and is not persisted; read it from Scraper Results while the run's dataset is available. Ignored on every other platform. Adds no credits beyond the posts price.
Was this page helpful?
