Marketplace publishing
List a persona on the Moonborn marketplace with pre-publish moderation, fork lineage with attribution, ratings, and an optional commerce layer via Stripe Connect. Free workspaces can browse and fork; publishing starts at Pro.
The problem
A persona that works for you is worth sharing. The two failure modes:
- Publish without a gate and the marketplace fills with low-quality, off-brand, or unsafe listings.
- Publish without lineage and forks lose their connection to the canonical work — no attribution, no audit trail, no way to follow improvements upstream.
Moonborn's marketplace is a curated, fork-aware listing surface: every publish runs through moderation, every fork is wired into the lineage graph, and the optional commerce layer rides on Stripe Connect.
What you can do
- Publish a persona snapshot as a listing with a license and (optionally) a price.
- Browse by filter (all / free / paid / new / editor's picks) and sort (popular / new / featured / semantic).
- Install a listing into your workspace — copies the persona, increments the listing's download counter.
- Fork a listing — copies the persona with
parent_persona_idset, attribution metadata attached, and the lineage edge inserted. - Rate a listing (1–5 stars, optional comment) — one rating per user, upsert on re-rate.
- Report abuse — files into the moderation queue.
- Curate collections — workspace-scoped groupings of listings.
How publishing works
const listing = await client.marketplace.listings.publish({
personaId: persona.id,
license: 'CC-BY-4.0',
priceCents: 0,
});
// listing.status === 'in_review'Every new listing enters the in_review state. A moderation pass — configurable as
auto-approved or human-reviewed via marketplace.moderation.auto_approve — decides
between published, unpublished (rejected), or held in in_review (flagged for
deeper review). The default policy gates approval through human review with a target
SLA configured by marketplace.moderation.review_sla_hours.
The Listing entity carries:
{
id, personaId, orgId,
license, priceCents, currency,
status: 'draft' | 'in_review' | 'published' | 'unpublished' | 'removed',
featured, ratingsAvg, ratingsCount,
downloads, forks,
publishedAtMs, removedAtMs,
}Lineage on fork
When a listing is forked, Moonborn:
- Copies the persona into the forking workspace.
- Sets the new persona's
parent_persona_idto the source persona. - Writes a
persona_lineageedge into the fork graph. - If
marketplace.fork.attribution_requiredis on (default), augments the new persona's metadata withmeta.attribution = { sourcePersonaId, sourceCreator }. - Increments the source listing's
forkscounter. - Writes an immutable
marketplace.listing.forkedrow into the audit log.
Pair this with the Brand voice variants flow when you want a public canonical persona that downstream teams can fork into their own brand-locked variants without losing the attribution chain.
Commerce (optional, Stripe Connect)
The commerce layer is gated by marketplace.commerce.enabled (off by default) and
binds to Stripe Connect Express:
- Creators onboard via
OnboardCreatorUseCase; charges and payouts are gated on Stripe'scharges_enabledandpayouts_enabledflags. - Revenue split is set by
marketplace.commerce.revenue_share(default0.7— 70% creator, 30% platform). - Payouts trip when the creator's pending balance crosses
marketplace.commerce.payout_min_usd(default$50), viaRequestPayoutUseCase. - Stripe Tax handles VAT, GST, and US sales tax automatically.
- A reconciliation cron audits
usage_eventsagainst Stripe records hourly so the internal ledger and Stripe never drift.
Endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /api/marketplace/listings | Discover (filter, query, sort, limit) |
POST | /api/marketplace/listings/publish | Submit for review |
POST | /api/marketplace/listings/{id}/install | Add to workspace |
POST | /api/marketplace/listings/{id}/fork | Fork with lineage |
POST | /api/marketplace/listings/{id}/review | Rate (1–5) + optional comment |
POST | /api/marketplace/listings/{id}/report | File abuse report |
GET | /api/marketplace/collections | Browse curated collections |
GET | /api/marketplace/publishable | List personas eligible for publish |
Tier
| Capability | Free | Pro | Team | Enterprise |
|---|---|---|---|---|
| Browse, fork, rate, comment | ✓ | ✓ | ✓ | ✓ |
| Publish | — | ✓ | ✓ | ✓ |
| Collections | — | ✓ | ✓ | ✓ |
| Commerce (paid listings) | — | — | — | ✓ |
The commerce layer is currently Enterprise-only and starts disabled at the system config level — switch it on per organization once a Stripe Connect agreement is in place.
Honest scope
Moonborn's marketplace is not a third-party storefront platform — no embedded storefronts, no creator-tier subscription reselling, no NFT or blockchain layer. Direct creator-to-consumer messaging and a native Slack persona bot are also explicitly out of scope; webhooks remain the integration path.
Next
- Concept primer on lineage: Brand voice variants.
- Endpoint reference on API reference.