Skip to main content

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.

k=5
Anonymity floor, enforced at query time
100%
Consent-gated

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.

typescript
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.

typescript
GET /api/v1/marketplace/catalog?sort_by=available_users
X-Marketplace-Key: mk_live_xxxx

Available attributes

KeyTypeDescription
top_genresstring[]Fan's top 3 genres by attendance frequency
concerts_attended_12mintegerVerified show count in last 12 months
average_ticket_spendfloatMean ticket price across verified purchases
events_attended_rfanintegerTotal events scanned via revolution.fan NFE
citystringPrimary city (from attendance records)
zip_codestring5-digit ZIP, PII_LOW regulatory tier
spend_bandenumlow / mid / high, bucketed spend tier
fan_loyalty_tierenumcasual / regular / superfan

Querying

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

typescript
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 delivery

Execute a query

typescript
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 paid

Subscriptions

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.

typescript
// 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_none

Fully anonymised, genre, spend band, loyalty tier, event counts. No location finer than city.

e.g. top_genres, spend_band, fan_loyalty_tier

pii_low

City + ZIP included. Fans must have opted into geo sharing.

e.g. city, zip_code, events_attended_rfan

pii_high

Enterprise 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.

typescript
# 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 distribution

Seller 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

1RegisterCreate a seller account at /marketplace/sellers/register. An admin reviews and approves it before your key can query.
2Submit a Data OriginDescribe your data source, event type, fan count, consent mechanism, geographic coverage.
3AI ClassificationWe auto-classify your fields into marketplace attributes and suggest regulatory tiers.
4PublishSet an asking price per field and go live. Your fields appear in the buyer catalog.
5PayoutNot built yet. Nothing credits a seller when a query runs, and there is no withdrawal path, see the note above.

Seller API

typescript
// 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'],
  }),
});