Export subscribers with every column
export_subscribersExport matched Substack subscribers as full records with engagement metrics. Creates an async export, waits until the file is ready, then downloads it.
Instructions
Export subscribers as full records, which is the only way to actually read the engagement metrics list_subscribers can only filter on: opens over 7d/30d/6mo, unique emails seen, post views, comments, shares, links clicked, days active and activity rating.
Substack builds the file asynchronously, so this creates a subscriber set, requests the export, polls until it is ready and downloads it. A small export takes a few seconds.
Two things verified against the live API and worth knowing:
tag_ids and group_membership cannot be exported. Substack drops them without failing, so they come back in missing_columns. Asking for all 48 returns 46.
Values arrive display-formatted, not raw. Revenue is "$50.00" here and the number 50 through list_subscribers. Dates are ISO strings.
There is no paging: an export covers the whole matching set.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Free text matched against name and email. | |
| columns | No | Which columns to include. Defaults to all exportable ones: user_name, user_email_address, country, state, subscription_type, subscription_created_at, subscription_expires_at, first_payment_at, last_subscribed_at, unsubscribed_at, subscription_interval, stripe_plan_name, free_attribution, paid_attribution, is_subscribed, bestseller_tier, total_revenue_generated, num_subs_gifted, bundle_id, is_bundle_parent, num_emails_received, num_emails_dropped, num_email_opens, num_email_opens_last_7d, num_email_opens_last_30d, num_unique_email_posts_seen, num_unique_email_posts_seen_last_7d, num_unique_email_posts_seen_last_30d, last_opened_at, links_clicked, last_clicked_at, emails_enabled, num_web_post_views, num_web_post_views_last_7d, num_web_post_views_last_30d, num_unique_web_posts_seen, num_unique_web_posts_seen_last_7d, num_unique_web_posts_seen_last_30d, num_comments, num_comments_last_7d, num_comments_last_30d, num_shares, num_shares_last_7d, num_shares_last_30d, days_active_last_30d, activity_rating | |
| filters | No | Conditions, combined with AND. There is no OR and no nesting: anything needing OR has to be issued as separate calls. Operators by column type: - Int: is, is_not, gt, gte, lt, lte - String: is, is_not, is_any_of, contains, starts_with, ends_with, includes_none - DateTime: is_on, is_after, is_on_or_after, is_before, is_on_or_before - Array (tag_ids, emails_enabled): includes_any, includes_all, includes_none - subscription_type and group_membership: is, is_not, is_any_of Columns: user_name (String, "Name"); user_email_address (String, "Email"); country (String, "Country"); state (String, "State/Province"); group_membership (group_membership, "Group membership"); subscription_type (subscription_type, "Type"); subscription_created_at (DateTime, "Start date"); subscription_expires_at (DateTime, "Expiration date"); first_payment_at (DateTime, "First paid date"); last_subscribed_at (DateTime, "Paid upgrade date"); unsubscribed_at (DateTime, "Cancel date"); subscription_interval (String, "Subscription interval"); stripe_plan_name (String, "Stripe plan"); free_attribution (String, "Subscription source (free)"); paid_attribution (String, "Subscription source (paid)"); is_subscribed (Int, "Can see paid content"); bestseller_tier (Int, "Bestseller"); total_revenue_generated (Int, "Revenue"); num_subs_gifted (Int, "Subscriptions gifted"); bundle_id (Int, "Bundle"); is_bundle_parent (Int, "Bundle origin"); num_emails_received (Int, "Emails received (6mo)"); num_emails_dropped (Int, "Emails dropped (6mo)"); num_email_opens (Int, "Emails opened (6mo)"); num_email_opens_last_7d (Int, "Emails opened (7d)"); num_email_opens_last_30d (Int, "Emails opened (30d)"); num_unique_email_posts_seen (Int, "Unique emails seen (6mo)"); num_unique_email_posts_seen_last_7d (Int, "Unique emails seen (7d)"); num_unique_email_posts_seen_last_30d (Int, "Unique emails seen (30d)"); last_opened_at (DateTime, "Last email open"); links_clicked (Int, "Links clicked"); last_clicked_at (DateTime, "Last clicked at"); emails_enabled (Array, "Sections"); num_web_post_views (Int, "Post views"); num_web_post_views_last_7d (Int, "Post views (7d)"); num_web_post_views_last_30d (Int, "Post views (30d)"); num_unique_web_posts_seen (Int, "Unique posts seen"); num_unique_web_posts_seen_last_7d (Int, "Unique posts seen (7d)"); num_unique_web_posts_seen_last_30d (Int, "Unique posts seen (30d)"); num_comments (Int, "Comments"); num_comments_last_7d (Int, "Comments (7d)"); num_comments_last_30d (Int, "Comments (30d)"); num_shares (Int, "Shares"); num_shares_last_7d (Int, "Shares (7d)"); num_shares_last_30d (Int, "Shares (30d)"); days_active_last_30d (Int, "Days active (30d)"); activity_rating (Int, "Activity"); tag_ids (Array, "Tags") | |
| publication | No | Which connected publication to act on, matched loosely against its hostname (for example 'example.substack.com' or just 'example'). Defaults to the first connected publication. | |
| max_wait_seconds | No | How long to wait for the file. 1 to 600, default 120. |