{"ok":true,"cached":true,"plan":{"sql":"WITH platform_matches AS (\n  SELECT\n    id, full_name, title, url, total_users_30d, runs30_total,\n    CASE WHEN pricing_model = 'FREE' OR COALESCE(price_usd, 0) <= 0 THEN 0.0 WHEN pricing_model = 'FLAT_PRICE_PER_MONTH' THEN COALESCE(total_users_30d, 0) * 0.15 * COALESCE(price_usd, 0) WHEN pricing_model = 'PRICE_PER_DATASET_ITEM' THEN (COALESCE(runs30_total, 0) * (1 - LEAST(GREATEST(COALESCE(hard_failure_rate, 0), 0), 1))) * 50 * COALESCE(price_usd, 0) * 0.80 WHEN pricing_model = 'PAY_PER_EVENT' THEN CASE WHEN CASE WHEN COALESCE(price_usd, 0) >= 10 THEN COALESCE(total_users_30d, 0) * 1 * COALESCE(price_usd, 0) * 0.80 WHEN COALESCE(price_usd, 0) >= 1 THEN COALESCE(total_users_30d, 0) * 10 * COALESCE(price_usd, 0) * 0.80 ELSE NULL END IS NULL THEN ((COALESCE(runs30_total, 0) * (1 - LEAST(GREATEST(COALESCE(hard_failure_rate, 0), 0), 1))) * CASE WHEN COALESCE(price_usd, 0) >= 1 THEN 1 WHEN COALESCE(price_usd, 0) >= 0.1 THEN 2 WHEN COALESCE(price_usd, 0) >= 0.01 THEN 10 ELSE 50 END * COALESCE(price_usd, 0) * 0.80) ELSE LEAST(((COALESCE(runs30_total, 0) * (1 - LEAST(GREATEST(COALESCE(hard_failure_rate, 0), 0), 1))) * CASE WHEN COALESCE(price_usd, 0) >= 1 THEN 1 WHEN COALESCE(price_usd, 0) >= 0.1 THEN 2 WHEN COALESCE(price_usd, 0) >= 0.01 THEN 10 ELSE 50 END * COALESCE(price_usd, 0) * 0.80), CASE WHEN COALESCE(price_usd, 0) >= 10 THEN COALESCE(total_users_30d, 0) * 1 * COALESCE(price_usd, 0) * 0.80 WHEN COALESCE(price_usd, 0) >= 1 THEN COALESCE(total_users_30d, 0) * 10 * COALESCE(price_usd, 0) * 0.80 ELSE NULL END) END ELSE 0.0 END AS est_monthly_revenue,\n    CASE\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%job%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%recruit%'\n        THEN 'Jobs / recruiting'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%company%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%companies%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%employee%'\n        THEN 'Company / employees'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%sales%navigator%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%lead%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%email%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%contact%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%prospect%'\n        THEN 'Lead generation'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%profile%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%people%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%person%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%user%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%account%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%channel%'\n        THEN 'Profiles / accounts'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%search%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%keyword%'\n        THEN 'Search / discovery'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%post%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%comment%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%feed%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%tweet%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%video%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%short%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%reel%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%transcript%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%subtitle%'\n        THEN 'Content / posts'\n      WHEN (full_name || ' ' || COALESCE(title,'')) ILIKE '%ad%'\n        OR (full_name || ' ' || COALESCE(title,'')) ILIKE '%advert%'\n        THEN 'Ads / marketing'\n      ELSE 'Other Twitter/X tools'\n    END AS platform_kind\n  FROM apify.actor\n  WHERE COALESCE(is_deprecated, false) = false\n    AND (LOWER(COALESCE(target_platform, '')) IN ('twitter_x') OR LOWER(COALESCE(full_name, '')) LIKE '%twitter%' OR LOWER(COALESCE(title, '')) LIKE '%twitter%' OR LOWER(COALESCE(full_name, '')) LIKE '%tweet%' OR LOWER(COALESCE(title, '')) LIKE '%tweet%' OR LOWER(COALESCE(full_name, '')) LIKE '%x-twitter%' OR LOWER(COALESCE(title, '')) LIKE '%x-twitter%' OR LOWER(COALESCE(full_name, '')) LIKE '%x.com%' OR LOWER(COALESCE(title, '')) LIKE '%x.com%')\n),\nkind_stats AS (\n  SELECT\n    platform_kind,\n    CAST(COUNT(*) AS int) AS type_actor_count,\n    CAST(COUNT(*) FILTER (WHERE COALESCE(est_monthly_revenue, 0) >= 100.0) AS int) AS type_over_threshold_actors,\n    CAST(ROUND(100.0 * COUNT(*) FILTER (WHERE COALESCE(est_monthly_revenue, 0) >= 100.0) / NULLIF(COUNT(*), 0), 2) AS double precision) AS type_over_threshold_pct,\n    CAST(MAX(COALESCE(est_monthly_revenue, 0)) AS double precision) AS top_estimated_monthly_revenue,\n    (ARRAY_AGG(full_name ORDER BY COALESCE(est_monthly_revenue, 0) DESC NULLS LAST, total_users_30d DESC NULLS LAST))[1] AS top_actor\n  FROM platform_matches\n  GROUP BY platform_kind\n),\nsummary AS (\n  SELECT\n    CAST(COUNT(*) AS int) AS total_platform_actors,\n    CAST(COUNT(DISTINCT platform_kind) AS int) AS platform_type_count,\n    CAST(100.0 AS double precision) AS revenue_threshold_usd,\n    CAST(COUNT(*) FILTER (WHERE COALESCE(est_monthly_revenue, 0) >= 100.0) AS int) AS over_threshold_actors,\n    CAST(ROUND(100.0 * COUNT(*) FILTER (WHERE COALESCE(est_monthly_revenue, 0) >= 100.0) / NULLIF(COUNT(*), 0), 2) AS double precision) AS over_threshold_pct,\n    CAST(SUM(COALESCE(est_monthly_revenue, 0)) AS double precision) AS total_estimated_monthly_revenue\n  FROM platform_matches\n)\nSELECT\n  0 AS sort_order,\n  platform_name || ' crawler summary' AS title,\n  platform_key,\n  platform_name,\n  NULL::text AS platform_kind,\n  total_platform_actors, platform_type_count, revenue_threshold_usd,\n  over_threshold_actors, over_threshold_pct, total_estimated_monthly_revenue,\n  NULL::int AS type_actor_count, NULL::int AS type_over_threshold_actors,\n  NULL::double precision AS type_over_threshold_pct,\n  NULL::text AS top_actor, NULL::double precision AS top_estimated_monthly_revenue\nFROM summary, (SELECT 'twitter_x' AS platform_key, 'Twitter/X' AS platform_name) p\nUNION ALL\nSELECT\n  CAST(ROW_NUMBER() OVER (ORDER BY type_actor_count DESC, top_estimated_monthly_revenue DESC) AS int) AS sort_order,\n  'Type - ' || platform_kind AS title,\n  'twitter_x' AS platform_key,\n  'Twitter/X' AS platform_name,\n  platform_kind,\n  NULL::int, NULL::int, CAST(100.0 AS double precision),\n  NULL::int, NULL::double precision, NULL::double precision,\n  type_actor_count, type_over_threshold_actors, type_over_threshold_pct,\n  top_actor, top_estimated_monthly_revenue\nFROM kind_stats\nORDER BY sort_order, type_actor_count DESC NULLS LAST\nLIMIT 10","mode":"sql","view":"auto","limit":10,"notes":[],"offset":0,"rationale":"pg sql path (Text-to-SQL / vector over pgvector)"},"results":[{"key":"Twitter/X crawler summary","url":null,"score":null,"title":"Twitter/X crawler summary","platform_key":"twitter_x","platform_name":"Twitter/X","over_threshold_pct":15.84,"platform_type_count":7,"over_threshold_actors":51,"revenue_threshold_usd":100,"total_platform_actors":322,"total_estimated_monthly_revenue":295695.003676999},{"key":"Type - Other Twitter/X tools","url":null,"score":null,"title":"Type - Other Twitter/X tools","top_actor":"danek/twitter-scraper-ppr","platform_key":"twitter_x","platform_kind":"Other Twitter/X tools","platform_name":"Twitter/X","type_actor_count":104,"revenue_threshold_usd":100,"type_over_threshold_pct":10.58,"type_over_threshold_actors":11,"top_estimated_monthly_revenue":36511.5137341766},{"key":"Type - Content / posts","url":null,"score":null,"title":"Type - Content / posts","top_actor":"apidojo/tweet-scraper","platform_key":"twitter_x","platform_kind":"Content / posts","platform_name":"Twitter/X","type_actor_count":78,"revenue_threshold_usd":100,"type_over_threshold_pct":20.51,"type_over_threshold_actors":16,"top_estimated_monthly_revenue":86928.4138016976},{"key":"Type - Profiles / accounts","url":null,"score":null,"title":"Type - Profiles / accounts","top_actor":"scraper_one/x-profile-posts-scraper","platform_key":"twitter_x","platform_kind":"Profiles / accounts","platform_name":"Twitter/X","type_actor_count":73,"revenue_threshold_usd":100,"type_over_threshold_pct":20.55,"type_over_threshold_actors":15,"top_estimated_monthly_revenue":5845.60008708521},{"key":"Type - Search / discovery","url":null,"score":null,"title":"Type - Search / discovery","top_actor":"api-ninja/x-twitter-advanced-search","platform_key":"twitter_x","platform_kind":"Search / discovery","platform_name":"Twitter/X","type_actor_count":27,"revenue_threshold_usd":100,"type_over_threshold_pct":22.22,"type_over_threshold_actors":6,"top_estimated_monthly_revenue":4820.27989225826},{"key":"Type - Lead generation","url":null,"score":null,"title":"Type - Lead generation","top_actor":"get-leads/all-in-one-x-scraper","platform_key":"twitter_x","platform_kind":"Lead generation","platform_name":"Twitter/X","type_actor_count":24,"revenue_threshold_usd":100,"type_over_threshold_pct":8.33,"type_over_threshold_actors":2,"top_estimated_monthly_revenue":497.760004326701},{"key":"Type - Ads / marketing","url":null,"score":null,"title":"Type - Ads / marketing","top_actor":"mikolabs/x-twitter-media-downloader","platform_key":"twitter_x","platform_kind":"Ads / marketing","platform_name":"Twitter/X","type_actor_count":14,"revenue_threshold_usd":100,"type_over_threshold_pct":7.14,"type_over_threshold_actors":1,"top_estimated_monthly_revenue":218.999991922081},{"key":"Type - Jobs / recruiting","url":null,"score":null,"title":"Type - Jobs / recruiting","top_actor":"powerai/twitter-jobs-search-scraper","platform_key":"twitter_x","platform_kind":"Jobs / recruiting","platform_name":"Twitter/X","type_actor_count":2,"revenue_threshold_usd":100,"type_over_threshold_pct":0,"type_over_threshold_actors":0,"top_estimated_monthly_revenue":15.9679994135797}],"answer":null,"meta":{"q":"twitter+爬虫有多少，分几类，月收入超过+$100+的占比多少","mode":"query","view":"auto","page":1,"limit":10}}