App Store
App Store protocol schemas
Defines schemas for the end-customer experience when browsing, evaluating,
installing, and managing marketplace apps from within ObjectOS.
- Salesforce AppExchange (Customer): Browse apps, read reviews, 1-click install
- Shopify App Store (Merchant): App evaluation, trial, install, manage subscriptions
- Apple App Store (User): Ratings, reviews, featured collections, personalized recs
Discover → Evaluate → Install → Configure → Use → Rate/Review → Manage
- Reviews & Ratings: User-submitted ratings and reviews with moderation
- Collections & Recommendations: Personalized discovery and curated picks
- Subscription Management: Manage licenses, billing, and renewals
- Installed App Management: Enable, disable, configure, upgrade, uninstall
Source: packages/spec/src/cloud/app-store.zod.ts
import { AppDiscoveryRequestSchema, AppDiscoveryResponseSchema, AppSubscriptionSchema, InstalledAppSummarySchema, ListInstalledAppsRequestSchema, ListInstalledAppsResponseSchema, ListReviewsRequestSchema, ListReviewsResponseSchema, RecommendationReasonSchema, RecommendedAppSchema, ReviewModerationStatusSchema, SubmitReviewRequestSchema, SubscriptionStatusSchema, UserReviewSchema } from '@objectstack/spec/cloud';
import type { AppDiscoveryRequest, AppDiscoveryResponse, AppSubscription, InstalledAppSummary, ListInstalledAppsRequest, ListInstalledAppsResponse, ListReviewsRequest, ListReviewsResponse, RecommendationReason, RecommendedApp, ReviewModerationStatus, SubmitReviewRequest, SubscriptionStatus, UserReview } from '@objectstack/spec/cloud';
// Validate data
const result = AppDiscoveryRequestSchema.parse(data);
| Property | Type | Required | Description |
|---|
| tenantId | string | optional | |
| categories | Enum<'crm' | 'erp' | 'hr' | 'finance' | 'project' | 'collaboration' | 'analytics' | 'integration' | 'automation' | 'ai' | 'security' | 'developer-tools' | 'ui-theme' | 'storage' | 'other'>[] | optional | |
| platformVersion | string | optional | |
| limit | integer | optional (default: 10) | |
| Property | Type | Required | Description |
|---|
| featured | { listingId: string; name: string; tagline?: string; iconUrl?: string; … }[] | optional | |
| recommended | { listingId: string; name: string; tagline?: string; iconUrl?: string; … }[] | optional | |
| trending | { listingId: string; name: string; tagline?: string; iconUrl?: string; … }[] | optional | |
| newArrivals | { listingId: string; name: string; tagline?: string; iconUrl?: string; … }[] | optional | |
| collections | { id: string; name: string; description?: string; coverImageUrl?: string; … }[] | optional | |
| Property | Type | Required | Description |
|---|
| id | string | ✅ | Subscription ID |
| listingId | string | ✅ | App listing ID |
| tenantId | string | ✅ | Customer tenant ID |
| status | Enum<'active' | 'trialing' | 'past-due' | 'cancelled' | 'expired'> | ✅ | |
| licenseKey | string | optional | |
| plan | string | optional | Subscription plan name |
| billingCycle | Enum<'monthly' | 'annual'> | optional | |
| priceInCents | integer | optional | |
| currentPeriodStart | string | optional | |
| currentPeriodEnd | string | optional | |
| trialEndDate | string | optional | |
| autoRenew | boolean | optional (default: true) | |
| createdAt | string | ✅ | |
| Property | Type | Required | Description |
|---|
| listingId | string | ✅ | |
| packageId | string | ✅ | |
| name | string | ✅ | |
| iconUrl | string | optional | |
| installedVersion | string | ✅ | |
| latestVersion | string | optional | |
| updateAvailable | boolean | optional (default: false) | |
| enabled | boolean | optional (default: true) | |
| subscriptionStatus | Enum<'active' | 'trialing' | 'past-due' | 'cancelled' | 'expired'> | optional | |
| installedAt | string | ✅ | |
| Property | Type | Required | Description |
|---|
| tenantId | string | optional | |
| enabled | boolean | optional | |
| updateAvailable | boolean | optional | |
| sortBy | Enum<'name' | 'installed-date' | 'updated-date'> | optional (default: "name") | |
| page | integer | optional (default: 1) | |
| pageSize | integer | optional (default: 20) | |
| Property | Type | Required | Description |
|---|
| items | { listingId: string; packageId: string; name: string; iconUrl?: string; … }[] | ✅ | |
| total | integer | ✅ | |
| page | integer | ✅ | |
| pageSize | integer | ✅ | |
| Property | Type | Required | Description |
|---|
| listingId | string | ✅ | Listing to get reviews for |
| sortBy | Enum<'newest' | 'oldest' | 'highest' | 'lowest' | 'most-helpful'> | optional (default: "newest") | |
| rating | integer | optional | |
| page | integer | optional (default: 1) | |
| pageSize | integer | optional (default: 10) | |
| Property | Type | Required | Description |
|---|
| items | { id: string; listingId: string; userId: string; displayName?: string; … }[] | ✅ | |
| total | integer | ✅ | |
| page | integer | ✅ | |
| pageSize | integer | ✅ | |
| ratingSummary | { averageRating: number; totalRatings: integer; distribution: object } | optional | |
popular-in-category
similar-users
complements-installed
trending
new-release
editor-pick
| Property | Type | Required | Description |
|---|
| listingId | string | ✅ | |
| name | string | ✅ | |
| tagline | string | optional | |
| iconUrl | string | optional | |
| category | Enum<'crm' | 'erp' | 'hr' | 'finance' | 'project' | 'collaboration' | 'analytics' | 'integration' | 'automation' | 'ai' | 'security' | 'developer-tools' | 'ui-theme' | 'storage' | 'other'> | ✅ | Marketplace package category |
| pricing | Enum<'free' | 'freemium' | 'paid' | 'subscription' | 'usage-based' | 'contact-sales'> | ✅ | Package pricing model |
| averageRating | number | optional | |
| activeInstalls | integer | optional | |
| reason | Enum<'popular-in-category' | 'similar-users' | 'complements-installed' | 'trending' | 'new-release' | 'editor-pick'> | ✅ | |
pending
approved
flagged
rejected
| Property | Type | Required | Description |
|---|
| listingId | string | ✅ | Listing to review |
| rating | integer | ✅ | Star rating |
| title | string | optional | |
| body | string | optional | |
active
trialing
past-due
cancelled
expired
| Property | Type | Required | Description |
|---|
| id | string | ✅ | Review ID |
| listingId | string | ✅ | Listing being reviewed |
| userId | string | ✅ | Review author user ID |
| displayName | string | optional | Reviewer display name |
| rating | integer | ✅ | Star rating (1-5) |
| title | string | optional | Review title |
| body | string | optional | Review text |
| appVersion | string | optional | App version being reviewed |
| moderationStatus | Enum<'pending' | 'approved' | 'flagged' | 'rejected'> | optional (default: "pending") | |
| helpfulCount | integer | optional (default: 0) | |
| publisherResponse | { body: string; respondedAt: string } | optional | Publisher response to review |
| submittedAt | string | ✅ | |
| updatedAt | string | optional | |