> ## Documentation Index
> Fetch the complete documentation index at: https://developer.jtl-software.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Listing Manifest

> The listing manifest that describes your app for merchants: distribution, media, compatibility, pricing, and legal.

The listing manifest is a JSON document that describes your app for merchants. It defines how your app is distributed, the content shown in the App Store, the JTL products it supports, its pricing, and its legal URLs.

Listing an app requires [becoming a seller](https://www.jtl-software.de/extension-store/Seller-werden). You submit the manifest through the **JSON Code Editor** in the [Partner Portal](https://partner.jtl-cloud.com/) under **Publish apps**. You can also fill in the listing wizard form directly to create your listing.

## Top-level Fields

These fields set the listing's version, locale fallback, and distribution.

| Property           | Type   | Required | Description                                                                                                                                  |
| ------------------ | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `version`          | string | Yes      | The app version shown in the App Store. You set this; it isn't incremented for you.                                                          |
| `defaultLocale`    | string | Yes      | Fallback locale used when a merchant's locale has no content (e.g. `de-DE`). Must be one of the locales present in `name` and `description`. |
| `distributionType` | enum   | Yes      | `PUBLIC` lists the app in the App Store. `PRIVATE` keeps it out, shared through activation codes instead.                                    |

## Name and Description

Names and descriptions are keyed by locale, so one manifest can serve several markets.

| Property                     | Type   | Limit     | Description                                                    |
| ---------------------------- | ------ | --------- | -------------------------------------------------------------- |
| `name.{locale}.short`        | string | 30 chars  | Short name shown in tiles, search results, and headings.       |
| `name.{locale}.full`         | string | 80 chars  | Full name shown on the detail page.                            |
| `description.{locale}.short` | string | 200 chars | One-line teaser shown in search results and cards.             |
| `description.{locale}.full`  | string | none      | Full description shown on the detail page. Supports rich text. |

## Benefits

A locale-keyed array of short benefit statements, shown as a bullet list on the detail page.

| Property            | Type            | Limit        | Description                                          |
| ------------------- | --------------- | ------------ | ---------------------------------------------------- |
| `benefits.{locale}` | array of string | 3 to 5 items | The key benefits of your app, written for merchants. |

## Category

Controls where your app appears in the App Store category navigation. Not localized.

| Property        | Type            | Required | Description                    |
| --------------- | --------------- | -------- | ------------------------------ |
| `category.main` | string          | Yes      | One main category slug.        |
| `category.sub`  | array of string | Yes      | One or more subcategory slugs. |

## Media

Visual assets for the listing. Not localized.

| Property            | Type  | Required | Description                                                 |
| ------------------- | ----- | -------- | ----------------------------------------------------------- |
| `media.icons.light` | URL   | Yes      | Icon for light mode, 250 x 250 pixels, JPG, PNG, or SVG.    |
| `media.icons.dark`  | URL   | Yes      | Icon for dark mode, same format.                            |
| `media.screenshots` | array | Yes      | One to ten screenshots. Each has an `id`, `url`, and `alt`. |
| `media.video`       | URL   | No       | Optional YouTube URL for a product video.                   |

Each screenshot is an object:

| Property | Type   | Description                            |
| -------- | ------ | -------------------------------------- |
| `id`     | string | Stable identifier for the screenshot.  |
| `url`    | URL    | Public image URL (JPG or PNG).         |
| `alt`    | string | Alt text for accessibility and search. |

## Compatibility

Describes which JTL products your app works with. `products` is locale-keyed; `minVersions` and `productsNotes` are not.

| Property                          | Type            | Required | Description                                                           |
| --------------------------------- | --------------- | -------- | --------------------------------------------------------------------- |
| `compatibility.products.{locale}` | array of string | Yes      | The JTL product slugs your app supports (e.g. `jtl-wawi`).            |
| `compatibility.minVersions`       | object          | Yes      | Minimum supported version per product, as `{ "product": "version" }`. |
| `compatibility.productsNotes`     | string          | No       | Free-text note about third-party product support.                     |

In the Partner Portal, you select the products your app supports and then provide a minimum version for each one.

## Pricing

Public listings define pricing under `pricing.subscriptionTiers`.

<Info>
  You can configure your pricing tiers now, but merchant billing through them is not yet available. Defining your tiers now ensures your listing is ready when billing becomes available.
</Info>

Each tier is an object:

| Property                       | Type            | Required           | Description                                               |
| ------------------------------ | --------------- | ------------------ | --------------------------------------------------------- |
| `id`                           | string          | Yes                | Stable identifier for the tier.                           |
| `content.{locale}.name`        | string          | Yes                | The tier name merchants see, for example "Pro".           |
| `content.{locale}.description` | string          | Yes                | A short description of the tier.                          |
| `content.{locale}.features`    | array of string | Yes                | One to ten features the tier includes.                    |
| `isFree`                       | boolean         | Yes                | `true` for a free tier, `false` for a paid one.           |
| `monthlyPriceEur`              | number          | Required when paid | Monthly price in EUR.                                     |
| `annualPriceEur`               | number          | No                 | Annual price in EUR.                                      |
| `isMostPopular`                | boolean         | Yes                | Whether the tier is marked most popular in the App Store. |
| `trial`                        | object          | No                 | An optional trial period. See below.                      |

A listing can have only one free tier and only one tier marked most popular. Tiers are ordered by price, free first.

A `trial` object has `enabled` (boolean), `preset` (string), and `days` (integer, 0 to 30), all required when `trial` is present.

## Support

Locale-keyed support links shown on the detail page.

| Property                         | Type | Required | Description                      |
| -------------------------------- | ---- | -------- | -------------------------------- |
| `support.url.{locale}`           | URL  | Yes      | Customer support URL.            |
| `support.documentation.{locale}` | URL  | No       | Documentation or user guide URL. |

## Legal

Legal URLs required for compliance. Not localized. All four are required.

| Property              | Type | Description                                       |
| --------------------- | ---- | ------------------------------------------------- |
| `legal.privacyPolicy` | URL  | Privacy policy page.                              |
| `legal.termsOfUse`    | URL  | Terms of use page.                                |
| `legal.gdpr.request`  | URL  | Page or endpoint for GDPR data access requests.   |
| `legal.gdpr.delete`   | URL  | Page or endpoint for GDPR data deletion requests. |

## Complete Example

A public listing for the German locale, with a free and a paid tier:

```json theme={null}
{
  "version": "1.0.0",
  "defaultLocale": "de-DE",
  "distributionType": "PUBLIC",
  "name": {
    "de-DE": {
      "short": "My App",
      "full": "My JTL Cloud App"
    }
  },
  "description": {
    "de-DE": {
      "short": "A short teaser for search results and cards.",
      "full": "The full description shown on the app's detail page."
    }
  },
  "benefits": {
    "de-DE": ["Benefit 1", "Benefit 2", "Benefit 3"]
  },
  "category": {
    "main": "articles-product-data",
    "sub": ["item-master-data-attributes"]
  },
  "media": {
    "icons": {
      "light": "https://example.com/icon-light.png",
      "dark": "https://example.com/icon-dark.png"
    },
    "screenshots": [
      {
        "id": "screenshot-1",
        "url": "https://example.com/screenshot-1.png",
        "alt": "The app's dashboard"
      }
    ]
  },
  "compatibility": {
    "products": {
      "de-DE": ["jtl-wawi"]
    },
    "productsNotes": "",
    "minVersions": {
      "jtl-wawi": "12.0.1"
    }
  },
  "pricing": {
    "subscriptionTiers": [
      {
        "id": "plan-free",
        "content": {
          "de-DE": {
            "name": "Free",
            "description": "For getting started.",
            "features": ["Feature 1"]
          }
        },
        "isFree": true,
        "isMostPopular": false
      },
      {
        "id": "plan-pro",
        "content": {
          "de-DE": {
            "name": "Pro",
            "description": "For growing merchants.",
            "features": ["Feature 1", "Feature 2", "Feature 3"]
          }
        },
        "isFree": false,
        "monthlyPriceEur": "3",
        "isMostPopular": true
      }
    ]
  },
  "support": {
    "url": {
      "de-DE": "https://example.com/support"
    },
    "documentation": {
      "de-DE": "https://example.com/docs"
    }
  },
  "legal": {
    "privacyPolicy": "https://example.com/privacy",
    "termsOfUse": "https://example.com/terms",
    "gdpr": {
      "request": "https://example.com/gdpr/request",
      "delete": "https://example.com/gdpr/delete"
    }
  }
}
```

## What's Next?

<CardGroup cols={2}>
  <Card title="Submitting Your App" icon="send" href="/get-started/submitting-your-app/overview">
    Publish to the App Store, or share your app privately with activation codes.
  </Card>

  <Card title="App Manifest" icon="file-braces" href="/guides/cloud-apps/app-manifest">
    The technical manifest that registers your app.
  </Card>
</CardGroup>
