API REFERENCE
Social Scrape
On this page
/api/socials/{id}/scrapeTrigger 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 history parameter 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.
Authentication
See the authentication guide for API key and account access requirements.
Request
curl --request POST \
--url 'https://api.recoupable.dev/api/socials/YOUR_ID/scrape' \
--header 'x-api-key: YOUR_API_KEY'Replace the YOUR_ placeholders with your values. Required query parameters are included; optional parameters are listed below.
Parameters
Path parameters
idstringrequiredThe unique identifier (UUID) of the social profile to scrape. Obtain this from the Get Artist Socials API.
Query parameters
postsintegerRecent-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.
subtitlesbooleanYouTube 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.
Default: false
Responses
200Scrape job triggered successfully+
application/json
runIdstringUnique identifier for the Apify run
datasetIdstringUnique identifier for the dataset containing scraped data
errorstringnullableError message if the run failed (null if successful)
400Bad request - missing required parameters+
application/json
statusstring · enumStatus of the request
Values: "error"
messagestringError message
402Insufficient credits — the body includes a static billingUrl. No Stripe object is created.+
application/json
errorstring · enumrequiredValues: "insufficient_credits"
remaining_creditsintegerrequiredrequired_creditsintegerrequiredbillingUrlstringrequiredStatic link to the Recoup app, where a human can save a card and buy credits. It is a constant, not a freshly minted Stripe Checkout Session, so a credit-gated endpoint that keeps returning 402 creates nothing. To buy credits programmatically, call POST /api/credits/sessions.
Full specification
Download the OpenAPI file for complete schemas, constraints, and examples.
Download social.jsonView operation source
{
"description": "Trigger a scrape of one social profile. Use [Get Artist Socials](/api-reference/artists/socials) first to get the social `id`. The response is the Apify run metadata; poll it with the [Scraper Results API](/api-reference/apify/scraper).\n\n**Credits:** `5 + posts` per scrape (5 when `posts` is omitted).\n\n**What `posts` does per platform**\n\n| Platform | `posts` | When `posts` is omitted |\n|---|---|---|\n| Instagram | ignored | the profile's latest posts (up to 12), always |\n| TikTok | `resultsPerPage` | 1 video |\n| YouTube | `maxResults`, `maxResultsShorts`, `maxResultStreams` (per content type) | 1 video, 0 Shorts, 0 streams |\n| X / Twitter | timeline items; retweets and replies are fetched but not stored | 1 item |\n| LinkedIn | `maxPosts` on the posts actor (runs instead of the profile actor) | profile only, no posts |\n| Threads | ignored | profile only |\n| Facebook | ignored | profile only |\n\n**What gets stored.** Once the run succeeds, the webhook handler persists every item in the dataset; nothing is discarded after the response is read:\n\n- The profile: username, avatar, bio, follower and following counts, region. Served by [Get Artist Socials](/api-reference/artists/socials).\n- 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 `history` parameter of Get Artist Socials.\n- Every returned post with its engagement (`views`, `likes`, `comments`, `reposts`, where the platform reports them). Served by [Get Artist Posts](/api-reference/posts/get).\n- 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](/api-reference/fans/get).\n\n**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.",
"parameters": [
{
"name": "id",
"in": "path",
"description": "The unique identifier (UUID) of the social profile to scrape. Obtain this from the [Get Artist Socials](/api-reference/artists/socials) API.",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "posts",
"in": "query",
"description": "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.",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"example": 10
},
{
"name": "subtitles",
"in": "query",
"required": false,
"description": "YouTube 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](/api-reference/apify/scraper) while the run's dataset is available. Ignored on every other platform. Adds no credits beyond the `posts` price.",
"schema": {
"type": "boolean",
"default": false
}
}
],
"responses": {
"200": {
"description": "Scrape job triggered successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApifyRunResult"
}
}
}
},
"400": {
"description": "Bad request - missing required parameters",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SocialErrorResponse"
}
}
}
},
"402": {
"description": "Insufficient credits — the body includes a static `billingUrl`. No Stripe object is created.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SocialInsufficientCreditsResponse"
}
}
}
}
}
}