Prism Profile Comments API
Scrape Prism Profile Comments data with one API call. Give it a profile, page or channel on Instagram, Facebook, YouTube, TikTok or X and it reads the comments under that account's most recent posts, then returns them as one flat list, newest first, in the same comment rows as each platform's own comment endpoint. Every row names its post: `comment.post_id` and `comment.ext.post_url`. Pass `since` to get only the comments published after it, which is how you poll for new comments without diffing anything yourself. On Instagram and YouTube the comments are read newest first, so each post stops at the first comment older than `since`: a call with a recent `since` reads about one comment page a post. Facebook and TikTok do not return comments newest first, so each post is read up to `per_post` comments and filtered by `since` (`window.ordered` is false and `_warnings` says so). `posts` is how many of the most recent posts are scanned (posts whose comment count is 0 are skipped free). `data.posts` lists every post scanned with its status, the comments read and kept, the pages and credits it cost and why its walk stopped; `next_cursor` there continues one post on its own comment endpoint. One post that fails never fails the call: it is marked `failed` in `posts`, named in `legs` and `_warnings`, and not charged. Replies come nested where the platform's comment endpoint nests them. It is also a Monitor recipe: create a monitor on `prism/profile/comments` with `track` (`items[].comment.engagement.likes` and `total`), `since: "now-3h"`, an hourly cadence and `webhook_rows: "new"`, and each run delivers only the comments that are new since the previous run (add `alert_rules` `rows_new gt 0` with `suppress_webhook_unless_alert` to send nothing when nothing is new). Never cached.
Last updated October 2026Maintained by the SocialCrawl team
Returns the comments under a profile's recent Instagram, Facebook, YouTube, TikTok or X posts as one list, newest first, each naming its post, and only those after `since` when you pass it.
Use it to watch an account's own posts for new comments: poll it with a recent `since`, or put a Monitor on it with `webhook_rows: "new"` so each run sends only the comments that are new.
Searching 69 platforms in parallel
What can you do with the Profile Comments API?
The Profile Comments endpoint gives you structured Prism data with computed fields in a single request. No scraping infrastructure to build or maintain.
Example Request
curl -H "x-api-key: YOUR_API_KEY" \
"https://www.socialcrawl.dev/v1/prism/profile/comments?url=https%3A%2F%2Fwww.instagram.com%2Fnasa%2F&posts=3&per_post=20"import requests
response = requests.get(
"https://www.socialcrawl.dev/v1/prism/profile/comments",
params={
'url': 'https://www.instagram.com/nasa/',
'posts': '3',
'per_post': '20',
},
headers={"x-api-key": "YOUR_API_KEY"},
)
data = response.json()const response = await fetch(
"https://www.socialcrawl.dev/v1/prism/profile/comments?url=https%3A%2F%2Fwww.instagram.com%2Fnasa%2F&posts=3&per_post=20",
{
headers: { "x-api-key": "YOUR_API_KEY" },
},
);
const data = await response.json();Parameters
| Parameter | Required | Description |
|---|---|---|
| url | No | The profile, page or channel URL: instagram.com/<handle>, facebook.com/<page>, youtube.com/@<handle> or youtube.com/channel/UC..., tiktok.com/@<handle>, or x.com/<handle>. The platform is read from the URL. A link to one post is refused: use that platform's own comment endpoint for one post. One of `url` or `handle` is required. |
| platform | No | With `handle`: instagram, facebook, youtube, tiktok or twitter (x is accepted for twitter). Not needed with `url`. (instagram | facebook | youtube | tiktok | twitter | x) |
| handle | No | The account's handle, with or without @, together with `platform`. On YouTube a channel id (UC...) works too. A pasted profile URL is read like `url`. |
| posts | No | How many of the profile's most recent posts to scan (1-25, default 10). A post whose comment count is 0 is skipped and costs nothing. |
| per_post | No | The most comments read on each post (1-200, default 50), newest first on Instagram and YouTube. Sets the hold; you pay only for the pages read. |
| since | No | Only comments published at or after this time: an ISO 8601 timestamp or YYYY-MM-DD (midnight UTC). On Instagram and YouTube each post's walk stops at the first older comment; on Facebook and TikTok the comments are filtered. In a Monitor, `now-3h` (or `now-1d`) is resolved to a timestamp at every run. |
What does the Prism Profile Comments API return?
Every response follows one unified schema. Here is a real, unmodified response body, so you can see the exact fields you get back before spending a credit.
Example response
{
"success": true,
"platform": "youtube",
"endpoint": "/v1/youtube/video/comments",
"data": {
"items": [
{
"comment": {
"id": "Ugzge340dBgB75hWBm54AaABAg",
"url": null,
"parent_id": null,
"post_id": "dQw4w9WgXcQ",
"text": "Sample comment text (redacted).",
"author": {
"username": "user_607bca",
"display_name": "user_607bca",
"avatar_url": "https://example.com/avatars/user_b3bde6.png",
"verified": null
},
"engagement": {
"likes": 322497,
"replies": 1000
},
"flags": {
"pinned": null,
"deleted": false
},
"published_at": "2025-04-22T19:05:08.000Z",
"ext": {
"replies_token": "sc2.eyJzIjoiYSIsImMiOiJVZ3pnZTM0MGRCZ0I3NWhXQm01NEFhQUJBZyJ9",
"updated_at": "2025-04-22T19:05:08Z",
"author_channel_id": "user_0faa89",
"author_url": "https://example.com/user_fa30a8",
"viewer_rating": "Sample comment text (redacted).",
"text_original": "Sample comment text (redacted).",
"preview_replies": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR",
"channelId": "user_b70959",
"videoId": "dQw4w9WgXcQ",
"textDisplay": "Sample comment text (redacted).",
"textOriginal": "Sample comment text (redacted).",
"parentId": "Ugzge340dBgB75hWBm54AaABAg",
"authorDisplayName": "user_a07ce6",
"authorProfileImageUrl": "https://example.com/avatars/user_b7fd7d.png",
"authorChannelUrl": "https://example.com/user_7ab559",
"authorChannelId": {
"value": "user_5afaba"
},
"canRate": true,
"viewerRating": "Sample comment text (redacted).",
"likeCount": 7573,
"publishedAt": "2025-04-22T19:14:32Z",
"updatedAt": "2025-04-22T19:14:32Z"
},
{
"id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA",
"channelId": "user_b70959",
"videoId": "dQw4w9WgXcQ",
"textDisplay": "Sample comment text (redacted).",
"textOriginal": "Sample comment text (redacted).",
"parentId": "Ugzge340dBgB75hWBm54AaABAg",
"authorDisplayName": "user_d8b3d6",
"authorProfileImageUrl": "https://example.com/avatars/user_2ece01.png",
"authorChannelUrl": "https://example.com/user_7a3f35",
"authorChannelId": {
"value": "user_da87da"
},
"canRate": true,
"viewerRating": "Sample comment text (redacted).",
"likeCount": 3180,
"publishedAt": "2025-04-22T19:19:13Z",
"updatedAt": "2025-04-22T19:19:13Z"
}
]
}
},
"computed": {
"language": "en",
"labels": {
"sentiment": {
"level": 3,
"score_0_1": 0.85,
"confidence": 0.61
},
"question": {
"p": 0.03
},
"purchase_intent": {
"p": 0.02
},
"complaint": {
"p": 0.04
}
}
}
},
{
"comment": {
"id": "UgzjClLu_KHsDVWheGx4AaABAg",
"url": null,
"parent_id": null,
"post_id": "dQw4w9WgXcQ",
"text": "Sample comment text (redacted).",
"author": {
"username": "user_f90324",
"display_name": "user_f90324",
"avatar_url": "https://example.com/avatars/user_191ddb.png",
"verified": null
},
"engagement": {
"likes": 1,
"replies": 0
},
"flags": {
"pinned": null,
"deleted": false
},
"published_at": "2026-10-02T15:39:20.000Z",
"ext": {
"replies_token": "sc2.eyJzIjoiYSIsImMiOiJVZ3pqQ2xMdV9LSHNEVldoZUd4NEFhQUJBZyJ9",
"updated_at": "2026-10-02T15:39:20Z",
"author_channel_id": "user_121069",
"author_url": "https://example.com/user_ec3ca5",
"viewer_rating": "Sample comment text (redacted).",
"text_original": "Sample comment text (redacted)."
}
},
"computed": {
"language": "en",
"labels": {
"sentiment": {
"level": 3,
"score_0_1": 0.76,
"confidence": 0.8
},
"question": {
"p": 0.02
},
"purchase_intent": {
"p": 0.02
},
"complaint": {
"p": 0.03
}
}
}
}
],
"next_cursor": "sc2.eyJzIjoiYSIsImMiOiJzYzEuZXlKaklqb2lXakpXTUZneU5XeGtNbFo2WkVZNWJXRllTbnBrUXpCMFVUSmtibE5YWkVKVlZscEhUakphVTFRd1NrcFNhMDVPV2pKa1NGRlZSbFJSYkVad1drVnNRMW93U2taYU1WWktZVlZPUWxkVlJrTlRWVnBFVXpKa2JsSXdSa0pWTUVwU1lWVm9TbEZ0WkVKU1YyUldVMWMxY0ZGV2JFSlJhMnhIVVRCc2Nsb3daRUpSVjJ4RldqSTVUbEV3ZEd4YU1UZzFWbFZrUmxNeWF6Rk9SWEJDVWtaV1FsRnNiRUpWVVQwOUlpd2ljeUk2V3lKVlozcG5aVE0wTUdSQ1owSTNOV2hYUW0wMU5FRmhRVUpCWnlJc0lsVm5lbXBEYkV4MVgwdEljMFJXVjJobFIzZzBRV0ZCUWtGbklsMTkifQ",
"total": null,
"labels": {
"presets": [
"sentiment",
"question"
],
"rows": 2,
"labelled": 2,
"cached": 1,
"skipped": 0,
"unjudged": 0,
"dropped": 0,
"dropped_ids": [],
"extra_credits": 0,
"methodology_version": "labels/1",
"mode": "default",
"status": "complete",
"pending": 0,
"pending_ids": []
},
"label_share": {
"policy_version": "share/1",
"presets": {
"question": {
"n": 2,
"counted": 0,
"abstained": 0,
"share": null,
"low": 0,
"high": 0.575,
"receipts": [],
"policy_version": "share/1",
"too_few": true,
"at_cut": 0,
"nulls": 0,
"low_confidence": 0
},
"purchase_intent": {
"n": 2,
"counted": 0,
"abstained": 0,
"share": null,
"low": 0,
"high": 0.575,
"receipts": [],
"policy_version": "share/1",
"too_few": true,
"at_cut": 0,
"nulls": 0,
"low_confidence": 0
},
"complaint": {
"n": 2,
"counted": 0,
"abstained": 0,
"share": null,
"low": 0,
"high": 0.575,
"receipts": [],
"policy_version": "share/1",
"too_few": true,
"at_cut": 0,
"nulls": 0,
"low_confidence": 0
},
"sentiment": {
"positive": {
"n": 2,
"counted": 2,
"abstained": 0,
"share": null,
"low": 0.425,
"high": 1,
"receipts": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"text": "Sample comment text (redacted)."
},
{
"id": "UgzjClLu_KHsDVWheGx4AaABAg",
"text": "Sample comment text (redacted)."
}
],
"policy_version": "share/1",
"too_few": true,
"at_cut": 2,
"nulls": 0,
"low_confidence": 0
},
"neutral": {
"n": 2,
"counted": 0,
"abstained": 0,
"share": null,
"low": 0,
"high": 0.575,
"receipts": [],
"policy_version": "share/1",
"too_few": true,
"at_cut": 0,
"nulls": 0,
"low_confidence": 0
},
"negative": {
"n": 2,
"counted": 0,
"abstained": 0,
"share": null,
"low": 0,
"high": 0.575,
"receipts": [],
"policy_version": "share/1",
"too_few": true,
"at_cut": 0,
"nulls": 0,
"low_confidence": 0
}
}
}
},
"comment_language": {
"policy_version": "share/1",
"n": 2,
"abstained": 0,
"judged_by": {
"script": 0,
"choice": 2
},
"shares": {
"en": {
"n": 2,
"counted": 2,
"abstained": 0,
"share": null,
"low": 0.425,
"high": 1,
"receipts": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"text": "Sample comment text (redacted)."
},
{
"id": "UgzjClLu_KHsDVWheGx4AaABAg",
"text": "Sample comment text (redacted)."
}
],
"policy_version": "share/1",
"too_few": true
}
}
},
"comment_recency": {
"policy_version": "d09-1",
"n": 2,
"counted": 2,
"abstained": 0,
"share_last_24h": 0.5,
"share_later_half": null,
"too_few": true,
"stage": "unknown",
"order": "top",
"recent_share_is_floor": true,
"receipts": [
{
"id": "UgzjClLu_KHsDVWheGx4AaABAg",
"text": "Sample comment text (redacted)."
}
]
},
"dropped": 0
},
"credits_used": 1,
"credits_remaining": 9999,
"request_id": "req-8Kq2ZmR4vT9xLb3P",
"cached": false,
"pagination": {
"next_cursor": "sc.eyJ2IjoyLCJjIjoic2MyLmV5SnpJam9pWVNJc0ltTWlPaUp6WXpFdVpYbEtha2xxYjJsWGFrcFhUVVpuZVU1WGVHdE5iRm8yV2tWWk5XSlhSbGxUYm5CclVYcENNRlZVU210aWJFNVlXa1ZLVmxac2NFaFVha3BoVlRGUmQxTnJjRk5oTURWUFYycEthMU5HUmxaU2JGSlNZa1ZhZDFkclZuTlJNVzkzVTJ0YVlVMVdXa3RaVmxaUFVXeGtWbEpyVGxSV1ZuQkZWWHBLYTJKc1NYZFNhMHBXVFVWd1UxbFdWbTlUYkVaMFdrVktVMVl5VWxkVk1XTXhZMFpHVjJKRlNsSmhNbmhJVlZSQ2MyTnNiM2RhUlVwU1ZqSjRSbGRxU1RWVWJFVjNaRWQ0WVUxVVp6RldiRlpyVW14TmVXRjZSazlTV0VKRFZXdGFWMUZzUm5OaVJVcFdWVlF3T1VscGQybGplVWsyVjNsS1Zsb3pjRzVhVkUwd1RVZFNRMW93U1ROT1YyaFlVVzB3TVU1RlJtaFJWVXBDV25sSmMwbHNWbTVsYlhCRVlrVjRNVmd3ZEVsak1GSlhWakpvYkZJelp6QlJWMFpDVVd0R2JrbHNNVGtpZlEiLCJlIjoieW91dHViZS92aWRlby9jb21tZW50cyIsInAiOiJjb250aW51YXRpb25Ub2tlbiJ9",
"has_more": true,
"page_size": 2
},
"redacted": true
}Example captured from the YouTube API. Every SocialCrawl endpoint returns this same unified schema, so your Prism Profile Comments response has the same fields.
How does the Prism Profile Comments API work?
Send a GET request with your API key and get back clean, structured JSON in our unified schema. Supported computed fields are populated when the source provides the required inputs.
Method
GET
Response
JSON
How do you scrape social media data in seconds?
The fastest social media scraping API for developers. Scrape profiles, posts, comments, and analytics from 69 platforms covering 10B+ monthly active users.
One schema, every platform
Query 69 platforms with identical response structures. Write your integration once.
Computed fields, not just scraped
When an endpoint supports these metrics and the source provides the required inputs, the normalized record includes engagement_rate, estimated_reach, content_category, and language. Ready to use.
See your data before you code
Visual Data Explorer. Paste any URL, get rich result cards, sortable tables, CSV export.
import requests
response = requests.get(
'https://www.socialcrawl.dev/v1/tiktok/profile',
params={'handle': 'charlidamelio'},
headers={'x-api-key': 'sc_YOUR_API_KEY'}
)
data = response.json(){
"success": true,
"platform": "tiktok",
"data": {
"author": {
"username": "charlidamelio",
"followers": 152400000
},
"engagement": {
"likes": 12400000000,
"engagement_rate": 0.087
},
"metadata": {
"language": "en",
"content_category": "lifestyle"
}
}
}Ready to scrape Prism Profile Comments data?
Get your API key and start pulling Prism data in under 60 seconds.
