> ## Documentation Index
> Fetch the complete documentation index at: https://docs.helpgenie.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Marketplace

> Browse, search, and manage marketplace genie listings with categories and statistics.

All requests use a single endpoint: `POST https://api.helpgenie.ai/v1` with `resource: "marketplace"`.

## Access control

<Note>
  The `list`, `all`, `get`, `categories`, `stats`, and `trending` actions are publicly accessible. The `create`, `update`, and `delete` actions require internal admin authentication. The `clone`, `reviews`, `favorites`, `collections`, and `submissions` actions require user authentication.
</Note>

<Warning>
  The `create`, `update`, and `delete` actions are admin-only operations. Only users with the `internal_admin` role can perform these actions. Non-admin users will receive a `403 Forbidden` response.
</Warning>

### `sortBy` values

| Value       | Description                                              |
| ----------- | -------------------------------------------------------- |
| `"popular"` | Sort by view count (most viewed first)                   |
| `"newest"`  | Sort by creation date (most recent first) -- **default** |
| `"rating"`  | Sort by rating (highest rated first)                     |
| `"clones"`  | Sort by clone count (most cloned first)                  |

***

## List genies (slim)

Retrieves a simplified list of marketplace genies optimized for dropdowns and compact listings. Returns only essential fields without nested relations.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"list"`
</ParamField>

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="limit" type="number">
      Items per page. Range: 1-500. Default: `20`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>

    <ParamField body="query" type="object">
      <Expandable title="properties">
        <ParamField body="category" type="string">
          Filter by category slug.
        </ParamField>

        <ParamField body="brand" type="string">
          Filter by brand slug.
        </ParamField>

        <ParamField body="search" type="string">
          Search in name, tagline, and description.
        </ParamField>

        <ParamField body="featured" type="string">
          Set to `"true"` to show only featured genies.
        </ParamField>

        <ParamField body="minRating" type="string">
          Minimum rating filter.
        </ParamField>

        <ParamField body="difficulty" type="string">
          Filter by difficulty metadata.
        </ParamField>

        <ParamField body="industry" type="string">
          Filter by industry metadata.
        </ParamField>

        <ParamField body="sortBy" type="string">
          Sort order. One of `"popular"`, `"newest"`, `"rating"`, `"clones"`. Default: `"newest"`.
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="genies" type="object[]">
      <Expandable title="Slim genie fields">
        <ResponseField name="id" type="string" />

        <ResponseField name="slug" type="string" />

        <ResponseField name="display_name" type="string" />

        <ResponseField name="tagline" type="string" />

        <ResponseField name="thumbnail_url" type="string" />

        <ResponseField name="rating" type="number" />

        <ResponseField name="category_id" type="string" />

        <ResponseField name="is_featured" type="boolean" />

        <ResponseField name="clone_count" type="number" />
      </Expandable>
    </ResponseField>

    <ResponseField name="count" type="number" />

    <ResponseField name="limit" type="number" />

    <ResponseField name="offset" type="number" />
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<{
    genies: MarketplaceGenie[];
    count: number;
  }>({
    resource: "marketplace",
    action: "list",
    data: {
      limit: 20,
      query: {
        category: "customer-service",
        sortBy: "popular",
      },
    },
  });
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.helpgenie.ai/v1/marketplace \
    -H "Content-Type: application/json" \
    -d '{
      "action": "list",
      "data": {
        "limit": 20,
        "offset": 0,
        "query": {
          "category": "customer-service",
          "search": "sales",
          "sortBy": "popular",
          "featured": "true",
          "minRating": "4"
        }
      }
    }'
  ```
</CodeGroup>

***

## List genies (complete)

Retrieves the full marketplace genie listing with all fields and nested relations (category, brand, and creator in admin mode).

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"all"`
</ParamField>

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="limit" type="number">
      Items per page. Range: 1-500. Default: `20`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>

    <ParamField body="adminMode" type="boolean">
      Admin only. Include non-public genies in results.
    </ParamField>

    <ParamField body="query" type="object">
      Same query parameters as the `list` action. Default sort: featured first, then by clones.
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="genies" type="object[]">
      Array of full genie objects. See [genie object](#genie-object).
    </ResponseField>

    <ResponseField name="count" type="number" />

    <ResponseField name="limit" type="number" />

    <ResponseField name="offset" type="number" />
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<{
    genies: MarketplaceGenie[];
    count: number;
  }>({
    resource: "marketplace",
    action: "all",
    data: {
      limit: 50,
      query: {
        search: "sales",
        minRating: "4",
      },
    },
  });
  ```
