# Twitter Profile Scraper – X Bios, Counts & Links (`scrapingmonkey/twitter-profile-details-scraper`) Actor

Extract public Twitter (X) profiles by username. Get bios, audience counts, images, links, verification fields and pinned-post IDs in one profile row without login.

- **URL**: https://apify.com/scrapingmonkey/twitter-profile-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

Turn public Twitter (X) usernames into profile records with biographies, audience counts, links and account flags. **Twitter Profile Scraper** returns one row per processed account, including profile images, visible verification details and pinned-post IDs.

Use the data to enrich account lists, compare creators or maintain a source-linked profile directory without supplying Twitter credentials.

| At a glance | Details |
|---|---|
| 📥 Input | Plain Twitter (X) usernames without @ or profile links |
| 📤 Output | Identity, bio, counts, links, images, verification and account flags |
| 🔐 Login required | No Twitter (X) credentials or cookies |
| ⚡ Processing | Up to 5 requests concurrently with automatic retries |
| 💾 Delivery | One profile row in one table, with the same fields in JSON |

### What the Twitter (X) profile scraper extracts 🔎

The Actor collects profile details exposed in the public response. Optional account settings and counters remain distinguishable from the core identity fields.

- ID, username, display name, profile URL, bio and location
- Account creation date and timestamp
- Followers, following, post and media-post counts when exposed
- Visible likes-given, highlights, affiliate and subscription counts
- Avatar, larger avatar URL, banner, website and bio links
- Verification, protected-account and professional-account fields
- Pinned-post IDs, visible birthdate components and feature or interaction flags

### How to scrape Twitter (X) profiles 🚀

1. Add a plain username such as `NASA`.
2. Add other usernames to `inputList` for a batch.
3. Start the Actor and review the status of each profile.
4. Export the results for enrichment or reporting.

```json
{
  "inputList": [
    "NASA"
  ]
}
```

Exact duplicate usernames are normally processed once. Keep username spelling consistent across a batch; differently capitalized inputs are not explicitly merged.

### Twitter (X) profile data fields and complete output 📦

| Field group | Included data |
|---|---|
| Identity | Username, name, ID, profile URL, bio and location |
| Audience | Followers, following, posts and other available counters |
| Appearance and links | Avatars, banner, website and bio-link URLs |
| Account context | Creation date, verification, professional type and protection flag |
| Optional details | Pinned-post IDs, public birthdate components and feature flags |

Complete illustrative success item with fictional content, not a live result:

```json
{
  "input": "northstar_lab",
  "status": "success",
  "id": "100100100",
  "username": "northstar_lab",
  "name": "Northstar Lab",
  "profile_url": "https://x.com/northstar_lab",
  "description": "Research, field notes and conversations about science.",
  "location": "Singapore",
  "created_at": "2021-01-15T09:00:00Z",
  "created_timestamp": 1610701200,
  "followers_count": 4200,
  "following_count": 180,
  "posts_count": 640,
  "media_posts_count": 86,
  "likes_given_count": 320,
  "highlights_count": 8,
  "avatar_url": "https://example.com/northstar_lab_normal.jpg",
  "avatar_url_hd": "https://example.com/northstar_lab_400x400.jpg",
  "banner_url": "https://example.com/lab-banner.jpg",
  "website.url": "https://t.co/LabSite",
  "website.expanded_url": "https://example.com/lab",
  "bio_links.url": ["https://t.co/LabSite"],
  "bio_links.expanded_url": ["https://example.com/lab"],
  "bio_links.display_url": ["example.com/lab"],
  "is_verified": false,
  "verified_type": "",
  "is_blue_verified": false,
  "is_identity_verified": false,
  "verification_description": "",
  "verified_since_at": "",
  "is_protected": false,
  "possibly_sensitive": false,
  "professional_type": "Business",
  "affiliates_count": 0,
  "creator_subscriptions_count": 0,
  "can_highlight_posts": true,
  "can_receive_messages": false,
  "can_be_media_tagged": false,
  "description_language": "en",
  "profile_image_shape": "Circle",
  "pinned_post_ids": ["2088355206723477000"],
  "birthdate.day": 0,
  "birthdate.month": 0,
  "birthdate.year": 0,
  "birthdate.visibility": "",
  "birthdate.year_visibility": ""
}
```

