{
  "openapi": "3.0.1",
  "info": {
    "title": "Twitter Competitor Analysis: AI Winning Tweets & Profile Posts",
    "description": "First 25 winning tweets free. Twitter competitor analysis, pay per qualified winning tweet: track competitor tweets that beat their own average — ranked, why they won, a remix draft. Free demo on any plan. Tweet Hunter alternative.",
    "version": "0.1",
    "x-build-id": "waxCYWTJnwDBW60LG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~x-winning-tweets-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-x-winning-tweets-ai",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/rich_minds~x-winning-tweets-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-x-winning-tweets-ai",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/rich_minds~x-winning-tweets-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-x-winning-tweets-ai",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "preset": {
            "title": "Start from a ready niche search (one click)",
            "enum": [
              "custom",
              "saas-founders",
              "creator-ghostwriting",
              "ai-builders",
              "growth-marketers",
              "rising-now",
              "agency-two-clients"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it replaces the sample accounts below (the untouched sample counts as empty) and runs a capped live read — at most $0.15 of source spend unless you set your own cap. A value you typed yourself always wins; the status names the accounts that ran. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "accounts": {
            "title": "X accounts to analyse",
            "type": "array",
            "description": "X handles, @handles or x.com profile URLs. Each tweet is compared with its own account's median; only the ones that beat it are kept. The prefill is the free demo's sample — typing your own switches to the live read on your Apify plan, any plan that runs Store Actors. Affects what you pay: ≈ $0.0005 per tweet read.",
            "items": {
              "type": "string"
            }
          },
          "focusTopic": {
            "title": "Focus topic (optional)",
            "type": "string",
            "description": "Your niche in plain words, e.g. <i>B2B SaaS pricing</i>. With AI on, winners that are clearly about something else are skipped and <b>never charged</b> (AI off: a winner must mention one of its words). Empty = every winner counts."
          },
          "brandDescription": {
            "title": "Your brand (for the remix drafts)",
            "type": "string",
            "description": "One sentence on your brand and audience, e.g. <i>Acme Analytics — product analytics for early-stage SaaS founders who build in public</i>. The AI rewrites each winner's structure — hook, format, call to action — into a remix idea and a draft post for you, never copying its words. Empty = no remix (the status says so)."
          },
          "notifyEmail": {
            "title": "E-mail me the new winning tweets (optional)",
            "type": "string",
            "description": "After every run with at least one new winning tweet, the digest (how many are new, the top 10 with links and why they won) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly (Actions → Schedule) and only new winners reach your inbox. Never sent for the free demo."
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Winning tweets scoring below this are discarded and <b>not charged</b>. 30 keeps every tweet that beat its account's median by the multiple (2× scores 45, 4× 70, 8× 95); raise it to pay only for the biggest outliers. Affects what you pay.",
            "default": 30
          },
          "maxQualified": {
            "title": "Max winning tweets to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.015 with AI on (× $0.003 with AI off), e.g. 100 × $0.015 = $1.50 worst case; the source's own spend has its cap right below. The biggest outliers are output first. Affects what you pay.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the X profile scraper may charge your account in a live read — $0.50 in the form and for an API or agent call that leaves it out (≈ 1,000 tweets at $0.0005), so a first real read can never cost more. Raise it for more accounts or a longer window. Affects what you pay.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Explain why each winner worked (hook, topic, CTA, tone), check it against your focus topic and draft a remix for your brand. <b>On = $0.015 per winning tweet + AI tokens; off = $0.003</b>. Your first 5 get live AI verdicts on any plan; every one with Apify model access, our AI key or a paid own key.",
            "default": true
          },
          "outlierMultiple": {
            "title": "Beat the account's median by (×)",
            "minimum": 1,
            "maximum": 100,
            "type": "number",
            "description": "A tweet wins when its metric is at least this many times its own account's median in the window. 2 = twice a normal post. Lower it to see more winners, raise it for only the outliers. Affects what you pay (more winners, more charged rows).",
            "default": 2
          },
          "lookbackDays": {
            "title": "Window: last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "The days of tweets read per account and used for its median. 90 balances a solid baseline and the source bill; 30 for prolific accounts or a Free plan. Ignored when a start and end date are set (advanced). Affects what you pay (a longer window reads more tweets).",
            "default": 90
          },
          "winnersWithinDays": {
            "title": "Only winners from the last N days (0 = whole window)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Deliver only winners posted in the last N days while the median still uses the whole window. A scheduled run sets this to the days since its last run, so a weekly schedule gets each week's new winners against a 90-day baseline.",
            "default": 0
          },
          "maxTweetsPerAccount": {
            "title": "Max tweets read per account (0 = no limit)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Caps the source read per account (its <code>maxCollections</code>). 300 covers 90 days of a daily poster. Affects what you pay: ≈ $0.0005 per tweet read, on your Apify account.",
            "default": 300
          },
          "metric": {
            "title": "Compare tweets by",
            "enum": [
              "engagement",
              "likes",
              "views",
              "bookmarks",
              "engagementRate"
            ],
            "type": "string",
            "description": "The number each tweet is compared on. <b>Engagement</b> = likes + reposts + replies + bookmarks.",
            "default": "engagement"
          },
          "topPerAccount": {
            "title": "Max winners per account (0 = all)",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Keep only each account's N best winners — e.g. 5 for a weekly top-5 per competitor. Trimmed winners are never charged. Affects what you pay.",
            "default": 0
          },
          "formats": {
            "title": "Formats to keep",
            "type": "array",
            "description": "Only analyse tweets of these formats (the median is then the median of those formats). Empty = all formats.",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "photo",
                "video",
                "gif",
                "quote",
                "thread",
                "link"
              ],
              "enumTitles": [
                "Text only",
                "Photo",
                "Video",
                "GIF",
                "Quote post",
                "Thread opener",
                "Link post"
              ]
            }
          },
          "minLikes": {
            "title": "Min likes",
            "minimum": 0,
            "type": "integer",
            "description": "Tweets with fewer likes are dropped before the median — also passed to the source, so it never reads (or bills) them.",
            "default": 0
          },
          "excludeTerms": {
            "title": "Exclude tweets mentioning",
            "type": "array",
            "description": "Words or hashtags (e.g. <code>giveaway</code>) — tweets that mention one are dropped before the median and never charged.",
            "items": {
              "type": "string"
            }
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver winners with at least one of these tags, ranked by how many they have. Empty = keep every winner. An API call passes the names from the README's flag table, e.g. <code>thread_format</code> (<code>threadFormat</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "viral_outlier",
                "thread_format",
                "video_format",
                "photo_format",
                "quote_post",
                "link_post",
                "text_only",
                "question_hook",
                "number_hook",
                "how_to_hook",
                "contrarian_hook",
                "story_hook",
                "cta_in_text",
                "high_bookmarks",
                "low_baseline_confidence",
                "baseline_zero",
                "verified_account"
              ],
              "enumTitles": [
                "At least 5× the account's median",
                "Thread opener",
                "Video post",
                "Photo post",
                "Quote post",
                "Carries a link",
                "Plain text",
                "Opens with a question",
                "Opens with a number or list",
                "Opens with a how-to",
                "Contrarian opener",
                "Personal story opener",
                "Asks for a reply, follow, bookmark, repost, DM or click",
                "Bookmarks ≥ 20% of likes",
                "Low-confidence baseline",
                "Account median is 0",
                "Verified account"
              ]
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Tweet URLs, tweet ids or @accounts to never output — skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. On a plan without that access our own AI key assesses every winning tweet at the same AI price. <b>My own key</b> — your OpenAI / Anthropic / Gemini / Groq key instead: measured 2026-10-17, a free google:gemini-3.5-flash-lite key assessed 10 of 10 winning tweets at ≈ 0.7–0.8 s each; a busy free key may stop after 1–3 AI checks (the rest keep their rule score); a paid Groq / Gemini key (billing on) assesses every winning tweet.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>google:gemini-3.5-flash-lite</code> (the own-key default)."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "sendAlertsTo": {
            "title": "Send alerts to (Slack, Discord, Teams, Google Chat, Telegram or webhook)",
            "type": "string",
            "description": "Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot&lt;token&gt;/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets the winning tweets as JSON. After every run with at least one new winning tweet, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same winning tweet twice",
            "type": "boolean",
            "description": "Remembers every winning tweet you were charged for (by tweet id, in a named key-value store on your account) and skips it in future runs — a weekly schedule returns only new winners.",
            "default": true
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>x-winning-tweets-log</code>) and every run appends its new winning tweets with the date to that named dataset on your account — one list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the winning tweets come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — read the accounts live with the X profile scraper below, on your Apify account, billed separately (any plan that runs Store Actors). <b>dataset</b> — an existing run of either X source. <b>list</b> — tweet rows you paste in (fields: README → List-mode rows). <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the winners — the source is never run. The mode you choose always runs as chosen; only the untouched sample next to accounts you typed switches to the live read (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.",
            "default": "actor"
          },
          "failOnSourceError": {
            "title": "Fail the run when the source delivers nothing",
            "type": "boolean",
            "description": "Off (default): a plan that cannot run the X scraper ends SUCCEEDED with 0 rows and <code>OUTPUT.ok: false</code>. On: the same run ends FAILED with the same message, so a schedule's or an API pipeline's failed-run alert fires. Turn it on for every schedule.",
            "default": false
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode. Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "Tweets to analyse (list mode)",
            "type": "array",
            "description": "Only for <b>list</b> mode. A JSON array of tweet rows from either X source (<code>tweetId</code>, <code>fullText</code>, <code>authorHandle</code>, <code>likeCount</code>, <code>createdAt</code> … — README → List-mode rows). The prefill is the free demo: 54 sample tweets of 3 fictional accounts."
          },
          "discoveryActorId": {
            "title": "X source",
            "enum": [
              "delicious_zebu/advanced-x-twitter-profile-scraper",
              "scraper_one/x-profile-posts-scraper"
            ],
            "type": "string",
            "description": "Which Store Actor reads the accounts in a live read. <b>Profile scraper by date range</b> (default, $0.0005 per tweet + $0.00005 per start; Free plan: 50 tweets per run) reads exactly your window, with bookmarks and ad / retweet flags. <b>Profile posts scraper</b> ($0.0004 per post + $0.0025 per run; Free plan: 5 profiles × 100 posts) reads each profile's latest posts — no date range, no bookmarks; the window is then applied here and marked approximate.",
            "default": "delicious_zebu/advanced-x-twitter-profile-scraper"
          },
          "language": {
            "title": "Tweet language",
            "enum": [
              "any",
              "en",
              "es",
              "pt",
              "fr",
              "de",
              "it",
              "nl",
              "sv",
              "pl",
              "tr",
              "ru",
              "uk",
              "ar",
              "hi",
              "id",
              "ja",
              "ko",
              "zh",
              "th",
              "vi"
            ],
            "type": "string",
            "description": "Passed to the source, so it only reads (and bills) tweets in this language.",
            "default": "any"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified winning tweets are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "API only — hidden on the form. Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted by Apify, never logged."
          },
          "webhookSecret": {
            "title": "Webhook signing secret (optional)",
            "type": "string",
            "description": "Any random string. Every webhook POST then carries <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body with this secret&gt;</code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged."
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source and mode): adding an account keeps it, so a scheduled run never re-delivers what you already have. Running it for several clients on one account, type one name per client.",
            "default": "x-winning-tweets-ai-seen"
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long the source Store Actor may run before its partial results are used — never more than 60 % of the run's time left, so the AI, the charges and the digest keep the rest. Raise it (and the run timeout) when the status says the source stopped early.",
            "default": 3600
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL (API only)",
            "type": "string",
            "description": "Deprecated alias of <code>sendAlertsTo</code> (kept for earlier API callers; it wins over the same service there). API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Slack incoming-webhook URL for the digest."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL (API only)",
            "type": "string",
            "description": "Deprecated alias of <code>sendAlertsTo</code> (kept for earlier API callers; it wins over the same service there). API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Discord channel webhook URL for the digest."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (API only)",
            "type": "string",
            "description": "Deprecated alias of <code>sendAlertsTo</code> (kept for earlier API callers; it wins over the same service there). API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL (API only)",
            "type": "string",
            "description": "Deprecated alias of <code>sendAlertsTo</code> (kept for earlier API callers; it wins over the same service there). API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Google Chat space webhook URL for the digest."
          },
          "telegramUrl": {
            "title": "Telegram sendMessage link (API only)",
            "type": "string",
            "description": "Deprecated alias of <code>sendAlertsTo</code> (kept for earlier API callers; it wins over the same service there). API only — hidden on the form, where <code>sendAlertsTo</code> takes it. The bot's sendMessage link with its chat_id."
          },
          "minBaselinePosts": {
            "title": "Posts for a confident baseline",
            "minimum": 3,
            "maximum": 1000,
            "type": "integer",
            "description": "API only — hidden on the form. An account with fewer posts in the window still gets a baseline (from 3 posts), flagged <code>baselineConfidence: low</code>; under 3 posts it is skipped (<code>baseline_too_small</code>).",
            "default": 8
          },
          "minRetweets": {
            "title": "Min reposts",
            "minimum": 0,
            "type": "integer",
            "description": "API only — hidden on the form. Tweets with fewer reposts are dropped — also passed to the source.",
            "default": 0
          },
          "minViews": {
            "title": "Min views",
            "minimum": 0,
            "type": "integer",
            "description": "API only — hidden on the form. Tweets with fewer views (or none reported) are dropped before the median.",
            "default": 0
          },
          "minBookmarks": {
            "title": "Min bookmarks",
            "minimum": 0,
            "type": "integer",
            "description": "API only — hidden on the form. Tweets with fewer bookmarks are dropped. The alternate source reports no bookmarks, so leave 0 there.",
            "default": 0
          },
          "excludeReplies": {
            "title": "Skip replies",
            "type": "boolean",
            "description": "API only — hidden on the form. On: the source skips replies (cheaper). Off: an account's replies to itself are joined to their opener as <code>threadParts</code>; replies to others are still dropped.",
            "default": true
          },
          "includeRetweets": {
            "title": "Count retweets",
            "type": "boolean",
            "description": "API only — hidden on the form. Off: plain retweets are dropped (they are someone else's tweet).",
            "default": false
          },
          "excludeAds": {
            "title": "Skip promoted tweets",
            "type": "boolean",
            "description": "API only — hidden on the form. Paid reach is not a content win: promoted tweets are dropped.",
            "default": true
          },
          "writeRemix": {
            "title": "Write remix drafts",
            "type": "boolean",
            "description": "API only — hidden on the form. With AI on and your brand filled in, each winner gets a remix idea and a draft post. Off = analysis only.",
            "default": true
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (× max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. How many of the best rule-scored candidates get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "dedupeTtlDays": {
            "title": "Deliver a winning tweet again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "API only — hidden on the form. How long a delivered winning tweet stays remembered. 0 = never deliver or charge it again (a tweet's id never changes).",
            "default": 0
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live search",
            "type": "boolean",
            "description": "API only — hidden on the form. On (default): search terms typed next to the untouched sample records start the live search (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the terms it did not search. API pipelines that must never start a paid read on their own: send <code>false</code>.",
            "default": true
          },
          "startDate": {
            "title": "Start date (optional)",
            "type": "string",
            "description": "API only — hidden on the form. YYYY-MM-DD. With an end date it replaces <b>Window: last N days</b>."
          },
          "endDate": {
            "title": "End date (optional)",
            "type": "string",
            "description": "API only — hidden on the form. YYYY-MM-DD, set together with the start date."
          },
          "splitMode": {
            "title": "Source date split",
            "type": "string",
            "description": "API only — hidden on the form. How the source splits the window into searches — <b>day</b> for accounts that post many times a day (its own advice). One of: <code>day</code>, <code>week</code>, <code>month</code>.",
            "default": "week"
          },
          "keyword": {
            "title": "Only tweets containing",
            "type": "string",
            "description": "API only — hidden on the form. One keyword the source searches for inside the accounts' tweets — e.g. <i>pricing</i>. Empty = every tweet."
          },
          "mediaFilter": {
            "title": "Media",
            "type": "string",
            "description": "API only — hidden on the form. Passed to the source. One of: <code>any</code>, <code>images</code>, <code>videos</code>.",
            "default": "any"
          },
          "sort": {
            "title": "Source order",
            "type": "string",
            "description": "API only — hidden on the form. <b>Latest</b> reads the window evenly, which the median needs. One of: <code>Latest</code>, <code>Top</code>.",
            "default": "Latest"
          },
          "minEngagementRatePct": {
            "title": "Min engagement rate % (metric: engagement rate)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "API only — hidden on the form. With <b>Compare tweets by</b> = engagement rate: a tweet wins at this rate (engagement ÷ followers × 100) instead of the multiple. 0 = use the multiple.",
            "default": 0
          },
          "discoveryInput": {
            "title": "Source Actor input",
            "type": "object",
            "description": "API only — hidden on the form. Only for a live read. Extra input passed to the X source as-is, key by key over what this form sets (e.g. <code>{\"splitMode\": \"day\"}</code>). The live read runs <code>delicious_zebu/advanced-x-twitter-profile-scraper</code> on your Apify account — any plan that runs Store Actors (its Free plan returns up to 50 tweets per run); without one, paste rows you already have in <b>list</b> mode (any plan)."
          },
          "maxToProcess": {
            "title": "Max candidates to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many winning-tweet candidates are scored in one run (controls run time). Default = 3 × max winning tweets."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per winning tweet the moment it is ready. Higher = one POST per N winning tweets.",
            "default": 1
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}