</CodeGroup>

***

## Get a genie

Retrieves a specific marketplace genie by slug or ID. Automatically increments the view count and includes related genies from the same category.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"get"`
</ParamField>

<ParamField body="id" type="string" required>
  The genie slug (preferred) or UUID.
</ParamField>

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="adminMode" type="boolean">
      Admin only. Allow fetching non-public genies.
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  All fields from the [genie object](#genie-object), plus:

  <Expandable title="additional fields">
    <ResponseField name="related_genies" type="object[]">
      Genies from the same category.

      <Expandable title="properties">
        <ResponseField name="id" type="string" />

        <ResponseField name="slug" type="string" />

        <ResponseField name="display_name" type="string" />

        <ResponseField name="tagline" type="string" />

        <ResponseField name="thumbnail_url" type="string" />

        <ResponseField name="rating" type="number" />

        <ResponseField name="category_id" type="string" />
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<MarketplaceGenie>({
    resource: "marketplace",
    action: "get",
    id: "sales-assistant",
  });
  ```
</CodeGroup>

***

## Create a listing

Creates a new marketplace listing. Automatically marks the agent as a marketplace template and links the listing back to the agent.

<Note>
  Only internal admins can create marketplace listings.
</Note>

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"create"`
</ParamField>

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="agent_id" type="string" required>
      ID of the agent to list on the marketplace.
    </ParamField>

    <ParamField body="slug" type="string" required>
      URL-friendly unique identifier.
    </ParamField>

    <ParamField body="display_name" type="string" required>
      Public display name.
    </ParamField>

    <ParamField body="category_id" type="string" required>
      Category ID for the listing.
    </ParamField>

    <ParamField body="tagline" type="string">
      Short one-liner description.
    </ParamField>

    <ParamField body="description" type="string">
      Full description.
    </ParamField>

    <ParamField body="brand_id" type="string">
      Associated brand ID.
    </ParamField>

    <ParamField body="is_featured" type="boolean">
      Feature on homepage. Default: `false`.
    </ParamField>

    <ParamField body="is_public" type="boolean">
      Publish to marketplace. Default: `true`.
    </ParamField>

    <ParamField body="thumbnail_url" type="string">
      Preview image URL.
    </ParamField>

    <ParamField body="demo_video_url" type="string">
      Demo video URL.
    </ParamField>

    <ParamField body="metadata" type="object">
      Additional metadata (e.g. `difficulty`, `industry`).
    </ParamField>
  </Expandable>
</ParamField>

### Response (status 201)

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  The created marketplace genie with all fields. See [genie object](#genie-object).
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<MarketplaceGenie>(
    {
      resource: "marketplace",
      action: "create",
      data: {
        agent_id: "agent-123",
        slug: "sales-assistant",
        display_name: "Sales Assistant",
        category_id: "category-456",
        tagline: "Close more deals with voice AI",
        is_featured: true,
        metadata: { difficulty: "beginner", industry: "sales" },
      },
    },
    201
  );
  ```
</CodeGroup>

***

## Update a listing

Updates an existing marketplace listing.

<Note>
  Only internal admins can update marketplace listings.
</Note>

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"update"`
</ParamField>

<ParamField body="id" type="string" required>
  The listing ID.
</ParamField>

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="display_name" type="string" />

    <ParamField body="tagline" type="string" />

    <ParamField body="description" type="string" />

    <ParamField body="category_id" type="string" />

    <ParamField body="brand_id" type="string" />

    <ParamField body="is_featured" type="boolean" />

    <ParamField body="is_public" type="boolean" />

    <ParamField body="thumbnail_url" type="string" />

    <ParamField body="demo_video_url" type="string" />

    <ParamField body="metadata" type="object" />
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  The updated marketplace genie with all fields.
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<MarketplaceGenie>({
    resource: "marketplace",
    action: "update",
    id: "genie-uuid",
    data: {
      display_name: "Updated Sales Assistant",
      is_featured: false,
    },
  });
  ```
