# TLS Law School Forum Scraper (`jungle_synthesizer/top-law-schools-tls-forum-scraper`) Actor

Extracts discussion threads from the Top-Law-Schools forums: admissions-cycle chatter, scholarship-negotiation threads, and candid school reviews across every board. Each record includes the thread title, board, author, post and reply dates, reply/view counts, and the first post's full text.

- **URL**: https://apify.com/jungle\_synthesizer/top-law-schools-tls-forum-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Education, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TLS Law School Forum Scraper

Extract discussion threads from [Top-Law-Schools.com](https://www.top-law-schools.com/forums/) — the largest pre-law community forum. Returns admissions-cycle chatter, scholarship-negotiation threads, and candid school reviews across every board: Admissions, Choosing a Law School, Financial Aid, Class-of-year boards, practice-area boards, and more.

***

### Features

- Discovers and covers **every board on the forum** — not one department. No board list to maintain; new boards are picked up automatically.
- Returns the thread title, board, original poster, post date, reply/view counts, last-post date, canonical thread URL, and the first post's full text.
- Derives school-name tags from the thread title (e.g. a thread comparing Vanderbilt and Tulane is tagged `["Vanderbilt", "Tulane"]`) — empty when a thread doesn't name a school, never a guess.
- Set `maxItems` to control how many threads you need; the crawl samples across the whole forum rather than draining one board first.
- Resumable — a run that stops partway through a large crawl can continue without re-fetching or re-charging for threads already collected.

***

### Who Uses TLS Forum Data?

- **Pre-law advising services** — Ground admissions guidance in what applicants are actually asking and comparing, not just published stats.
- **Legal education researchers** — Study qualitative admissions-cycle sentiment (scholarship negotiation, school comparisons, candid reviews) alongside hard-stat sources.
- **Content and marketing teams** — Surface trending topics, questions, and school comparisons for pre-law audiences.
- **Sentiment and market analysts** — Track how applicant sentiment toward specific schools shifts across an admissions cycle.

***

### How It Works

1. **Discover boards** — The scraper reads the forum index and finds every active board.
2. **List threads** — Each board's thread list is paginated, collecting title, author, dates, and reply/view counts per thread.
3. **Fetch first post** — Each thread's opening post is fetched for its full text.
4. **Export** — Results land in your Apify dataset as clean JSON. `maxItems` controls how many threads you get back.

***

### Input

```json
{
  "maxItems": 50
}
```

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| maxItems | integer | 10 | Maximum number of threads to return. |
| resumeCursor | string | — | Cursor from a previous run's Output. Supply it to continue a large crawl without re-fetching or re-charging for threads already received. |

***

### Output Fields

```json
{
  "thread_title": "Going to a T14 at full COA vs. t20 with half scholarship",
  "board": "Law School Admissions Forum",
  "author": "PatrickAtkins1989",
  "post_date": "Fri Jul 24, 2026 5:35 pm",
  "reply_count": 1,
  "view_count": 126,
  "last_post_date": "Thu Jul 30, 2026 5:10 pm",
  "thread_url": "https://www.top-law-schools.com/forums/viewtopic.php?f=2&t=316099",
  "first_post_body": "To preface, I am a 24 year old who has worked as a paralegal for just over two years...",
  "tags": []
}
```

| Field | Type | Description |
|-------|------|-------------|
| thread\_title | string | Thread title |
| board | string | Board name (e.g. "Choosing a Law School", "Financial Aid") |
| author | string | Original poster's username |
| post\_date | string | Original post's timestamp |
| reply\_count | number | Number of replies in the thread |
| view\_count | number | Number of views on the thread |
| last\_post\_date | string | Timestamp of the most recent post |
| thread\_url | string | Canonical thread URL |
| first\_post\_body | string | Full text of the opening post |
| tags | array | Law schools named in the thread title, if any |

***

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large forum-wide crawl stops before it finishes — because it hit `maxItems`, a spend cap, or was aborted — you can pick up where it left off: start a new run with **the same input** plus that `resumeCursor`. The crawl continues from the queued work the previous run didn't reach.

- You are **not re-charged** for threads the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly the 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

```json
{
  "maxItems": 500,
  "resumeCursor": "<paste the resumeCursor from the previous run's Output>"
}
```

***

### FAQ

#### How do I scrape Top-Law-Schools forum threads?

Set `maxItems` to how many threads you need and run. The scraper discovers every board on the forum, walks each board's thread list, and returns each thread's metadata plus the full text of its opening post.

#### Does this cover the whole forum or just one board?

The whole forum. The scraper discovers every active board from the forum index at run time — Admissions, Choosing a Law School, Financial Aid, Class-of-year boards, practice-area boards, and identity/affinity boards — rather than a fixed list, so newly added boards are picked up automatically.

#### What data can I get from TLS?

Thread title, board, original poster, post date, reply and view counts, last-post date, the canonical thread URL, and the opening post's full text. Threads that name a specific school in their title also carry a `tags` field with the school(s) named.

#### How much does this cost to run?

Pay-per-event pricing. You're charged per thread returned, plus a small run-start fee.

***

### Need More Features?

Need custom fields, reply-thread extraction, or a different output shape? [Open an issue](https://console.apify.com/actors/06NEZnYRYJEfXYeAk/issues) or get in touch.

### Why Use This Scraper?

- **Whole-forum coverage** — Every board, discovered automatically, not a hand-picked subset.
- **Qualitative admissions intel** — Scholarship negotiation, school comparisons, and candid reviews you won't find in structured stat databases.
- **Clean, consistent output** — Every record has the same shape: thread metadata plus the opening post's full text.
- **Resumable** — Pick up a large crawl where it left off without paying twice for the same thread.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `maxItems` (type: `integer`):

Maximum number of records to scrape

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/top-law-schools-tls-forum-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/top-law-schools-tls-forum-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/top-law-schools-tls-forum-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/top-law-schools-tls-forum-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/06NEZnYRYJEfXYeAk/builds/h23faTT4rd4zYL0Ky/openapi.json
