Selling
Catalog fields
Use these tables to build a ListingInput for market.products.define.
They list SDK input types, required fields, defaults, and validation constraints.
The API uses the same field names, but sends prices and tier bounds as strings.
validateListing checks input locally;
Metzia also checks it on the server.
Objects are strict. An unknown field fails with the unknown rule.
Why the values are closedLink to this section
An agent compares listings across sellers. Classification fields use a shared vocabulary so that the same value has the same meaning across listings.
Identity and textLink to this section
| Field | Type | Allowed values | Required |
|---|---|---|---|
sku | string | 1 to 120 characters after a trim | Yes |
name | string | 1 to 120 characters after a trim | Yes |
summary | string | 1 to 280 characters after a trim | Yes |
description | string or null | At most 4000 characters after a trim | No. The default is null. |
notAFitWhen | string | 40 to 1000 characters after a trim | Yes |
destinationPath | string | A path on your own site that starts with one slash, for example /products/example | Yes |
A destinationPath holds no backslash and no . or .. segment. The rule
also applies to every form that the path decodes to.
Not a fit when explains how to write
notAFitWhen.
ClassificationLink to this section
| Field | Type | Allowed values | Required |
|---|---|---|---|
categorySlug | string | A slug from the category list | Yes |
pricingModel | string | flat, seat, usage, or tiered | Yes |
delivers | string | seats, credits, api_key, license, access, or shipment | Yes |
provisioning | string | delegated, keyless, or claim | Yes |
integrations | array of strings | At most 50 slugs from the integration list | No. The default is an empty array. |
limits | object | At most 50 vocabulary keys. Values are nonnegative safe integers or booleans, as the vocabulary requires. | No. The default is an empty object. |
A slug holds 1 to 63 lower case letters, digits, and hyphens. It starts and
ends with a letter or a digit. The SDK exports the rule as SLUG_PATTERN.
A limit key holds 1 to 63 lower case letters, digits, and underscores. It starts with a letter.
Metzia checks categorySlug, every integration slug, and every limit
key against its vocabulary when you submit a listing. An unknown value fails with
unknown_category, unknown_integration, or unknown_limit_key. A retired
category fails with deprecated_category.
Price pointsLink to this section
| Field | Type | Allowed values | Required |
|---|---|---|---|
pricePoints | array of price points | 1 to 20 price points | Yes |
Each price point holds the fields below.
| Field | Type | Allowed values | Required |
|---|---|---|---|
amountMicros | number | Nonnegative safe integer in micro-units of USD. One dollar is 1000000. | Yes |
unitName | string | 1 to 40 characters after a trim | Yes |
interval | string or null | month, year, or null | No. The default is null. |
plan | string or null | 1 to 80 characters after a trim, or null | No. The default is null. |
tierMin | number or null | Nonnegative safe integer, or null. Inclusive lower bound. | No. The default is null. |
tierMax | number or null | Nonnegative safe integer, or null. Exclusive upper bound. | No. The default is null. |
SDK numeric values must not exceed Number.MAX_SAFE_INTEGER (9007199254740991).
The SDK converts prices and tier bounds to digit strings for JSON. In a direct
API request, send amountMicros, tierMin, and tierMax as digit strings or
null where allowed, not JSON numbers.
The price points also follow these rules:
- A price point states
tierMinortierMaxonly whenpricingModelistiered. - A tiered listing forms one ordered, contiguous set of tiers. Every tier
states
tierMin. Only the last tier can leavetierMaxnull. - A listing with several price points states a
planon each one, unless the pricing model istiered. - Plan names must be unique within a listing, ignoring case.
SubscriptionLink to this section
| Field | Type | Allowed values | Required |
|---|---|---|---|
isSubscription | boolean | true or false | No. The default is false. |
subscription | object or null | The terms below, or null | Yes when isSubscription is true |
The subscription object holds the fields below.
| Field | Type | Allowed values | Required |
|---|---|---|---|
billingInterval | string | monthly, annual, or other | Yes |
renewalBehaviour | string | auto_renews, manual_renewal, or one_time | Yes |
cancellationUrl | string | One absolute https address on your own site, at most 2048 characters, with no credentials | Yes |
freeTrialDays | integer or null | A whole number of 0 to 365, or null | No. The default is null. |
renewalTerms | string or null | 40 to 600 Unicode code points, or null | No. The default is null. |
The subscription fields also follow these rules:
- A price point that charges every
monthor everyyearmakes the listing a subscription. SetisSubscriptionto true. - If
isSubscriptionis false, omitsubscriptionor set it to null. - A
monthlybilling interval needs a price point with themonthinterval. Anannualbilling interval needs a price point with theyearinterval. - A
one_timerenewal behavior refuses a price point that charges every month or every year. - A
cancellationUrlholds printable ASCII characters only. Percent encode any other character, and write an international host in itsxn--form. - Metzia compares the host of
cancellationUrlwith the website domain that your seller profile holds.
Updated 2026-10-07