X / Twitter Account Origin Intelligence avatar

X / Twitter Account Origin Intelligence

Pricing

from $0.50 / 1,000 account profile analyzeds

Go to Apify Store
X / Twitter Account Origin Intelligence

X / Twitter Account Origin Intelligence

Extract X/Twitter account origin signals by username, profile URL, or numeric user ID, including account_based_in, app/source, username changes, and public profile metadata.

Pricing

from $0.50 / 1,000 account profile analyzeds

Rating

0.0

(0)

Developer

Arjun AI

Arjun AI

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

13

Monthly active users

2 days ago

Last modified

Share

Extract account-origin signals and public profile metadata from X/Twitter by username, profile URL, or numeric user ID.

Most profile scrapers focus on biographies and follower counts. This Actor also returns harder-to-find account provenance fields, including:

  • account_based_in - the country or region associated with the account
  • account_source - the signup or application source reported by X
  • username_changes.count - the number of recorded username changes
  • username_changes.last_changed_at_msec - the latest recorded username-change time
  • created_country_accurate - whether X marks the creation-country signal as accurate
  • rest_id - the account's numeric X user ID

Use it for account provenance checks, OSINT research, risk review, creator research, lead enrichment, and social media monitoring.

Quick start

Enter one or more X/Twitter accounts in the Actor input and click Start:

{
"screenNames": [
"https://x.com/apify",
"@elonmusk"
],
"userIds": [
"3510729917"
]
}

Use screenNames for plain usernames, @handles, and full x.com/twitter.com profile URLs. Use userIds for stable numeric X user IDs. You can use either field or both. Equivalent username formats are normalized, and duplicate values within each field are requested only once. If different inputs resolve to the same native X user ID, only the first successful profile is saved and charged. Invalid values are ignored before any X request is made.

Input

FieldTypeRequiredDescription
screenNamesstring[]No*Enter usernames, @handles, or full X/Twitter profile URLs.
userIdsstring[]No*Enter numeric X user IDs such as 3510729917. IDs remain stable after username changes.

*Provide at least one valid value in screenNames or userIds. A run accepts at most 100 combined account inputs after normalization and deduplication within each field. The limit applies before successful results are deduplicated by native X user ID. If no valid input remains, or if the combined total exceeds 100, the Actor writes one uncharged invalid_input record and stops before making an X request. Split larger lists across several runs.

No X login, cookies, API key, or proxy setup is required. Apify Proxy routing and internal authentication are handled automatically. Results can be downloaded from the Dataset or used through the Apify API, schedules, webhooks, and integrations.

Output

Each requested account is stored as one Dataset item. Common fields are flattened for CSV exports and the Overview and Profile details views. The original normalized X fields remain available in profile.

{
"status": "success",
"requested_screen_name": "apify",
"requested_user_id": "",
"user_id": "14110836",
"screen_name": "apify",
"name": "Apify",
"profile_url": "https://x.com/apify",
"account_based_in": "United States",
"account_source": "Web",
"created_country_accurate": true,
"username_changes_count": 1,
"username_last_changed_at": "2022-09-26T05:44:58.550Z",
"username_last_changed_at_msec": 1664171098550,
"account_created_at": "2008-03-10T14:27:04Z",
"description": "Web scraping and browser automation platform.",
"location": "",
"website_url": "https://apify.com",
"followers_count": 10000,
"following_count": 500,
"tweets_count": 3000,
"media_count": 600,
"likes_count": 2000,
"listed_count": 300,
"verified": false,
"blue_verified": true,
"protected": false,
"possibly_sensitive": false,
"business_affiliates_count": 0,
"creator_subscriptions_count": 0,
"profile_image_url": "https://pbs.twimg.com/profile_images/example_normal.jpg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/example",
"profile": {
"account_based_in": "United States",
"source": "Web",
"created_country_accurate": true,
"rest_id": "14110836",
"username_changes": {
"count": "1",
"last_changed_at_msec": "1664171098550"
},
"user_created_at": "Mon Mar 10 14:27:04 +0000 2008",
"user_name": "Apify",
"user_screen_name": "apify"
}
}

Values in this example are illustrative. Fields may be empty when X does not provide them for an account.

If a requested username or user ID does not exist, or the account is unavailable, the Actor records the condition and continues with the remaining accounts:

{
"requested_screen_name": "unknown_user",
"requested_user_id": "",
"screen_name": "unknown_user",
"status": "not_found",
"error": "X user @unknown_user was not found or is unavailable."
}

Unavailable-account records are not charged as profile-result events.

If X cannot be reached after five attempts, the Actor writes an uncharged failure record for that username and continues with the remaining inputs:

