Publishing to the marketplace
List your channels on the marketplace for other organizations to discover and subscribe
Publishing a channel to the marketplace makes it available for other organizations to discover and subscribe. You control pricing, visibility, and subscriber access while npayload handles delivery, billing, and usage tracking.
Why publish
- Monetize your data. Turn event streams into revenue with flexible pricing models.
- Expand your ecosystem. Reach new customers who are already on npayload.
- Reduce support overhead. Schema documentation, sample data, and self-service subscriptions mean fewer integration support requests.
Prerequisites
Before publishing to the marketplace, you need:
- A verified organization with a completed profile (display name, logo, description).
- At least one active channel with messages flowing through it.
- An event catalogue schema attached to the channel (recommended but not required).
Organization verification typically completes within 24 hours. You can prepare your listing in draft while verification is in progress.
Creating a listing
A listing wraps a channel with metadata that helps consumers evaluate and subscribe.
import NPayload from '@npayload/node';
const npayload = new NPayload({ token: process.env.NPAYLOAD_TOKEN });
const listing = await npayload.marketplace.listings.create({
channel: 'weather-alerts',
title: 'Global Weather Alerts',
description: 'Real-time severe weather alerts covering 200+ countries. Updated within 30 seconds of issuance.',
category: 'iot',
tags: ['weather', 'alerts', 'geospatial'],
pricing: {
model: 'flat-monthly',
price: 49.99,
},
visibility: 'public',
sampleData: [
{
key: 'alert-US-CA',
payload: {
type: 'severe-thunderstorm',
region: 'US-CA',
severity: 'warning',
issuedAt: '2026-03-07T14:30:00Z',
},
},
],
});Pricing models
| Model | Description | Best for |
|---|---|---|
| Free | No charge. Subscribers get full access. | Community data, open APIs, developer adoption |
| Per-message | Charge per message delivered | High-volume data where usage varies widely |
| Flat monthly | Fixed monthly subscription fee | Predictable pricing, premium data feeds |
| Usage-based | Tiered pricing based on monthly message volume | Scaling with consumer growth |
// Free
{ model: 'free' }
// Per-message
{ model: 'per-message', unitPrice: 0.001 }
// Flat monthly
{ model: 'flat-monthly', price: 99.00 }
// Usage-based tiers
{
model: 'usage-based',
tiers: [
{ upTo: 10000, unitPrice: 0.001 },
{ upTo: 100000, unitPrice: 0.0005 },
{ upTo: null, unitPrice: 0.0002 }, // unlimited
],
}Visibility controls
| Visibility | Description |
|---|---|
| Public | Listed in search results and browsable by all organizations |
| Unlisted | Accessible only via direct link. Does not appear in search results |
| Invite-only | Only organizations you explicitly invite can view or subscribe |
// Change visibility after creation
await npayload.marketplace.listings.update(listing.id, {
visibility: 'invite-only',
});
// Invite a specific organization
await npayload.marketplace.listings.invite(listing.id, {
orgId: 'org_partner_abc',
});Documentation requirements
Well-documented listings attract more subscribers. Include:
| Requirement | Required? | Description |
|---|---|---|
| Description | Yes | Clear explanation of what the channel provides |
| Category | Yes | Primary category for search and discovery |
| Schema | Recommended | Event catalogue schema describing the message format |
| Sample data | Recommended | Representative messages so consumers can evaluate the format |
| SLA | Optional | Uptime commitment, maximum latency, and support response time |
// Attach a schema from the event catalogue
await npayload.marketplace.listings.update(listing.id, {
schemaId: 'sch_weather_alert_v2',
sla: {
uptimePercent: 99.9,
maxLatencyMs: 500,
supportResponseHours: 4,
},
});Managing subscribers
Monitor who is subscribed and control access.
// List all subscribers
const subscribers = await npayload.marketplace.listings.subscribers(listing.id);
// View usage for a specific subscriber
const usage = await npayload.marketplace.listings.subscriberUsage(listing.id, {
subscriberOrgId: 'org_consumer_xyz',
period: 'current-month',
});
// Revoke access
await npayload.marketplace.listings.revokeSubscriber(listing.id, {
subscriberOrgId: 'org_consumer_xyz',
reason: 'Terms of service violation',
});Revoking a subscriber immediately stops message delivery. The subscriber will receive a notification with the reason you provide.
Best practices
- Write a clear description. Lead with what the data is and who it is for, not how it works internally.
- Provide sample data. Consumers evaluate listings based on real examples. Include at least 3 representative messages.
- Set an SLA. Even a modest uptime commitment (99%) signals reliability.
- Respond to reviews. Engaged publishers build trust and rank higher in search results.
- Version carefully. Use the event catalogue to version your schema so existing subscribers are not affected by format changes.
- Monitor usage. Track subscriber growth and message volumes to anticipate capacity needs.
Next steps
- Listings for the full listing lifecycle and category reference
- Reviews and ratings to understand how subscribers evaluate your listing
- Event catalogue to create schemas for your marketplace channels
Was this page helpful?