Nimbryxo Studio

X/Twitter Keyword & Hashtag Tweet Search

Search X (Twitter) by keyword, phrase or hashtag and get tweet text, author, engagement metrics, media and language. Every row says which keyword found it. No login required.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
keywordsarrayrequiredWords, phrases, hashtags or full X search queries to monitor. Each keyword is searched separately, and every result row tells you which keyword found it (searchTerm).
maxTweetsintegeroptionalStop after this many tweets for each keyword.
maxItemsintegeroptionalAlias of Maximum tweets per keyword. The actor accepts either name.
Show all input fields
FieldTypeRequiredDescription
keywordsarrayrequiredWords, phrases, hashtags or full X search queries to monitor. Each keyword is searched separately, and every result row tells you which keyword found it (searchTerm).
maxTweetsintegeroptionalStop after this many tweets for each keyword.
maxItemsintegeroptionalAlias of Maximum tweets per keyword. The actor accepts either name.
searchTypestringoptionalTop returns the most relevant and popular tweets. Latest returns the newest tweets first — best for real-time monitoring.
sortstringoptionalAlias of Result order. The actor accepts either name.
languagestringoptionalOnly return tweets written in this language. Leave the default to search all languages.
dateFromstringoptionalOnly return tweets posted on or after this date. Leave empty for no lower bound.
dateTostringoptionalOnly return tweets posted on or before this date. Leave empty for no upper bound.
excludeRetweetsbooleanoptionalSkip retweets/reposts and keep only original posts.
excludeRepliesbooleanoptionalSkip replies and keep only top-level posts.
onlyVerifiedUsersbooleanoptionalOnly return tweets from verified (blue check) accounts.
onlyImagesbooleanoptionalOnly return tweets that contain at least one image.
onlyVideosbooleanoptionalOnly return tweets that contain at least one video or GIF.
minimumLikesintegeroptionalOnly return tweets with at least this many likes. Leave empty for no minimum.
minimumRetweetsintegeroptionalOnly return tweets with at least this many retweets. Leave empty for no minimum.
minimumRepliesintegeroptionalOnly return tweets with at least this many replies. Leave empty for no minimum.
proxyConfigurationobjectoptionalOptional. Use a proxy if you run large jobs or see frequent IP-based rate limits.
startDatestringoptionalDeprecated — use 'Start date' instead. Kept so existing saved inputs keep working. Format: YYYY-MM-DD.
endDatestringoptionalDeprecated — use 'End date' instead. Kept so existing saved inputs keep working. Format: YYYY-MM-DD.

Download the published input schema

