# Threads API scraper — public Threads (Meta) profiles, posts, replies, reposts, post detail, conversations and search (no login, public content only)

> Public Threads profile by username — name, bio, bio links, follower count, verification, profile picture and user id.
> ReefAPI engine `threads` · 11 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/threads/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /threads/v1/profile — 1 credit
Public Threads profile by username — name, bio, bio links, follower count, verification, profile picture and user id.

**Parameters:**
- `username` (string, required) — Threads handle without the @ (the name in threads.com/@<username>).

**Returns:** profile{} — username, full_name, biography, bio_links[], follower_count, profile_pic_url, user_id, is_verified, is_private, category, external_url

**Example request body:**
```json
{
  "username": "zuck"
}
```

### POST /threads/v1/posts — 1 credit
Public posts from a Threads profile (most-recent first). Returns full text, media, engagement counts, location and music per post. Set `limit` for how many to return.

**Parameters:**
- `username` (string, required) — Threads handle without the @ (the name in threads.com/@<username>).
- `limit` (integer, optional, default 25) — Max items to return (1-100). Larger values are clamped to 100.

**Returns:** posts[] (id, code, url, text, media_type, image_url/video_url, carousel_media[], like/reply/repost/quote counts, taken_at, location, music, usertags[])

**Example request body:**
```json
{
  "username": "natgeo",
  "limit": 10
}
```

### POST /threads/v1/replies — 1 credit
Public replies from a Threads profile (the Replies tab). Set `limit` for how many to return.

**Parameters:**
- `username` (string, required) — Threads handle without the @ (the name in threads.com/@<username>).
- `limit` (integer, optional, default 25) — Max items to return (1-100). Larger values are clamped to 100.

**Returns:** replies[] — the profile's reply posts (same shape as posts)

**Example request body:**
```json
{
  "username": "zuck",
  "limit": 10
}
```

### POST /threads/v1/reposts — 1 credit
Posts a Threads user has reposted — the Reposts tab on their profile. Returns the original reposted posts (authored by other accounts).

**Parameters:**
- `username` (string, required) — Threads handle without the @ (the name in threads.com/@<username>).
- `limit` (integer, optional, default 25) — Max items to return (1-100). Larger values are clamped to 100.

**Returns:** reposts[] — the reposted posts (id, code, text, original username, counts, media)

**Example request body:**
```json
{
  "username": "natgeo",
  "limit": 10
}
```

### POST /threads/v1/post — 1 credit
Maximally-complete public post detail. Provide url, or username + code, or post_id. Returns text, media (image/video/carousel), all engagement counts, location, music, tagged users, link preview, language and paid-partnership flag.

**Parameters:**
- `url` (string, optional) — Full Threads post URL (alternative to username + code).
- `username` (string, optional) — Threads handle without the @ (the name in threads.com/@<username>).
- `code` (string, optional) — Post shortcode — the code in threads.com/@<username>/post/<code>. Combine with username, or pass the full post `url` instead.
- `post_id` (string, optional) — Numeric Threads post id (from a post's `id`). Alternative to url / username+code.

**Returns:** post{} — id, code, url, text, username, media_type, image_url/video_url, carousel_media[], like/reply/repost/quote/reshare/impression counts, taken_at, location, music, usertags[], link_preview, detected_language, is_paid_partnership

**Example request body:**
```json
{
  "username": "natgeo",
  "code": "DZ2pt10Eanh"
}
```

### POST /threads/v1/post_replies — 1 credit
The reply conversation for a public post (thread_items). Provide post_id, or url, or username + code.

**Parameters:**
- `post_id` (string, optional) — Numeric Threads post id (from a post's `id`). Alternative to url / username+code.
- `url` (string, optional) — Full Threads post URL (alternative to username + code).
- `username` (string, optional) — Threads handle without the @ (the name in threads.com/@<username>).
- `code` (string, optional) — Post shortcode — the code in threads.com/@<username>/post/<code>. Combine with username, or pass the full post `url` instead.
- `limit` (integer, optional, default 25) — Max items to return (1-100). Larger values are clamped to 100.

**Returns:** replies[] — reply posts to the target post (id, code, text, username, counts, media)

**Example request body:**
```json
{
  "username": "natgeo",
  "code": "DZ2pt10Eanh",
  "limit": 10
}
```

### POST /threads/v1/search — 2 credits
Search public Threads posts by keyword. Returns matching public posts with author, text and permalink.

**Parameters:**
- `q` (string, required) — Search keyword (also accepted as 'query').
- `limit` (integer, optional, default 25) — Max items to return (1-50). Larger values are clamped to 50.

**Returns:** results[] — matching public posts (id, code, username, text, url)

**Example request body:**
```json
{
  "q": "reef",
  "limit": 10
}
```

### POST /threads/v1/user_search — 1 credit
Look up the public Threads account whose handle matches a query (exact / near-exact). NOTE: full fuzzy people search is login-gated by Threads; logged-out resolves the matching handle, like instagram's users_search.

**Parameters:**
- `q` (string, required) — Search keyword (also accepted as 'query').

**Returns:** users[] — matching public account(s) (username, full_name, follower_count, user_id, is_verified, profile_pic_url, bio)

**Example request body:**
```json
{
  "q": "natgeo"
}
```

### POST /threads/v1/followers — 1 credit
Account-gated: the followers list requires a logged-in Threads session and is not available for public (logged-out) use.

**Parameters:**
- `username` (string, optional) — Threads handle without the @ (the name in threads.com/@<username>).

**Returns:** Requires a logged-in Threads session — not available for public (logged-out) use.

### POST /threads/v1/following — 1 credit
Account-gated: the following list requires a logged-in Threads session and is not available for public (logged-out) use.

**Parameters:**
- `username` (string, optional) — Threads handle without the @ (the name in threads.com/@<username>).

**Returns:** Requires a logged-in Threads session — not available for public (logged-out) use.

### POST /threads/v1/likes — 1 credit
Account-gated: the list of accounts that liked a post (who-liked) is not exposed to logged-out clients by Threads — it requires a logged-in session.

**Parameters:**
- `url` (string, optional) — Full Threads post URL (alternative to username + code).
- `username` (string, optional) — Threads handle without the @ (the name in threads.com/@<username>).
- `code` (string, optional) — Post shortcode — the code in threads.com/@<username>/post/<code>. Combine with username, or pass the full post `url` instead.
- `post_id` (string, optional) — Numeric Threads post id (from a post's `id`). Alternative to url / username+code.

**Returns:** Requires a logged-in Threads session — the who-liked list is not public. The aggregate like_count IS available on `post` / `posts`.

## More
- Try it live, no code: https://reefapi.com/playground?engine=threads
- Human docs page: https://reefapi.com/docs/threads
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
