Moon Banking on the Snowflake Marketplace

Query Moon Banking data directly inside Snowflake. One listing, two tiers — free Limited Trial (top 20 US banks by community vote count) and paid global subscription ($1,499/mo, billed natively by Snowflake), gated automatically by SYSTEM$IS_LISTING_PURCHASED().

If your team already lives in Snowflake, you can pull Moon Banking's bank, vote, story, stock, and aggregate data straight into your account as a native Snowflake share. No API integration, no auth tokens, no rate limits — just a seven-table schema sitting next to your other data, with all the consumer ergonomics Snowflake gives you (Snowsight catalog, secure data sharing, Time Travel, dbt, etc.).

The Snowflake Marketplace policy is one share per dataset. So we ship a single listing with two pricing tiers, and Snowflake's SYSTEM$IS_LISTING_PURCHASED() provider function does the trial-vs-paid gating for us inside secure views:

  • Limited Trial — free, auto-fulfilled. Top 20 US banks by community vote count, plus the votes, stories, stock listings, and countries row tied to them, plus the global world aggregate and the full markets exchange list.
  • Paid subscription — $1,499 USD / month. Same share, every row visible. Snowflake bills you on your existing Snowflake invoice.

Switching from trial to paid is a one-click upgrade in Snowflake. Your share stays attached, your queries stay the same — the secure views just start returning more rows.

Tables

We commit to additive-only schema changes with 30-day advance notice on any new column, and we never rename, drop, or change the type of an existing column.

TableWhat it contains
worldSingleton row of global aggregates: country count, bank count, story count, plus the 14-category vote totals and scores.
countriesOne row per country: name, ISO code, flag emoji, world rank, and per-country aggregate scores across the 14 categories.
banksOne row per bank in each country: name, URL, description, world + country rank, story count, and per-bank aggregate scores.
bank_votesIndividual upvote / downvote events on a specific bank in a specific category. PII (IP addresses, user IDs) is excluded.
storiesUser-submitted short reviews about a bank, with sentiment + tags. PII excluded.
marketsOne row per stock exchange the banks in the dataset trade on: name, exchange code, market type, and country.
stocksOne row per publicly traded bank listing: ticker symbol, primary-vs-secondary listing flag, exchange, and bank. Every row has both a symbol and a market.

The 14 voting categories — crypto_friendly, customer_service, fees_pricing, digital_experience, security_trust, account_features, branch_atm_access, international_banking, business_banking, processing_speed, transparency, innovation, investment_services, lending — are stored as VARIANT columns on world, countries, and banks. Each one is a JSON object with four subfields: score (integer, -100..100), total (total votes), up (upvotes), and down (downvotes). Access them with Snowflake's colon-and-cast syntax:

SELECT
  name,
  overall:score::NUMBER AS score,
  overall:total::NUMBER AS votes,
  overall:up::NUMBER    AS upvotes,
  overall:down::NUMBER  AS downvotes
FROM moonbanking.shared.banks
ORDER BY score DESC NULLS LAST
LIMIT 10;

What's NOT in the share

We deliberately strip every form of PII before publishing:

  • No user identities, names, emails, or accounts
  • No IP addresses on votes or stories
  • No internal API keys, fingerprints, or tracking signals
  • No moderation flags or admin-only fields

Limited Trial

The trial is instantly accessible — there's no request flow, no email exchange, no payment. Click Get Data on the listing page in Snowflake and the share appears in your account, default database name MOONBANKING.

What's different from the paid tier:

  • Coverage: The 20 US banks with the highest community vote count. countries contains only the US row; banks contains those 20 institutions; bank_votes, stories, and stocks contain every row attached to them. The world row and the markets exchange list are identical to the paid tier — markets is deliberately ungated so the market_id on every stocks row you can see always resolves to a named exchange.
  • Refresh cadence: Daily, same as paid. The 20-bank roster is recomputed on each refresh, so a bank that climbs into the top 20 will appear in the next day's snapshot.

What's the same:

  • Identical seven-table schema and column docs.
  • Snowflake-native share — clone, query, and dbt-model exactly the same way.
  • Schema-stability commitment.

$1,499 USD per month, billed by Snowflake on your existing Snowflake invoice. To upgrade:

  1. Find Moon Banking on the Snowflake Marketplace.
  2. Install the listing (Limited Trial is provisioned automatically).
  3. Click Upgrade on the listing detail page.
  4. Snowflake adds the subscription to your invoice, and SYSTEM$IS_LISTING_PURCHASED() flips to TRUE immediately. The secure views start returning the full dataset on your next query — no DDL, no re-attach, no consumer-side change.

Cancel any time. Access remains until the end of the current billing period; at that point SYSTEM$IS_LISTING_PURCHASED() flips back to FALSE and you transparently downgrade to the trial slice. There are no refunds — see the Snowflake Marketplace Refund Policy.

Engineering features

  • Format. Native Snowflake share, exposed as seven secure views. Standard Snowflake-to-Snowflake — no client setup required.
  • Schema. Stable, additive-only. Aggregate columns are VARIANT; the tags column on stories is ARRAY.
  • Time Travel. Available consumer-side: clone the share to your own database and set DATA_RETENTION_TIME_IN_DAYS = N on the cloned tables.
  • Refresh cadence. Daily at ~05:00 UTC.
  • Clustering. bank_votes and stories are clustered by bank_id so consumer queries that filter by bank prune micro-partitions automatically.

Sample queries

Take a look at Quick Start Examples in the Snowflake Marketplace listing. A couple of representative snippets:

-- The trial slice — top 20 US banks by community vote count.
SELECT
  b.name,
  c.name                  AS country,
  b.overall:score::FLOAT  AS score,
  b.stories_count
FROM moonbanking.shared.banks b
JOIN moonbanking.shared.countries c
  ON c.id = b.country_id
WHERE c.code = 'US'
ORDER BY score DESC
LIMIT 20;
-- Sentiment next to a ticker — each bank's primary listing and exchange.
SELECT
  b.name,
  s.symbol,
  m.code                  AS exchange,
  b.overall:score::FLOAT  AS score
FROM moonbanking.shared.stocks s
JOIN moonbanking.shared.banks   b ON b.id = s.bank_id
JOIN moonbanking.shared.markets m ON m.id = s.market_id
WHERE s.is_primary = TRUE
ORDER BY score DESC NULLS LAST
LIMIT 20;
-- Tag explosion — useful as the input for downstream LLM topic clustering.
SELECT
  t.value::TEXT AS tag,
  COUNT(*)      AS story_count
FROM moonbanking.shared.stories s,
     LATERAL FLATTEN(INPUT => s.tags) t
GROUP BY 1
ORDER BY story_count DESC
LIMIT 50;

License

Use of the Moon Banking dataset on the Snowflake Marketplace is governed by the Snowflake Marketplace Data License. Highlights:

  • Analytics, AI/ML model training (including generative AI, large language models, agents, and other foundation models), fine-tuning, evaluation, research, and dashboarding are permitted. Models you train on the data are yours to ship as derivative works.
  • Redistribution of the raw dataset, repackaging, exposing the data through a public API, or building a product that is substantially similar in purpose to Moon Banking is not permitted.
  • See the license for the full terms.

Support

Questions about billing, access, schema, or data quality? Email support@e.moonbanking.com.

Was this page helpful?