Skip to content
ScrapeField

Social listening across X, TikTok, Instagram and Google reviews

What people say about a brand is spread over four platforms: posts on X, comments under TikTok videos and Instagram posts, and reviews on Google Maps. One API reads all of them, each in its platform’s own shape, so a listening tool, a dashboard or an agent can watch them on a schedule.

What you get

  • Every post on X that names a brand, most viewed first, with the brand’s own posts left out.
  • The comments under a brand’s TikTok videos and Instagram posts, ready for a sentiment model.
  • New Google reviews of every location, the day they land.
  • Who reposted a post, largest audience first.

Worked examples

Each with the calls it makes and what a run costs, multiplied out from the published price of every call.

01

Hear what people say about a brand

Search the brand’s name once a day, leave out its own posts and the reposts, and rank what is left by views. The posts at the top are the ones people actually saw.

GET x/search× 30390 cr
a month, one search daily390 cr

≈ $0.232 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const query = '"blue door coffee" -from:bluedoorcoffee since:2026-10-01';
const { data } = await sf('x/search', { query });

const seen = data
  .filter((p) => !p.referenced_tweets.some((r) => r.type === 'retweeted'))
  .map((p) => ({
    url: p.url,
    by: p.author.username,
    views: p.public_metrics.impression_count ?? 0,
  }))
  .sort((a, b) => b.views - a.views);

console.table(seen.slice(0, 10));
02

Hear about a bad review the day it lands

Check the newest reviews at each of your locations once a day and raise anything at two stars or below — with whether the owner has already replied, so nobody answers twice.

GET google-maps/reviews× 1,5009,000 cr
a month, 50 locations checked daily9,000 cr

≈ $5.36 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const since = Date.now() - 24 * 3600 * 1000;

for (const place_id of myLocations) {
  const q = { place_id, sort: 'newest', limit: 20 };
  const { data } = await sf('google-maps/reviews', q);
  const bad = data.filter(
    (r) => r.publish_time !== null && Date.parse(r.publish_time) > since && r.rating !== null && r.rating <= 2,
  );

  for (const r of bad) {
    const replied = r.owner_response ? 'already answered' : 'no reply yet';
    notify(place_id, r.rating, r.text, replied);
  }
}
03

Find the questions in the comments

Under a brand’s videos, the comments are an unfiltered support queue. Pull them for each video and keep the ones that ask something — with the likes that show how many people want the same answer.

GET tiktok/comments× 100300 cr
100 videos, 50 comments each300 cr

≈ $0.179 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const questions = [];

for (const url of brandVideos) {
  const { data } = await sf('tiktok/comments', { url, limit: 50 });
  for (const c of data.filter((c) => c.text?.includes('?'))) {
    const { text, like_count, reply_count } = c;
    questions.push({ video: url, text, like_count, reply_count });
  }
}

questions.sort((a, b) => b.like_count - a.like_count);
04

Read every comment on a post

Page through the comments fifty at a time until you have them all — author, text, date, likes and reply count each — and hand them to a sentiment model or a spreadsheet.

GET instagram/comments× 1030 cr
per post, 500 comments30 cr

≈ $0.018 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const comments = [];
let cursor;

do {
  const q = { shortcode, limit: 50 };
  if (cursor) q.cursor = cursor;
  const { data, meta } = await sf('instagram/comments', q);
  comments.push(...data);
  cursor = meta.next_cursor;
} while (cursor && comments.length < 500);
05

Find who carried a post

A post travels on the accounts that repost it. Read who reposted a launch, sort them by followers, and you have the short list of people whose audience it reached.

GET x/retweeters× 565 cr
per post, about 100 reposters65 cr

≈ $0.039 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const people = [];
let cursor;

do {
  const page = await sf('x/retweeters', { url: launchPost, ...(cursor && { cursor }) });
  people.push(...page.data);
  cursor = page.meta.next_cursor;
} while (cursor && people.length < 100);

const loudest = people
  .map((u) => ({ username: u.username, followers: u.public_metrics.followers_count }))
  .sort((a, b) => (b.followers ?? 0) - (a.followers ?? 0));

Step by step

Guides that build one of these from the first call to the finished sheet, workflow or alert.

The endpoints

Every call above, with its price. A failed call costs nothing.

What it does not do

Only what is public: no direct messages, no one’s private account, and no platform’s own analytics. Reddit, YouTube and Facebook are not covered yet.

Your first call, in a minute

Get a key