View complete JSON
{
  "properties": {
    "dateFrom": {
      "description": "Only return tweets posted on or after this date. Leave empty for no lower bound.",
      "editor": "datepicker",
      "nullable": true,
      "title": "Start date",
      "type": "string"
    },
    "dateTo": {
      "description": "Only return tweets posted on or before this date. Leave empty for no upper bound.",
      "editor": "datepicker",
      "nullable": true,
      "title": "End date",
      "type": "string"
    },
    "endDate": {
      "description": "Deprecated — use 'End date' instead. Kept so existing saved inputs keep working. Format: YYYY-MM-DD.",
      "editor": "textfield",
      "nullable": true,
      "title": "End date (legacy)",
      "type": "string"
    },
    "excludeReplies": {
      "default": false,
      "description": "Skip replies and keep only top-level posts.",
      "prefill": false,
      "title": "Exclude replies",
      "type": "boolean"
    },
    "excludeRetweets": {
      "default": false,
      "description": "Skip retweets/reposts and keep only original posts.",
      "prefill": false,
      "title": "Exclude retweets (reposts)",
      "type": "boolean"
    },
    "keywords": {
      "description": "Words, phrases, hashtags or full X search queries to monitor. Each keyword is searched separately, and every result row tells you which keyword found it (searchTerm).",
      "editor": "stringList",
      "example": [
        "web scraping",
        "data mining",
        "#AI"
      ],
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "prefill": [
        "apify"
      ],
      "title": "Search keywords",
      "type": "array"
    },
    "language": {
      "default": "Any language",
      "description": "Only return tweets written in this language. Leave the default to search all languages.",
      "editor": "select",
      "enum": [
        "Any language",
        "en",
        "es",
        "zh",
        "hi",
        "ar",
        "bn",
        "pt",
        "ru",
        "ja",
        "de",
        "fr",
        "ko",
        "tr",
        "vi",
        "te",
        "mr",
        "ta",
        "ur",
        "it",
        "th",
        "gu",
        "fa",
        "pl",
        "uk",
        "ml",
        "kn",
        "id",
        "ms",
        "sw",
        "ha",
        "am",
        "my",
        "pa",
        "nl",
        "ro",
        "el",
        "he",
        "sv",
        "hu",
        "cs"
      ],
      "enumTitles": [
        "Any language",
        "English",
        "Spanish",
        "Chinese",
        "Hindi",
        "Arabic",
        "Bengali",
        "Portuguese",
        "Russian",
        "Japanese",
        "German",
        "French",
        "Korean",
        "Turkish",
        "Vietnamese",
        "Telugu",
        "Marathi",
        "Tamil",
        "Urdu",
        "Italian",
        "Thai",
        "Gujarati",
        "Persian",
        "Polish",
        "Ukrainian",
        "Malayalam",
        "Kannada",
        "Indonesian",
        "Malay",
        "Swahili",
        "Hausa",
        "Amharic",
        "Burmese",
        "Punjabi",
        "Dutch",
        "Romanian",
        "Greek",
        "Hebrew",
        "Swedish",
        "Hungarian",
        "Czech"
      ],
      "prefill": "Any language",
      "title": "Language",
      "type": "string"
    },
    "maxItems": {
      "description": "Alias of Maximum tweets per keyword. The actor accepts either name.",
      "maximum": 1000,
      "minimum": 1,
      "title": "Maximum tweets per keyword (alias)",
      "type": "integer"
    },
    "maxTweets": {
      "default": 20,
      "description": "Stop after this many tweets for each keyword.",
      "maximum": 1000,
      "minimum": 1,
      "prefill": 20,
      "title": "Maximum tweets per keyword",
      "type": "integer"
    },
    "minimumLikes": {
      "description": "Only return tweets with at least this many likes. Leave empty for no minimum.",
      "maximum": 100000000,
      "minimum": 0,
      "nullable": true,
      "title": "Minimum likes",
      "type": "integer"
    },
    "minimumReplies": {
      "description": "Only return tweets with at least this many replies. Leave empty for no minimum.",
      "maximum": 100000000,
      "minimum": 0,
      "nullable": true,
      "title": "Minimum replies",
      "type": "integer"
    },
    "minimumRetweets": {
      "description": "Only return tweets with at least this many retweets. Leave empty for no minimum.",
      "maximum": 100000000,
      "minimum": 0,
      "nullable": true,
      "title": "Minimum retweets",
      "type": "integer"
    },
    "onlyImages": {
      "default": false,
      "description": "Only return tweets that contain at least one image.",
      "prefill": false,
      "title": "Tweets with images only",
      "type": "boolean"
    },
    "onlyVerifiedUsers": {
      "default": false,
      "description": "Only return tweets from verified (blue check) accounts.",
      "prefill": false,
      "title": "Verified accounts only",
      "type": "boolean"
    },
    "onlyVideos": {
      "default": false,
      "description": "Only return tweets that contain at least one video or GIF.",
      "prefill": false,
      "title": "Tweets with videos only",
      "type": "boolean"
    },
    "proxyConfiguration": {
      "description": "Optional. Use a proxy if you run large jobs or see frequent IP-based rate limits.",
      "editor": "proxy",
      "nullable": true,
      "sectionCaption": "Advanced",
      "sectionDescription": "Optional settings for large or repeated runs.",
      "title": "Proxy configuration",
      "type": "object"
    },
    "searchType": {
      "default": "Top",
      "description": "Top returns the most relevant and popular tweets. Latest returns the newest tweets first — best for real-time monitoring.",
      "editor": "select",
      "enum": [
        "Top",
        "Latest"
      ],
      "enumTitles": [
        "Top — most relevant and popular",
        "Latest — newest first"
      ],
      "prefill": "Top",
      "title": "Result order",
      "type": "string"
    },
    "sort": {
      "description": "Alias of Result order. The actor accepts either name.",
      "editor": "select",
      "enum": [
        "Top",
        "Latest"
      ],
      "enumTitles": [
        "Top — most relevant and popular",
        "Latest — newest first"
      ],
      "title": "Result order (alias)",
      "type": "string"
    },
    "startDate": {
      "description": "Deprecated — use 'Start date' instead. Kept so existing saved inputs keep working. Format: YYYY-MM-DD.",
      "editor": "textfield",
      "nullable": true,
      "sectionCaption": "Advanced (legacy)",
      "sectionDescription": "Deprecated aliases kept for backwards compatibility. Prefer the fields above.",
      "title": "Start date (legacy)",
      "type": "string"
    }
  },
  "required": [
    "keywords"
  ],
  "schemaVersion": 1,
  "title": "Twitter Keywords Scraper",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
tweetsstringoptionalDataset containing one row per tweet plus status rows when a run needs attention.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Tweets found for your keywords — text, author, engagement metrics, media and the search term that found each row.",
  "properties": {
    "tweets": {
      "description": "Dataset containing one row per tweet plus status rows when a run needs attention.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Tweets",
      "type": "string"
    }
  },
  "title": "X/Twitter Keyword & Hashtag Tweet Search Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "views": {
    "tweets": {
      "display": {
        "columns": [
          {
            "format": "text",
            "label": "Type"
          },
          {
            "format": "text",
            "label": "Keyword"
          },
          {
            "format": "text",
            "label": "Tweet"
          },
          {
            "format": "text",
            "label": "Author"
          },
          {
            "format": "text",
            "label": "Date"
          },
          {
            "format": "text",
            "label": "Language"
          },
          {
            "format": "number",
            "label": "Replies"
          },
          {
            "format": "number",
            "label": "Retweets"
          },
          {
            "format": "number",
            "label": "Likes"
          },
          {
            "format": "number",
            "label": "Quotes"
          },
          {
            "format": "number",
            "label": "Views"
          },
          {
            "format": "number",
            "label": "Engagement rate"
          },
          {
            "format": "text",
            "label": "Retweet?"
          },
          {
            "format": "text",
            "label": "Quote?"
          },
          {
            "format": "text",
            "label": "Reply?"
          },
          {
            "format": "link",
            "label": "URL"
          },
          {
            "format": "text",
            "label": "Media"
          },
          {
            "format": "text",
            "label": "Data collected at"
          }
        ],
        "component": "table"
      },
      "title": "Tweets",
      "transformation": {
        "fields": [
          "type",
          "searchTerm",
          "text",
          "author.username",
          "createdAt",
          "language",
          "replyCount",
          "retweetCount",
          "likeCount",
          "quoteCount",
          "viewCount",
          "engagementRate",
          "isRetweet",
          "isQuote",
          "isReply",
          "url",
          "media",
          "collectedAt"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

Give this actor a list of keywords, phrases or hashtags and it pulls back matching X (formerly Twitter) posts — full text, engagement counts, media and the author who wrote each one. No sign-in, cookies or developer credentials needed; it reads the same public search results any visitor sees.

What this actor does

  • Runs each entry in keywords as its own independent search, so a single job can cover several unrelated topics at once.
  • Targets up to 1,000 posts per keyword via maxTweets; how many actually come back depends on how much volume that keyword has on X.
  • Lets you sort by Top (most engagement) or Latest (newest first), and narrow by language, a date window, retweets/replies, verification, media presence, and minimum like/retweet/reply counts.
  • Stamps every row with searchTerm so a multi-keyword run stays easy to split apart afterward.
  • Emits a one-line status record for a keyword that returns nothing, rather than leaving you guessing why a keyword is missing from the dataset.
  • Drops any field with no data for that post — you will never see null, an empty string, or an empty array/object in the output.

Output per post

Core fields on every post record: id, url, text, createdAt, language (when X reports one), and searchTerm.

Engagement comes through replyCount, retweetCount, likeCount, quoteCount, bookmarkCount, and viewCount, plus a computed engagementRate — (likes + retweets + replies + quotes) ÷ followers — included only once the author's follower count is known and nonzero.

Post-type context: isReply, isRetweet, isQuote, isNoteTweet, and, for replies, conversationId, inReplyToTweetId, inReplyToUserId, inReplyToUsername, parentTweet (a nested summary of the post being replied to, when available).

Entities parsed out of the text: hashtags, mentions, urls, cashtags.

Attachments and extras, when present: media (one entry per photo/video/GIF with type, url, previewImageUrl, pixel dimensions, durationSeconds, viewCount, altText, variants), quotedTweet / quotedTweetId, poll, card, possiblySensitive, withheldInCountries, place, postedFrom, isEdited, editControl (edit history metadata), newsActionType.

The author rides along as a nested author object — id, username, name, bio, followers, isBlueVerified, verified, profileImageUrl, and more.

Every post closes with type: "post" and collectedAt.

Sample record

{
  "type": "post",
  "id": "1923456789012345678",
  "url": "https://x.com/i/status/1923456789012345678",
  "text": "Just shipped a new feature after three weeks of testing. Feels good. #buildinpublic",
  "createdAt": "2026-06-02T09:15:00+00:00",
  "language": "en",
  "searchTerm": "buildinpublic",
  "replyCount": 34,
  "retweetCount": 112,
  "likeCount": 1870,
  "quoteCount": 9,
  "bookmarkCount": 265,
  "viewCount": 54300,
  "isReply": false,
  "isRetweet": false,
  "isQuote": false,
  "hashtags": ["buildinpublic"],
  "author": {
    "id": "1092834756",
    "username": "makerjane",
    "name": "Jane Builds",
    "followers": 18400,
    "isBlueVerified": false
  },
  "collectedAt": "2026-06-02T10:03:41+00:00"
}

Output per status row

When a keyword comes back empty, the actor pushes exactly one record carrying type: "status", status, message, searchTerm (which keyword it's reporting on), and collectedAt — a signal, not a silent zero.

Input

Field Type Default Description
keywords array – Required. Words, phrases, hashtags or full search queries; each runs separately.
maxTweets integer 20 Target number of posts per keyword (1–1000).
maxItems integer – Same as maxTweets — use whichever name you prefer.
searchType string Top Top for the most engaged posts, Latest for newest-first.
sort string – Same as searchType.
language string Any language Restrict to one of 40 common X language codes, e.g. en, es, ja.
dateFrom date – Earliest post date to include.
dateTo date – Latest post date to include.
excludeRetweets boolean false Drop retweets/reposts, keep only original posts.
excludeReplies boolean false Drop replies, keep only top-level posts.
onlyVerifiedUsers boolean false Keep only posts from verified accounts.
onlyImages boolean false Keep only posts containing at least one image.
onlyVideos boolean false Keep only posts containing at least one video or GIF.
minimumLikes integer – Floor on like count.
minimumRetweets integer – Floor on retweet count.
minimumReplies integer – Floor on reply count.
proxyConfiguration object – Optional; useful for large or repeated runs from the same IP.
startDate / endDate string – Older aliases for dateFrom / dateTo (YYYY-MM-DD).

Example: two unrelated topics in one run

{
  "keywords": ["apify", "web scraping"],
  "maxTweets": 50
}

Example: live brand-mention watch

{
  "keywords": ["#YourBrand", "\"your brand\""],
  "searchType": "Latest",
  "language": "en",
  "maxTweets": 200,
  "excludeRetweets": true,
  "excludeReplies": true
}

Example: top posts in a date window, above an engagement floor

{
  "keywords": ["artificial intelligence"],
  "maxTweets": 500,
  "minimumLikes": 100,
  "minimumRetweets": 20,
  "dateFrom": "2026-01-01",
  "dateTo": "2026-06-30"
}

Use cases

  • Brand monitoring — catch new mentions of a product, campaign or handle as they post.
  • Trend and topic tracking — measure how a subject's volume and engagement shift over weeks or months.
  • Breaking-news watch — pair Latest with a tight date range to follow a fast-moving story.
  • Content research — surface the highest-engagement posts around a theme for inspiration.
  • Academic or policy research — assemble a dataset of public discourse on a topic, language or time period.
  • Competitor comparison — run several competing keywords side by side and compare volume and engagement.

FAQ

Do I need an X account or developer credentials? No — there's no credential field in the input at all. The actor reads what any logged-out visitor can already see on X's own search.

How many posts will I actually get per keyword? Up to maxTweets, but that's a ceiling, not a promise. A trending keyword might fill close to 500 rows; an obscure one may return only a handful, because that's genuinely all X's search surface has for it.

Why did I get a different count on a second identical run? X's logged-out search doesn't expose stable, full pagination, and what it surfaces can shift between requests. If you need more rows, try again or narrow the date window rather than assuming something broke.

Should I use Top or Latest? Latest for anything time-sensitive — breaking news, live mentions, a campaign in progress. Top when you want the posts with the strongest engagement regardless of when they went up.

Is a proxy required? No, it's optional. Add one mainly if you're running large or frequent jobs from the same IP and want extra headroom against rate limiting.

How current is the data? Fully live — each run queries X at the moment it executes. Put the actor on a schedule for ongoing monitoring.

How do I get the results into another tool? Pull the dataset from the run page or the Apify API, wire up a webhook, or connect it to Zapier, Make, Google Sheets, or similar no-code tools.

Is this affiliated with X? No. This is an independent, third-party actor that reads publicly available X search results.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build JUGXgeVuZX6MAfJ01. Documentation is regenerated from the default published build; private drafts are not included.