Data Marketplace
Real fans. Real attendance. Real signal.
Query consented 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 (mk_live_…). Request access via the developers portal. All marketplace requests use the X-Marketplace-Key header regardless of SDK config.
const rev = new Revolution({
apiKey: 'mk_live_xxxx',
authScheme: 'marketplace',
});Catalog
Browse all available data attributes before building a query. The query API is REST today, the TypeScript SDK wraps subscriptions only, and the Python client wraps both.
GET /api/v1/marketplace/catalog?sort_by=available_users
X-Marketplace-Key: mk_live_xxxxAvailable 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
POST /api/v1/marketplace/query/preview
X-Marketplace-Key: mk_live_xxxx
{
"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"],
"query_type": "aggregated",
"regulatory_max": "pii_low"
}
// Response
// query_id, an integer; pass it to /query/execute
// result_count, fans matched
// price_usd, what execute will charge
// preview, the aggregated distribution
// _privacy, the k-anonymity threshold applied on deliveryExecute a query
POST /api/v1/marketplace/query/execute
X-Marketplace-Key: mk_live_xxxx
{ "query_id": 1234, "delivery_format": "json" } // json | csv
// Response
// result_count, fans matched
// price_usd, charged
// data, the result payload, returned inline (there is no download URL)
// fan_distributed, total paid out to matched fans
// users_paid, how many fans were paidSubscriptions
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.
// Price it first
const quote = await rev.marketplace.estimate({ /* … */ });
// Create it
const sub = await rev.marketplace.create({ /* … */ });
// Read it back, list them all, cancel
const current = await rev.marketplace.get(sub.id);
const { items } = await rev.marketplace.list({ page: 1, pageSize: 20 });
await rev.marketplace.cancel(sub.id);Privacy & 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 SandboxClient
client = SandboxClient() # no api_key required
preview = client.preview_query(
filters=[{"key": "top_genres", "operator": "contains", "value": "hip-hop"}],
attributes=["top_genres", "spend_band"],
query_type="aggregated",
)
print(preview.result_count) # synthetic data, realistic distributionSeller Portal, List Your Fan Data
If you own first-party fan data, a venue ticketing system, a fan community platform, a sports league CRM, you can submit its schema, have it classified, and publish it to the buyer catalog.
Payouts are not built. Registering, submitting and publishing all work. Crediting a seller when a buyer runs a query does not exist yet, and neither does the attribution needed for it, because a queried attribute cannot currently be traced back to the origin that supplied it.
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'],
}),
});