</CodeGroup>

***

## Delete a listing

Permanently deletes a marketplace listing and unlinks the agent from the marketplace.

<Note>
  Only internal admins can delete marketplace listings.
</Note>

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"delete"`
</ParamField>

<ParamField body="id" type="string" required>
  The listing ID.
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="success" type="boolean" />

    <ResponseField name="id" type="string">
      The deleted listing ID.
    </ResponseField>
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<{
    success: boolean;
    id: string;
  }>({
    resource: "marketplace",
    action: "delete",
    id: "genie-uuid",
  });
  ```
</CodeGroup>

***

## List categories

Retrieves all marketplace categories ordered by display order. No authentication required.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"categories"`
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="categories" type="object[]">
      <Expandable title="properties">
        <ResponseField name="id" type="string" />

        <ResponseField name="name" type="string" />

        <ResponseField name="slug" type="string" />

        <ResponseField name="description" type="string" />

        <ResponseField name="icon" type="string" />

        <ResponseField name="order" type="number" />

        <ResponseField name="parent_id" type="string | null" />

        <ResponseField name="created_at" type="string" />
      </Expandable>
    </ResponseField>

    <ResponseField name="count" type="number" />
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<{
    categories: MarketplaceCategory[];
    count: number;
  }>({
    resource: "marketplace",
    action: "categories",
  });
  ```
</CodeGroup>

***

## Get statistics

Retrieves aggregate statistics about the marketplace. No authentication required.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"stats"`
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="total_genies" type="number">
      Total number of marketplace genies.
    </ResponseField>

    <ResponseField name="total_views" type="number">
      Combined view count across all genies.
    </ResponseField>

    <ResponseField name="total_clones" type="number">
      Combined clone count across all genies.
    </ResponseField>

    <ResponseField name="featured_count" type="number">
      Number of featured genies.
    </ResponseField>

    <ResponseField name="categories_count" type="number">
      Number of categories.
    </ResponseField>
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke<{
    total_genies: number;
    total_views: number;
    total_clones: number;
    featured_count: number;
    categories_count: number;
  }>({
    resource: "marketplace",
    action: "stats",
  });
  ```

  ```json Example response theme={null}
  {
    "success": true,
    "data": {
      "total_genies": 42,
      "total_views": 5420,
      "total_clones": 128,
      "featured_count": 8,
      "categories_count": 12
    }
  }
  ```
</CodeGroup>

***

## Clone a marketplace genie

Clones a marketplace genie into the authenticated user's account. Delegates to `handle-agent` for the actual agent clone, tracks the clone in `user_marketplace_clones`, and increments the listing's `clone_count`.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"clone"`
</ParamField>

<ParamField body="id" type="string" required>
  The marketplace genie listing ID. Can also be passed as `marketplace_genie_id` in the data object.
</ParamField>

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="cloneName" type="string">
      Custom name for the cloned genie.
    </ParamField>

    <ParamField body="customizations" type="object">
      Custom overrides applied to the clone.
    </ParamField>

    <ParamField body="currentCloneCount" type="number">
      Current clone count (incremented by 1). Default: `0`.
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="success" type="boolean" />

    <ResponseField name="marketplace_genie_id" type="string">
      The listing that was cloned.
    </ResponseField>

    <ResponseField name="cloneResult" type="object">
      The result from the agent clone operation, including the new agent.
    </ResponseField>
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke({
    resource: "marketplace",
    action: "clone",
    id: "marketplace-genie-uuid",
    data: {
      cloneName: "My Custom Sales Bot",
      customizations: { industry: "retail" },
    },
  });
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.helpgenie.ai/v1/marketplace \
    -H "Authorization: Bearer hg_live_YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "action": "clone",
      "id": "marketplace-genie-uuid",
      "data": {
        "cloneName": "My Custom Sales Bot"
      }
    }'
  ```
