100 free credits. No credit card required.Start building
Logo
Use case

Social listening API with standing listeners on nine platforms

Create a listener for a keyword, a topic or up to 300 accounts. It checks on your schedule and delivers each new post once, by API or signed webhook.

/v1/listening/streams

A listener that checks on your schedule

  • GET /v1/listening/streams
  • GET /v1/listening/streams/{id}/mentions
  • GET /v1/webhook-endpoints
  • GET /v1/prism/discover

A social listening API watches public posts for a keyword, a topic or a list of accounts and sends you each new one. With SocialCrawl you create a listener with POST /v1/listening/streams. It checks Reddit, YouTube, X, Naver, Google News, TikTok, Facebook, Threads and LinkedIn on a schedule you choose and delivers each new post once as a mention.

What teams build with it

Every one of these is a shipped pattern, not a roadmap item. The endpoint chain under each card is the actual call sequence.

A listener for a keyword or topic

Create a listener with POST /v1/listening/streams for keywords or a boolean topic. A topic can use AND, OR, NOT, quoted phrases and brackets. It checks on your schedule and delivers each new post once as a mention, so your code never de-duplicates. You can filter by language, country, excluded terms and sponsored posts.

Endpoint chainlistening/streams (keywords or rule) -> mentions

Deep Reddit mention sweeps

Boolean queries with cursor pagination, then the full comment tree on anything that matters. No Reddit OAuth to configure. On a listener, set comments to new_posts to receive the comments under each new Reddit post.

Endpoint chainreddit/omni-search -> reddit/post/comments

An account panel of up to 300

Name up to 300 accounts in one listener and receive their new posts as mentions. Use it for a competitor list, a creator roster or a press list.

Endpoint chainlistening/streams (accounts, schedule.purpose) -> mentions

Signed webhooks with retries

Receive each new post as a webhook push with a Standard Webhooks signature. A failed delivery is retried for up to 41 hours. The same mentions are also on the events feed, GET /v1/events.

Endpoint chainwebhook-endpoints -> mention.created (signed, retried)

Usage per client for agencies

Hold up to 500 topic groups in one listener and tag usage per client with metadata.client, so an agency can see what each client costs.

Endpoint chainlistening/streams (groups, metadata.client) -> listening/usage

A recurring, judged brand watch

Send your brands and a period to Discover and get one de-duplicated list of posts across platforms, kept only when they fall in your dates and judged against your question. Post the same request with a schedule and it runs again on its own, from where the last run stopped, and a free dry run prices it first.

Endpoint chainprism/discover (brands, period, schedule)

How the social listening API works

Four calls take you from a priced rule to new mentions in your own system.

A dry run creates nothing and costs 0 credits. Each page a check reads costs what the same API call costs. On newest-first lanes a page with nothing new is refunded, so a quiet listener costs less than its estimate. The relevance check that drops off-topic posts is included in the price.

  1. POST /v1/listening/streams?dry_run=1

    Price it with a dry run

    Send your rule to POST /v1/listening/streams?dry_run=1. It creates nothing, returns the monthly cost in credits and money, and reads the rule back in words.

    0 credits
  2. POST /v1/listening/streams

    Create the listener

    Send the same body without dry_run. Set schedule.max_credits_per_month to cap the month. The first check stores what is already out there as a baseline and sends nothing.

    per page read
  3. GET /v1/listening/streams/{id}/mentions

    Read the mentions

    Read them from the listener's mentions route or from the events feed, GET /v1/events. Every later check delivers only new posts.

    0 credits
  4. POST /v1/webhook-endpoints

    Add a webhook

    Register an HTTPS endpoint with POST /v1/webhook-endpoints and each new post is pushed with a Standard Webhooks signature. Failed pushes are retried for up to 41 hours.

    free

Compared with the usual setup

Most teams either buy a per-channel listening seat or stitch together several scrapers. Here is what changes.

CapabilitySocialCrawlTypical setup
CoverageA listener watches nine platforms, and the same key reaches 69 platforms through direct calls.Priced per channel, so coverage tends to stop at two or three networks.
Response shapeOne shared schema for every mention, so downstream code is written once.A different response shape per vendor, normalised by hand.
Comment depthFull comment and reply trees on the same key, plus an option to receive the comments under each new Reddit post.Top-level comments only, or a separate product.
Pricing modelNever-expire credit packs. A free dry run prices a listener before you create it, and a monthly cap limits spend.Annual seat licences, often per channel.
Getting startedFree credits on signup, and a dry run that prices a listener before you spend anything.Sales call, then onboarding.
Building a product on topPermitted for transformed, customer-facing views. The terms say so in writing.Usually restricted or negotiated case by case.

Social listening API questions

What is a social listening API?

A social listening API returns public posts that mention a keyword, topic or account, as structured data you can store and analyse. SocialCrawl listeners run that search on a schedule for you and deliver each new post once.

Which platforms can a listener watch?

Nine: Reddit, YouTube, X, Naver, Google News, TikTok, Facebook, Threads and LinkedIn. A listener can watch keywords, a boolean topic or up to 300 named accounts. The rest of the API, 69 platforms and 679 endpoints, is available through direct calls.

How often does a listener check?

On a schedule you choose, from every 30 minutes to every 7 days. The 30-minute schedule works only on lanes that return the newest posts first: Reddit, YouTube, X and Naver news. The first check stores a baseline and sends nothing. Every later check delivers only new posts.

Do I need OAuth or a developer account per platform?

No. You authenticate once with a SocialCrawl API key. There is no per-platform OAuth app, no review process and no separate credentials to rotate.

How do I get new posts into my own system?

Read them from the listener's mentions route, poll GET /v1/events, or register a webhook endpoint and take signed pushes. Webhooks use Standard Webhooks signatures and are retried for up to 41 hours. Each new post is delivered once as a mention.

How much does social listening cost?

Each page a check reads costs what the same API call costs. On newest-first lanes a page with nothing new is refunded, so a quiet listener costs less than its estimate. A dry run (POST /v1/listening/streams?dry_run=1) prices a listener for 0 credits, and schedule.max_credits_per_month caps the month. The relevance check that drops off-topic posts is included. Signup includes 100 free credits, and there is no card required to start.

Can I build a product on top of this data?

Yes, for transformed views shown to your own users. Our terms permit dashboards and derived products, and restrict raw passthrough or bulk redistribution. If you are unsure where your design sits, ask us before you build.

Create your first listener

100 free credits on signup. A dry run prices the listener first. No card, no sales call, no per-channel pricing.

Request
curl -X POST "https://www.socialcrawl.dev/v1/listening/streams?dry_run=1" \
  -H "x-api-key: $SOCIALCRAWL_API_KEY" -H "Content-Type: application/json" \
  -d '{"keywords": ["your brand"], "platforms": ["reddit", "youtube"], "schedule": {"every": "1h", "name": "Brand watch"}}'
curl -X POST "https://www.socialcrawl.dev/v1/listening/streams" \
  -H "x-api-key: $SOCIALCRAWL_API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"keywords": ["your brand"], "platforms": ["reddit", "youtube"], "schedule": {"every": "1h", "max_credits_per_month": 5000, "name": "Brand watch"}}'

Each call runs against live data. Swap in your key and your query and it works as written.