The table and JSON use literal names such as `website.expanded_url`. Matching positions in `bio_links.url`, `bio_links.expanded_url` and `bio_links.display_url` describe the same link. Pinned IDs remain a list within the profile row.

Successful rows can contain empty strings, zero counts, false flags, empty lists or null optional branches when a value is unavailable. A failed row retains `input`, sets `status` to `failed` and leaves the entity data fields null.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Default and rules |
|---|---|---|---|
| `inputList` | array of strings | Yes | No default; at least one item. No fixed input-count maximum. |

Enter plain usernames of 1–15 letters, numbers or underscores, without `@` or a profile URL. Navigation words such as `home` and `search` are not usernames accepted by the Actor.

This Actor retrieves profile details, not posts, followers or a list of likes. A protected account can still expose profile metadata; that does not provide access to its protected posts. Visible birthday and interaction fields depend on what X includes in the response.

### Twitter (X) profile data use cases 🎯

#### Account-list enrichment

Attach numeric IDs, bios, locations and websites to known usernames.

#### Creator and brand comparison

Compare public audience counts, account positioning and verification fields across a selected account list.

#### Profile change tracking

Save scheduled snapshots to review changes in bios, links, names or follower counts.

#### Social profile directories

Use profile URLs and IDs to keep account references consistent when display names change.

### Pricing and billable profiles 💰

Check the Actor's **Pricing** tab for the current charging model and rate. The Store configuration is authoritative.

Under dataset-item pricing, each saved success or failed row can count as a billable item. Automatic retries do not independently add result rows.

One processed profile creates one result row. Bio links and pinned-post IDs do not create additional items.

### Twitter (X) profile API and integrations 🔌

Replace `$ACTOR_ID` with the ID shown in the Actor API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["NASA"]}'
```

Start runs through REST, Apify client libraries or schedules. Use webhooks to handle completion, then export the dataset as JSON, CSV or Excel, or send it to Google Sheets, Make, Zapier and your reporting tools.

### Reliability and limits ⚠️

Temporary request failures and selected access errors are retried automatically. A response without a usable account ID and username produces a failed result.

Public counters can be omitted or default to zero, and false flags can mean a setting was not exposed. Verification fields describe the response at collection time; they are not an independent identity check. A larger avatar URL is derived from the available avatar URL and is not a guarantee that a larger image remains accessible.

### Frequently asked questions ❓

#### Can I submit a profile URL or @handle?

No. Enter the plain username, such as NASA.

#### Does it scrape an account's followers or likes?

It returns available counts, not lists of followers, following accounts or liked posts.

#### Can it read protected posts?

No. Public profile metadata may be returned for a protected account, but this Actor does not collect its posts.

#### Are birthdates always available?

No. Birthdate components and visibility labels appear only when exposed in the returned profile data.

#### Does it include the pinned post text?

It returns pinned-post IDs. Use Post Details Scraper with a full post URL to collect the post itself.

### Support, responsible use, and related actors 🛟

For a reproducible issue, contact support with the run ID, approximate time and a safe public input. Keep credentials and private data out of support messages.

Use public data in line with applicable privacy, copyright and platform requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one X username per item without @ and without a profile link, for example openai.

## Actor input object example

```json
{
  "inputList": [
    "NASA"
  ]
}
```

# Actor output Schema

## `profiles` (type: `string`):

Dataset rows with success or failed status.

# 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 = {
    "inputList": [
        "NASA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/twitter-profile-details-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 = { "inputList": ["NASA"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/twitter-profile-details-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 '{
  "inputList": [
    "NASA"
  ]
}' |
apify call scrapingmonkey/twitter-profile-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/twitter-profile-details-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/5dVFgOEPUWB6CkQkJ/builds/SsYbbyvDH8yRj0MwP/openapi.json