</CodeGroup>

***

## Reviews

Manages reviews for marketplace genies. Uses a `mode` parameter inside `data` to select the operation. When `mode` is omitted, lists reviews.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"reviews"`
</ParamField>

<ParamField body="id" type="string">
  The marketplace genie ID. Can also be passed as `marketplace_genie_id` in data.
</ParamField>

### Create a review

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="mode" type="string" required>
      Must be `"create"`.
    </ParamField>

    <ParamField body="marketplace_genie_id" type="string" required>
      The genie being reviewed.
    </ParamField>

    <ParamField body="rating" type="number" required>
      Rating value.
    </ParamField>

    <ParamField body="review_text" type="string">
      Review body text.
    </ParamField>

    <ParamField body="is_verified_clone" type="boolean">
      Whether the reviewer has cloned this genie. Default: `false`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ review: {...} }` with status `201`.

### Update a review

Set `mode: "update"`. Requires `review_id`, plus optional `rating` and `review_text`. Only the review owner can update.

### Delete a review

Set `mode: "delete"`. Requires `review_id`. Only the review owner can delete.

### List reviews (default)

When `mode` is omitted, lists reviews for the given genie with pagination.

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="marketplace_genie_id" type="string" required>
      Filter reviews for this genie.
    </ParamField>

    <ParamField body="rating" type="number">
      Filter by exact rating value.
    </ParamField>

    <ParamField body="verified_only" type="boolean">
      Show only verified-clone reviews.
    </ParamField>

    <ParamField body="limit" type="number">
      Results per page. Max: `200`. Default: `50`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ items: [...], count, limit, offset }`.

***

## Favorites

Manages a user's marketplace favorites. Uses a `mode` parameter inside `data`.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"favorites"`
</ParamField>

### Add a favorite

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="mode" type="string" required>
      Must be `"add"`.
    </ParamField>

    <ParamField body="marketplace_genie_id" type="string" required>
      The genie to favorite.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ favorite: {...} }` with status `201`.

### Remove a favorite

Set `mode: "remove"` with `marketplace_genie_id`.

### List favorites (default)

When `mode` is omitted, lists all favorites for the authenticated user with pagination.

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="limit" type="number">
      Results per page. Max: `200`. Default: `50`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ items: [...], count, limit, offset }`. Each item includes the full `marketplace_genie` object.

***

## Trending

Returns trending marketplace genies from the `trending_marketplace_genies` view, ordered by trending score. No authentication required.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"trending"`
</ParamField>

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="limit" type="number">
      Maximum results. Max: `100`. Default: `10`.
    </ParamField>

    <ParamField body="category" type="string">
      Filter by category.
    </ParamField>

    <ParamField body="risingOnly" type="boolean">
      Only show rising genies (fewer than 50 clones, 5+ daily interactions).
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="success" type="boolean" />

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="items" type="object[]">
      Array of trending genie objects with `trending_score`.
    </ResponseField>
  </Expandable>
</ResponseField>

<CodeGroup>
  ```typescript Example request theme={null}
  const response = await ApiService.invoke({
    resource: "marketplace",
    action: "trending",
    data: { limit: 10, risingOnly: true },
  });
  ```
</CodeGroup>

***

## Collections

Manages user-curated collections of marketplace genies. Uses a `mode` parameter inside `data`.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"collections"`
</ParamField>

### Create a collection

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="mode" type="string" required>
      Must be `"create"`.
    </ParamField>

    <ParamField body="name" type="string" required>
      Collection name.
    </ParamField>

    <ParamField body="description" type="string">
      Collection description.
    </ParamField>

    <ParamField body="is_public" type="boolean">
      Whether the collection is publicly visible. Default: `false`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ collection: {...} }` with status `201`.

### Update a collection

Set `mode: "update"` with `collection_id` and any of `name`, `description`, `is_public`.

### Delete a collection

Set `mode: "delete"` with `collection_id`.

### Add genie to collection

Set `mode: "add-genie"` with `collection_id` and `marketplace_genie_id`.

### Remove genie from collection

Set `mode: "remove-genie"` with `collection_id` and `marketplace_genie_id`.

### Get a single collection

Pass `collection_id` (or `id`) without a `mode`. Returns the collection and its genies.

### List collections (default)

When no `mode` and no `collection_id` are provided, lists all collections for the authenticated user.

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="limit" type="number">
      Results per page. Max: `200`. Default: `50`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ items: [...], count, limit, offset }`.

