Developer Portal Developer Portal protocol schemas
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
Salesforce Partner Portal : ISV registration, AppExchange publishing, Trialforce
Shopify Partner Dashboard : App management, analytics, billing
VS Code Marketplace Management : Extension publishing, statistics, tokens
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:
User → Identity.UserSchema; the session wire shape is Session from
@objectstack/spec/api (the identity module deliberately declares no bare
SessionSchema — #4641)
Organization & Members → Identity.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)
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
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);
last_7d
last_30d
last_90d
last_365d
all_time
Property Type Required Description packageId string✅ Package identifier name string✅ App display name tagline stringoptional description stringoptional category string✅ Marketplace category tags string[]optional iconUrl stringoptional screenshots { url: string; caption?: string }[]optional documentationUrl stringoptional supportUrl stringoptional repositoryUrl stringoptional pricing Enum<'free' | 'freemium' | 'paid' | 'subscription' | 'usage-based' | 'contact-sales'>optional (default: "free") priceInCents integeroptional
Property Type Required Description listingId string✅ Listing ID action Enum<'submit' | 'unlist' | 'deprecate' | 'reactivate'>✅ Action to perform on listing reason stringoptional
Property Type Required Description organizationId string✅ Identity Organization ID publisherId string✅ Marketplace publisher ID verification Enum<'unverified' | 'pending' | 'verified' | 'trusted' | 'partner'>optional (default: "unverified") Publisher verification status agreementVersion stringoptional Accepted developer agreement version website stringoptional Publisher website supportEmail stringoptional Publisher support email registeredAt string✅
Property Type Required Description listingId string✅ Listing to get analytics for timeRange Enum<'last_7d' | 'last_30d' | 'last_90d' | 'last_365d' | 'all_time'>optional (default: "last_30d") metrics Enum<'installs' | 'uninstalls' | 'active_installs' | 'ratings' | 'revenue' | 'page_views'>[]optional Metrics to include (default: all)
Property Type Required Description listingId string✅ timeRange Enum<'last_7d' | 'last_30d' | 'last_90d' | 'last_365d' | 'all_time'>✅ summary { totalInstalls: integer; activeInstalls: integer; totalUninstalls: integer; averageRating?: number; … }✅ timeSeries Record<string, { date: string; value: number }[]>optional Time series keyed by metric name ratingDistribution { 1: integer; 2: integer; 3: integer; 4: integer; … }optional
Property Type Required Description date string✅ value number✅
Property Type Required Description listingId string✅ Listing ID to update name stringoptional tagline stringoptional description stringoptional category stringoptional tags string[]optional iconUrl stringoptional screenshots { url: string; caption?: string }[]optional documentationUrl stringoptional supportUrl stringoptional repositoryUrl stringoptional pricing Enum<'free' | 'freemium' | 'paid' | 'subscription' | 'usage-based' | 'contact-sales'>optional priceInCents integeroptional
Property Type Required Description version string✅ Semver version (e.g., 2.1.0-beta.1) channel Enum<'alpha' | 'beta' | 'rc' | 'stable'>optional (default: "stable") releaseNotes stringoptional Release notes (Markdown) changelog { type: Enum<'added' | 'changed' | 'fixed' | 'removed' | 'deprecated' | 'security'>; description: string }[]optional Structured changelog entries minPlatformVersion stringoptional artifactUrl stringoptional Built package artifact URL artifactChecksum stringoptional SHA-256 checksum deprecated booleanoptional (default: false) deprecationMessage stringoptional releasedAt stringoptional