{
"requested_screen_name": "example_user",
"screen_name": "example_user",
"status": "request_failed",
"error": "AboutAccountQuery failed after 5 attempts: connection timed out."
}

Temporary network, server, access, and rate-limit failures are retried automatically, up to five attempts per X request. If a profile still cannot be checked, the Actor saves an uncharged request_failed item and continues with the remaining accounts. Accounts that X reports as unavailable remain separate not_found results.

Output fields

Field groupFields
Resultstatus, requested_screen_name, requested_user_id, error
Identityuser_id, screen_name, name, profile_url, description, location, website_url, account_created_at
Account originaccount_based_in, account_source, created_country_accurate
Username historyusername_changes_count, username_last_changed_at, username_last_changed_at_msec
Audience and activityfollowers_count, following_count, tweets_count, media_count, likes_count, listed_count
Account stateverified, blue_verified, protected, possibly_sensitive, business_affiliates_count, creator_subscriptions_count
Imagesprofile_image_url, profile_banner_url
Original dataprofile contains the complete normalized profile returned by the two X account endpoints, including less commonly used fields.

account_source, following_count, tweets_count, likes_count, and blue_verified are clearer top-level names for native values also retained as profile.source, profile.friends_count, profile.statuses_count, profile.favourites_count, and profile.is_blue_verified. ISO date fields are derived from X's native date or millisecond timestamp values; the raw username-change timestamp is also retained.

Run with the API

Replace YOUR_APIFY_TOKEN with your Apify API token.

curl -X POST \
"https://api.apify.com/v2/acts/arjun_code~x-twitter-account-origin-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"screenNames":["elonmusk"],"userIds":["3510729917"]}'

The request starts an Actor run. Use the run's default dataset ID from the API response to retrieve results after the run succeeds.

Run with Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("arjun_code/x-twitter-account-origin-scraper").call(
run_input={"screenNames": ["elonmusk"], "userIds": ["3510729917"]}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Run with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('arjun_code/x-twitter-account-origin-scraper').call({
screenNames: ['elonmusk'],
userIds: ['3510729917'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Pricing

This Actor uses pay-per-event pricing:

  • Event: profile-result
  • Price: $0.0005 per profile result
  • Equivalent price: $0.50 per 1,000 profile results

One profile-result event is charged for each unique successful profile saved to the Dataset. Duplicate successful profiles, not_found, and request_failed records do not create an additional profile-result charge. Your final run price depends on the number of profiles produced. Platform usage may be billed separately when that option is enabled in the Actor's Store pricing configuration; check the pricing section shown by Apify before starting a run.

Use cases

  • Verify account-origin signals during OSINT research
  • Review username-change history and stable numeric user IDs
  • Enrich creator, influencer, lead, or customer records
  • Support social media monitoring and account risk analysis
  • Compare public audience, activity, and verification metadata

Try a ready-made example or enter your own screen names in the Actor input:

Continue your X research workflow

GoalActor
Discover public accounts by keyword, profession, niche, or locationX (Twitter) People Search Scraper
Expand from a known profile through X's native Similar to recommendationsX (Twitter) Similar Accounts Finder — No Login
Export followers or accounts followed by one or more profilesX Followers & Following Scraper — No Login
Inspect account origin, signup source, and username-change historyX / Twitter Account Origin Intelligence
Monitor profile, username, verification, and follower changes over timeX (Twitter) Profile & Username Change Monitor

A practical workflow is: discover accounts by keyword, expand each seed through native Similar to recommendations, export selected audiences, inspect origin signals, then monitor shortlisted profiles over time.

Limitations

  • Results depend on data currently returned by X/Twitter and individual fields may be empty or unavailable.
  • Account-origin signals are reported by X and should not be treated as independent proof of a person's identity, nationality, or physical location.
  • Suspended, deleted, renamed, nonexistent, or otherwise unavailable accounts are returned with status: "not_found", and the Actor continues processing the remaining usernames.
  • Each X request is attempted up to five times. If all attempts fail, an uncharged request_failed item is written and the Actor continues with the next username.
  • X may change its response structure or access controls, which can temporarily affect availability.
  • A single run processes screen names sequentially and writes each result immediately, so larger lists take longer to complete but completed items are preserved if a later request fails.

Privacy and responsible use

This Actor processes publicly accessible X/Twitter account and profile metadata. Use the results only for lawful purposes and in accordance with applicable privacy laws, X's terms, and Apify's terms. Do not use account-origin signals alone to make high-impact decisions about individuals.

Support

If a run fails or a field is unexpectedly missing, open an issue from the Actor's Issues tab and include the run ID. Do not post API tokens, cookies, or other credentials in public issues.