Data Marketplace
Real fans. Real attendance. Real signal.
Query 500K+ verified fan profiles segmented by genre, venue, city, and spend. Every row is backed by a scanned ticket and explicit consent. Covered by patent application ZW26-001USP.
Authentication
The Data Marketplace requires a Marketplace key (mkt_xxxx). Request access via the developers portal. All marketplace requests use the X-Marketplace-Key header regardless of SDK config.
const rev = new Revolution({
apiKey: 'mkt_xxxx',
authScheme: 'marketplace',
});Catalog
Browse all available data attributes before building a query.
const { catalog } = await rev.marketplace.getCatalog({
sortBy: 'available_users', // or 'price_usd' | 'attribute_key'
});
// Each attribute:
// {
// key: 'top_genres',
// label: 'Top Genres',
// type: 'string[]',
// availableUsers: 498200,
// priceUsd: 0.0018,
// regulatoryTier: 'pii_none',
// consentRate: 0.94
// }Available attributes
top_genresstring[]Fan's top 3 genres by attendance frequencyconcerts_attended_12mintegerVerified show count in last 12 monthsaverage_ticket_spendfloatMean ticket price across verified purchasesevents_attended_rfanintegerTotal events scanned via revolution.fan NFEcitystringPrimary city (from attendance records)zip_codestring5-digit ZIP — PII_LOW regulatory tierspend_bandenumlow / mid / high — bucketed spend tierfan_loyalty_tierenumcasual / regular / superfanQuerying
All queries follow a preview → execute flow. Preview is free and returns match count + cost estimate. Execute charges your account and triggers $FAN distribution to matching fans.
Preview a query
const preview = await rev.marketplace.previewQuery({
filters: [
{ key: 'top_genres', operator: 'contains', value: 'hip-hop' },
{ key: 'concerts_attended_12m', operator: 'gte', value: '3' },
{ key: 'city', operator: 'eq', value: 'Los Angeles' },
],
attributes: ['top_genres', 'events_attended_rfan', 'average_ticket_spend'],
queryType: 'aggregated', // 'aggregated' | 'individual'
regulatoryMax: 'pii_low', // 'pii_none' | 'pii_low' | 'pii_high'
});
// preview.queryId — use in executeQuery
// preview.matchedUsers — 4 200
// preview.estimatedCostUsd — 8.40
// preview.fanDistribution — $FAN sent to fans on executeExecute a query
const result = await rev.marketplace.executeQuery({
queryId: preview.queryId,
deliveryFormat: 'json', // 'json' | 'csv' | 'parquet'
});
// result.recordCount — 4 200
// result.costUsd — 8.40 (charged)
// result.downloadUrl — signed S3 URL (expires 24h)
// result.fansPaid — $FAN distributed to matched fansSubscriptions
Subscribe to a query to get a living, auto-refreshed view. The provisioned view updates as new fans match the criteria — ideal for CRM integrations and dynamic ad audiences.
// Create a subscription
const sub = await rev.marketplace.createSubscription({
name: 'LA Hip-Hop Superfans',
filters: [
{ key: 'top_genres', operator: 'contains', value: 'hip-hop' },
{ key: 'city', operator: 'eq', value: 'Los Angeles' },
],
attributes: ['top_genres', 'spend_band', 'fan_loyalty_tier'],
refreshInterval: 'weekly', // 'daily' | 'weekly' | 'monthly'
});
// Get current view
const view = await rev.marketplace.getSubscriptionView(sub.id);
console.log(view.recordCount); // current matched users
console.log(view.lastMaterializedAt); // ISO timestamp
console.log(view.pendingChanges); // fans added/removed since last refreshPrivacy & Consent
Every fan explicitly opts in to data sharing during onboarding and chooses which attributes to share. The three regulatory tiers control what can be queried:
pii_noneFully anonymised — genre, spend band, loyalty tier, event counts. No location finer than city.
e.g. top_genres, spend_band, fan_loyalty_tier
pii_lowCity + ZIP included. Fans must have opted into geo sharing.
e.g. city, zip_code, events_attended_rfan
pii_highEnterprise only. Email hash + wallet address for CRM matching. Strict contractual controls.
e.g. email_hash, wallet_address
Fans receive $FAN tokens each time their data is queried. The amount is proportional to the number of attributes shared and the buyer's subscription tier.
Sandbox — No Key Required
The public sandbox lets you run real marketplace queries against synthetic fan data before committing to a paid key. Available at /marketplace/sandbox.
# Python — sandbox mode
from revolution_fan import RevolutionFanClient
client = RevolutionFanClient(sandbox=True) # no api_key required
preview = client.marketplace.preview_query(
filters=[{"key": "top_genres", "operator": "contains", "value": "hip-hop"}],
attributes=["top_genres", "spend_band"],
query_type="aggregated",
)
print(preview["matched_users"]) # synthetic data, realistic distributionSeller Portal — Monetise Your Fan Data
If you own first-party fan data — a venue ticketing system, a fan community platform, a sports league CRM — you can list it on the revolution.fan marketplace and earn revenue every time a buyer queries your data.
How it works
Seller API
// Register as a seller
const res = await fetch('/api/v1/marketplace/sellers/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
company_name: 'Acme Venue Group',
contact_email: 'data@acmevenues.com',
seller_type: 'venue_operator', // venue_operator | event_promoter | data_broker | other
description: 'Multi-venue operator across 12 US markets',
website: 'https://acmevenues.com',
}),
});
const { seller_key } = await res.json();
// seller_key: "sk_xxxx" — use in X-Seller-Key header
// Submit a data origin
await fetch('/api/v1/marketplace/sellers/origins', {
method: 'POST',
headers: { 'X-Seller-Key': 'sk_xxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'Acme Venue Ticketing — 2023-2026',
description: 'Verified ticket purchases across all Acme venues',
event_types: ['concert', 'festival'],
fan_count_estimate: 85000,
geographic_coverage: ['US-TX', 'US-CA', 'US-NY'],
consent_mechanism: 'explicit_opt_in',
sample_fields: ['email_hash', 'genre_preferences', 'ticket_spend', 'attendance_count'],
}),
});