ObjectStackObjectStack

Developer Portal

Developer Portal protocol schemas

Developer Portal Protocol

Defines schemas for the developer-facing side of the marketplace ecosystem. Covers the complete developer journey:

Register → Create App → Develop → Validate → Build → Submit → Monitor → Iterate

Architecture Alignment

  • Salesforce Partner Portal: ISV registration, AppExchange publishing, Trialforce
  • Shopify Partner Dashboard: App management, analytics, billing
  • VS Code Marketplace Management: Extension publishing, statistics, tokens

Identity Integration (better-auth)

Authentication, organization management, and API keys are handled by the Identity module (@objectstack/spec Identity namespace), which follows the better-auth specification. This module only defines marketplace-specific extensions on top of the shared identity layer:

  • UserIdentity.UserSchema; the session wire shape is Session from @objectstack/spec/api (the identity module deliberately declares no bare SessionSchema — #4641)
  • Organization & MembersIdentity.OrganizationSchema, Identity.MemberSchema
  • API Keys → the sys_api_key ObjectSchema in @objectstack/platform-objects (identity/sys-api-key.object.ts), minted via POST /api/v1/keys; its scopes column is the marketplace-scope carrier. There is no Identity.ApiKeySchema — #8715 retired it (it documented better-auth's apiKey plugin, which this platform does not load)

Key Concepts

  • Publisher Profile: Links an Identity Organization to a marketplace publisher
  • App Listing Management: CRUD for marketplace listings (draft → published)
  • Version Channels: alpha / beta / rc / stable release channels
  • Publishing Analytics: Install trends, revenue, ratings over time

Source: packages/spec/src/cloud/developer-portal.zod.ts

TypeScript Usage

import { AnalyticsTimeRangeSchema, CreateListingRequestSchema, ListingActionRequestSchema, PublisherProfileSchema, PublishingAnalyticsRequestSchema, PublishingAnalyticsResponseSchema, ReleaseChannelSchema, TimeSeriesPointSchema, UpdateListingRequestSchema, VersionReleaseSchema } from '@objectstack/spec/cloud';
import type { AnalyticsTimeRange, CreateListingRequest, ListingActionRequest, PublisherProfile, PublishingAnalyticsRequest, PublishingAnalyticsResponse, ReleaseChannel, TimeSeriesPoint, UpdateListingRequest, VersionRelease } from '@objectstack/spec/cloud';

// Validate data
const result = AnalyticsTimeRangeSchema.parse(data);

AnalyticsTimeRange

Allowed Values

  • last_7d
  • last_30d
  • last_90d
  • last_365d
  • all_time

CreateListingRequest

Properties

PropertyTypeRequiredDescription
packageIdstringPackage identifier
namestringApp display name
taglinestringoptional
descriptionstringoptional
categorystringMarketplace category
tagsstring[]optional
iconUrlstringoptional
screenshots{ url: string; caption?: string }[]optional
documentationUrlstringoptional
supportUrlstringoptional
repositoryUrlstringoptional
pricingEnum<'free' | 'freemium' | 'paid' | 'subscription' | 'usage-based' | 'contact-sales'>optional (default: "free")
priceInCentsintegeroptional

ListingActionRequest

Properties

PropertyTypeRequiredDescription
listingIdstringListing ID
actionEnum<'submit' | 'unlist' | 'deprecate' | 'reactivate'>Action to perform on listing
reasonstringoptional

PublisherProfile

Properties

PropertyTypeRequiredDescription
organizationIdstringIdentity Organization ID
publisherIdstringMarketplace publisher ID
verificationEnum<'unverified' | 'pending' | 'verified' | 'trusted' | 'partner'>optional (default: "unverified")Publisher verification status
agreementVersionstringoptionalAccepted developer agreement version
websitestringoptionalPublisher website
supportEmailstringoptionalPublisher support email
registeredAtstring

PublishingAnalyticsRequest

Properties

PropertyTypeRequiredDescription
listingIdstringListing to get analytics for
timeRangeEnum<'last_7d' | 'last_30d' | 'last_90d' | 'last_365d' | 'all_time'>optional (default: "last_30d")
metricsEnum<'installs' | 'uninstalls' | 'active_installs' | 'ratings' | 'revenue' | 'page_views'>[]optionalMetrics to include (default: all)

PublishingAnalyticsResponse

Properties

PropertyTypeRequiredDescription
listingIdstring
timeRangeEnum<'last_7d' | 'last_30d' | 'last_90d' | 'last_365d' | 'all_time'>
summary{ totalInstalls: integer; activeInstalls: integer; totalUninstalls: integer; averageRating?: number; … }
timeSeriesRecord<string, { date: string; value: number }[]>optionalTime series keyed by metric name
ratingDistribution{ 1: integer; 2: integer; 3: integer; 4: integer; … }optional

ReleaseChannel

Allowed Values

  • alpha
  • beta
  • rc
  • stable

TimeSeriesPoint

Properties

PropertyTypeRequiredDescription
datestring
valuenumber

UpdateListingRequest

Properties

PropertyTypeRequiredDescription
listingIdstringListing ID to update
namestringoptional
taglinestringoptional
descriptionstringoptional
categorystringoptional
tagsstring[]optional
iconUrlstringoptional
screenshots{ url: string; caption?: string }[]optional
documentationUrlstringoptional
supportUrlstringoptional
repositoryUrlstringoptional
pricingEnum<'free' | 'freemium' | 'paid' | 'subscription' | 'usage-based' | 'contact-sales'>optional
priceInCentsintegeroptional

VersionRelease

Properties

PropertyTypeRequiredDescription
versionstringSemver version (e.g., 2.1.0-beta.1)
channelEnum<'alpha' | 'beta' | 'rc' | 'stable'>optional (default: "stable")
releaseNotesstringoptionalRelease notes (Markdown)
changelog{ type: Enum<'added' | 'changed' | 'fixed' | 'removed' | 'deprecated' | 'security'>; description: string }[]optionalStructured changelog entries
minPlatformVersionstringoptional
artifactUrlstringoptionalBuilt package artifact URL
artifactChecksumstringoptionalSHA-256 checksum
deprecatedbooleanoptional (default: false)
deprecationMessagestringoptional
releasedAtstringoptional

On this page