NewQuery every scraper through one REST API

0 scrapers for your AI

SocialData runs scheduled scrapers over Facebook, Instagram, TikTok and RSS sources, normalises every post into one schema, and serves it to your apps and agents over a Bearer-token REST API.

Ready-to-run or wire it into your own stack

Four ready-made scrapers

Paste a Facebook, Instagram or TikTok profile URL — or any RSS feed — pick an interval, and the pipeline keeps collecting on its own.

Create a project

Your pipeline, our data

Read the same normalised posts over HTTP with a project-scoped token — four GET endpoints, JSON out, no SDK to install.

See the endpoints

Projects and tasks

Group scraping targets into projects, one task per profile URL, and watch every run from a single dashboard.

Interval scheduling

Each task carries an interval in hours; the pipeline picks up whatever is due and updates the next run time.

REST API export

Mint project-scoped Bearer tokens and read your projects, targets and scraped posts over HTTP.

Run status you can see

Every attempt is logged as queued, running, succeeded or failed — no silent retries.

One schema per platform

Every payload is deduplicated per post and normalised into one typed shape per platform, ready to query or join.

Isolated by default

Row-level security scopes data to your organisation, and API keys are stored as SHA-256 hashes only.

From a profile URL to queryable data

Four steps, the same ones the dashboard walks you through.

01

Create a project

A project groups scraping targets by brand, campaign, or whatever fits your workflow. It belongs to your organisation, so access follows your members and roles.

Project
Name          Brand monitoring
Organisation  Acme
Members       3 · admin, admin, user
Targets       0 so far
02

Add profile URLs

Paste a profile URL and pick the platform. Each platform's adapter validates the link first, so a malformed or unsupported URL never reaches the scraper.

Target
Platform   facebook
URL        facebook.com/your-page   ✓ valid
Interval   every 24 hours
Next run   in 24 hours
03

Run and transform

Every due target is scraped, then reduced in three passes: the payload is kept as collected, deduplicated per post, then normalised into one typed shape per platform.

Run
1 · collected     42 items, kept as returned
2 · deduplicated  38 new, 4 already seen
3 · normalised    38 posts, one schema

Status            queued → running → succeeded
04

Export via API

Mint a project-scoped token and read the normalised posts over HTTP — same records the dashboard shows, no SDK to install. The endpoint reference comes with your account.

Export
Auth      project-scoped Bearer token
Format    JSON, newest first
Per call  up to 100 posts
Fields    id · text · engagement · media · time

Four GET endpoints, JSON out

Read-only by design, one token per project. Scroll through the calls.

GET/api/v1/projects

List your projects

Every call carries a Bearer token scoped to one project. Tokens are stored as SHA-256 hashes with an expiry you choose, and can be revoked instantly.

GET /api/v1/projects
{
  "projects": [
    {
      "project_id": 1,
      "project_name": "Brand monitoring",
      "descriptions": "…"
    }
  ]
}
GET/api/v1/projects/:id/tasks

Targets with their schedule

Each target comes back with the profile it scrapes, its interval and the next run, so you can mirror the schedule in your own system.

GET /api/v1/projects/:id/tasks
{
  "tasks": [
    {
      "task_id": 1,
      "interval": 24,
      "next_run_at": "2026-01-01T00:00:00Z",
      "is_active": true,
      "profiles": {
        "profile_id": 1,
        "platform_name": "facebook",
        "link_url": "facebook.com/your-page"
      }
    }
  ]
}
GET/api/v1/projects/:id/tasks/:taskId

One target in detail

Fetch a single target when you only need its current state — handy for polling a run you just started from the dashboard.

GET /api/v1/projects/:id/tasks/:taskId
{
  "task": {
    "task_id": 1,
    "project_id": 1,
    "interval": 24,
    "is_active": true
  }
}
GET/api/v1/data/:platform/:profileId

The collected posts

Reads one profile's posts, newest first, up to 100 per call. Supported today: facebook, instagram, tiktok. Read-only — the public API never writes.

GET /api/v1/data/:platform/:profileId
{
  "data": [
    {
      "post_id": "…",
      "caption": "…",
      "reactions": 0,
      "comments": 0,
      "posted_at": "2026-01-01T00:00:00Z"
    }
  ]
}

What teams do with the data

Same collected posts, four different jobs.

AI

Ground an agent in what people just posted

Hand the latest captions and engagement for the accounts you track to a model as context. Collection runs on a schedule, so the answers stop being months out of date.

Reporting

Charts without the copy-paste ritual

Point a BI tool at the collected posts and let it refresh itself — engagement over time, per account, per platform.

Monitoring

Watch competitors without watching a feed

Track the accounts you care about at the interval you choose. New posts land in your project, so you diff periods instead of scrolling.

Archive

Keep the history after a post disappears

Runs append rather than overwrite, and a re-run never duplicates what was already collected. A post its author deleted is still in your record.

Multi-tenant from the first table

Isolation is enforced in the database, not in the UI layer.

Organisations and roles

Members join an organisation as super admin, admin or user, and every project belongs to that organisation.

Row-level security

Database policies scope reads to your own organisation — the web app queries with your session, not a shared key.

Scoped API keys

Tokens are SHA-256 hashed, tied to a single project, expire on a date you choose, and can be revoked instantly.

Auditable pipeline

The payload as collected, the deduplicated history and the normalised posts are each kept separately, so any figure can be traced back.

It’s time to run
your first scraper.