***

## Submissions

Manages marketplace submission requests. Users submit their genies for marketplace listing; admins moderate them. Uses a `mode` parameter inside `data`.

<ParamField body="resource" type="string" required>
  Must be `"marketplace"`
</ParamField>

<ParamField body="action" type="string" required>
  Must be `"submissions"`
</ParamField>

### Create a submission

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="mode" type="string" required>
      Must be `"create"`.
    </ParamField>

    <ParamField body="agent_id" type="string" required>
      The agent to submit for marketplace listing.
    </ParamField>

    <ParamField body="submission_data" type="object">
      Additional submission details (tagline, description, category preference, etc.).
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ submission: {...} }` with status `201`. Initial status is `"pending"`.

### Moderate a submission (admin only)

Set `mode` to `"approve"`, `"reject"`, or `"under-review"`. Requires `submission_id`. Optional `admin_notes`.

### Delete a submission

Set `mode: "delete"` with `submission_id`. Admins can delete any submission; regular users can only delete their own.

### List submissions (default)

When `mode` is omitted, lists submissions with pagination. Admins see all submissions; regular users see only their own.

<ParamField body="data" type="object">
  <Expandable title="properties">
    <ParamField body="status" type="string">
      Filter by status: `"pending"`, `"approved"`, `"rejected"`, `"under_review"`.
    </ParamField>

    <ParamField body="limit" type="number">
      Results per page. Max: `200`. Default: `50`.
    </ParamField>

    <ParamField body="offset" type="number">
      Pagination offset. Default: `0`.
    </ParamField>
  </Expandable>
</ParamField>

Returns `{ items: [...], count, limit, offset }`.

***

## Genie object

The full genie object returned by `all`, `get`, `create`, and `update` actions.

<ResponseField name="id" type="string" />

<ResponseField name="agent_id" type="string" />

<ResponseField name="slug" type="string" />

<ResponseField name="display_name" type="string" />

<ResponseField name="tagline" type="string" />

<ResponseField name="description" type="string" />

<ResponseField name="category_id" type="string" />

<ResponseField name="category" type="object">
  <Expandable title="properties">
    <ResponseField name="id" type="string" />

    <ResponseField name="name" type="string" />

    <ResponseField name="slug" type="string" />
  </Expandable>
</ResponseField>

<ResponseField name="brand_id" type="string" />

<ResponseField name="brand" type="object">
  <Expandable title="properties">
    <ResponseField name="id" type="string" />

    <ResponseField name="name" type="string" />

    <ResponseField name="slug" type="string" />
  </Expandable>
</ResponseField>

<ResponseField name="is_featured" type="boolean" />

<ResponseField name="is_public" type="boolean" />

<ResponseField name="thumbnail_url" type="string" />

<ResponseField name="demo_video_url" type="string" />

<ResponseField name="rating" type="number" />

<ResponseField name="view_count" type="number" />

<ResponseField name="clone_count" type="number" />

<ResponseField name="metadata" type="object" />

<ResponseField name="created_at" type="string" />

<ResponseField name="updated_at" type="string" />

<ResponseField name="creator" type="object">
  <Expandable title="properties">
    <ResponseField name="id" type="string" />

    <ResponseField name="full_name" type="string" />

    <ResponseField name="email" type="string" />
  </Expandable>
</ResponseField>

***

## Error responses

| Status | Code               | Description                             |
| ------ | ------------------ | --------------------------------------- |
| 400    | `VALIDATION_ERROR` | Missing required parameters             |
| 401    | `UNAUTHORIZED`     | Missing or invalid authentication token |
| 403    | `FORBIDDEN`        | Non-admin attempting a write operation  |
| 404    | `NOT_FOUND`        | Marketplace genie not found             |
| 500    | `INTERNAL_ERROR`   | Server error                            |
