---
title: Marketplace Admin
description: Marketplace Admin protocol schemas
---

{/* ⚠️  AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs go in content/docs/guides/. */}

# Marketplace Administration Protocol

Defines schemas for the platform (Cloud) side of marketplace operations.

Covers the administrative workflows for managing and governing the marketplace.

## Architecture Alignment

- **Salesforce AppExchange Admin**: Security review, ISV monitoring, partner management

- **Apple App Store Connect Review**: Human review process, guidelines, rejection reasons

- **Google Play Console**: Policy enforcement, quality gates, content moderation

## Key Concepts

- **Review Process**: Structured workflow for submission review (automated + manual)

- **Curation**: Featured apps, curated collections, editorial picks

- **Governance**: Policy enforcement, takedown, compliance

- **Platform Analytics**: Marketplace health, trending, abuse detection

<Callout type="info">
**Source:** `packages/spec/src/cloud/marketplace-admin.zod.ts`
</Callout>

## TypeScript Usage

```typescript
import { CuratedCollection, FeaturedListing, MarketplaceHealthMetrics, PolicyAction, PolicyViolationType, RejectionReason, ReviewCriterion, ReviewDecision, SubmissionReview, TrendingListing } from '@objectstack/spec/cloud';
import type { CuratedCollection, FeaturedListing, MarketplaceHealthMetrics, PolicyAction, PolicyViolationType, RejectionReason, ReviewCriterion, ReviewDecision, SubmissionReview, TrendingListing } from '@objectstack/spec/cloud';

// Validate data
const result = CuratedCollection.parse(data);
```

---

## CuratedCollection

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **id** | `string` | ✅ | Collection ID |
| **name** | `string` | ✅ | Collection name |
| **description** | `string` | optional |  |
| **coverImageUrl** | `string` | optional |  |
| **listingIds** | `string[]` | ✅ | Ordered listing IDs |
| **published** | `boolean` | ✅ |  |
| **sortOrder** | `integer` | ✅ |  |
| **createdBy** | `string` | optional |  |
| **createdAt** | `string` | optional |  |
| **updatedAt** | `string` | optional |  |


---

## FeaturedListing

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **listingId** | `string` | ✅ | Featured listing ID |
| **priority** | `integer` | ✅ |  |
| **bannerUrl** | `string` | optional |  |
| **editorialNote** | `string` | optional |  |
| **startDate** | `string` | ✅ |  |
| **endDate** | `string` | optional |  |
| **active** | `boolean` | ✅ |  |


---

## MarketplaceHealthMetrics

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **totalListings** | `integer` | ✅ |  |
| **listingsByStatus** | `Record<string, integer>` | optional |  |
| **listingsByCategory** | `Record<string, integer>` | optional |  |
| **totalPublishers** | `integer` | ✅ |  |
| **verifiedPublishers** | `integer` | ✅ |  |
| **totalInstalls** | `integer` | ✅ |  |
| **averageReviewTime** | `number` | optional |  |
| **pendingReviews** | `integer` | ✅ |  |
| **listingsByPricing** | `Record<string, integer>` | optional |  |
| **snapshotAt** | `string` | ✅ |  |


---

## PolicyAction

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **id** | `string` | ✅ | Action ID |
| **listingId** | `string` | ✅ | Target listing ID |
| **violationType** | `Enum<'malware' \| 'data-harvesting' \| 'spam' \| 'copyright' \| 'inappropriate-content' \| 'terms-of-service' \| 'security-risk' \| 'abandoned'>` | ✅ |  |
| **action** | `Enum<'warning' \| 'suspend' \| 'takedown' \| 'restrict'>` | ✅ |  |
| **reason** | `string` | ✅ | Explanation of the violation |
| **actionBy** | `string` | ✅ | Admin user ID |
| **actionAt** | `string` | ✅ |  |
| **resolution** | `string` | optional |  |
| **resolved** | `boolean` | ✅ |  |


---

## PolicyViolationType

### Allowed Values

* `malware`
* `data-harvesting`
* `spam`
* `copyright`
* `inappropriate-content`
* `terms-of-service`
* `security-risk`
* `abandoned`


---

## RejectionReason

### Allowed Values

* `security-vulnerability`
* `policy-violation`
* `quality-below-standard`
* `misleading-metadata`
* `incompatible`
* `duplicate`
* `insufficient-documentation`
* `other`


---

## ReviewCriterion

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **id** | `string` | ✅ | Criterion ID |
| **category** | `Enum<'security' \| 'performance' \| 'quality' \| 'ux' \| 'documentation' \| 'policy' \| 'compatibility'>` | ✅ |  |
| **description** | `string` | ✅ |  |
| **required** | `boolean` | ✅ |  |
| **passed** | `boolean` | optional |  |
| **notes** | `string` | optional |  |


---

## ReviewDecision

### Allowed Values

* `approved`
* `rejected`
* `changes-requested`


---

## SubmissionReview

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **id** | `string` | ✅ | Review ID |
| **submissionId** | `string` | ✅ | Submission being reviewed |
| **reviewerId** | `string` | ✅ | Platform reviewer ID |
| **decision** | `Enum<'approved' \| 'rejected' \| 'changes-requested'>` | optional | Final decision |
| **criteria** | `Object[]` | optional | Review checklist results |
| **rejectionReasons** | `Enum<'security-vulnerability' \| 'policy-violation' \| 'quality-below-standard' \| 'misleading-metadata' \| 'incompatible' \| 'duplicate' \| 'insufficient-documentation' \| 'other'>[]` | optional |  |
| **feedback** | `string` | optional | Detailed review feedback (Markdown) |
| **internalNotes** | `string` | optional | Internal reviewer notes |
| **startedAt** | `string` | optional |  |
| **completedAt** | `string` | optional |  |


---

## TrendingListing

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **listingId** | `string` | ✅ |  |
| **rank** | `integer` | ✅ |  |
| **trendScore** | `number` | ✅ |  |
| **installVelocity** | `number` | ✅ |  |
| **period** | `string` | ✅ |  |


---

