docs/en/dev/plugin-market/2026-06-27.md
Specification version: 2026-06-27
Market JSON schema version: 1
This document defines the JSON format for AstrBot plugin market sources.
PluginRecord: One plugin entry in a market source.MarketMetadata: Metadata for the market source itself.plugin_id: The global plugin package identifier.metadata.yaml: The plugin metadata file inside the installed plugin package.The terms MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are normative.
A plugin market source MUST be a UTF-8 JSON object.
The root object MUST contain the reserved $meta key.
All root keys other than $meta MUST be one of:
plugin_id stringname string under the compatibility exception in Section 5Each root key other than $meta MUST map to a PluginRecord object:
{
"$meta": {
"schema_version": 1,
"name": "AstrBot Official Plugin Market",
"version": "2026-06-27",
"homepage": "https://astrbot.app",
"repository": "https://github.com/AstrBotDevs/AstrBot_Plugins_Collection"
},
"owner/astrbot_plugin_foo": {
"author": "owner",
"name": "astrbot_plugin_foo",
"version": "1.0.0",
"repo": "https://github.com/owner/astrbot_plugin_foo",
"desc": "Plugin description"
},
"astrbot_plugin_bar": {
"author": "owner",
"version": "1.0.0",
"repo": "https://github.com/owner/astrbot_plugin_bar",
"desc": "Compatibility record using the root key as name"
}
}
The root object MUST NOT contain top-level metadata fields outside $meta.
$meta MUST NOT be interpreted as a PluginRecord.
$meta MUST be a MarketMetadata object.
MarketMetadata MUST contain:
| Field | Type | Requirement |
|---|---|---|
schema_version | integer | Market JSON schema version. MUST be 1 for this specification. |
MarketMetadata MAY contain:
| Field | Type | Requirement |
|---|---|---|
name | string | Human-readable market source name. |
version | string | Market source data version. MUST NOT be used as the schema version. |
homepage | string | HTTPS homepage URL. |
repository | string | HTTPS repository URL for the market source data. |
description | string | Market source description. |
updated_at | string | ISO 8601 timestamp. |
$meta MUST NOT be used for:
plugin_id is defined as:
metadata.author + "/" + metadata.name
For every PluginRecord:
${author}/${name}.name under the compatibility exception below.author MUST equal metadata.yaml.author.name MUST equal metadata.yaml.name.plugin_id MUST be globally unique across the AstrBot plugin ecosystem.plugin_id values that are equal after lowercase normalization MUST NOT both exist.repo MUST NOT be used as plugin identity.root_dir_name, local directory names, display names, and registry names MUST NOT be used as plugin identity.author and name:
/.A root key MAY equal metadata.yaml.name instead of ${author}/${name}.
When this exception is used:
/.author MUST be present.name MAY be omitted.name is present, it MUST equal the root key.metadata.yaml.name.plugin_id as ${author}/${root_key}.Each PluginRecord MUST contain:
| Field | Type | Requirement |
|---|---|---|
author | string | Plugin author namespace. MUST match metadata.yaml.author. |
name | string | Plugin package name. MUST match metadata.yaml.name. MAY be omitted only when the root key equals metadata.yaml.name. |
version | string | Plugin version. MUST match metadata.yaml.version. |
repo | string | HTTPS GitHub repository URL used for source attribution and installation. |
desc | string | Default plugin description. |
| Field | Type | Requirement |
|---|---|---|
display_name | string | Human-readable plugin name. |
short_desc | string | Short description for compact UI. |
download_url | string | HTTPS ZIP download URL. Installed package identity MUST still match author/name. |
logo | string | HTTPS image URL or relative static asset path. |
tags | string[] | Tag list. |
category | string | Market category key. |
support_platforms | string[] | Supported platform keys. |
astrbot_version | string | AstrBot version requirement expression. |
social_link | string | Author or project HTTPS URL. |
updated_at | string | ISO 8601 timestamp. |
i18n | object | Localized display fields. |
pinned | boolean | Market recommendation flag. |
stars | integer | Non-negative star count or ranking signal. |
download_count | integer | Non-negative download count. |
repo MUST be one of:
https://github.com/{owner}/{repository}
https://github.com/{owner}/{repository}.git
https://github.com/{owner}/{repository}/tree/{branch}
owner, repository, and branch MUST match:
[A-Za-z0-9_-]+
repo MUST NOT be:
download_url MAY point to any HTTPS ZIP URL.
i18n keys SHOULD be BCP 47 locale tags.
Each locale object MAY contain:
{
"display_name": "Localized name",
"desc": "Localized description",
"short_desc": "Localized short description"
}
Market sources MUST NOT use these fields inside PluginRecord objects:
| Field | Reason |
|---|---|
plugin_id | Derived from author/name. |
market_plugin_id | Runtime/client compatibility field, not market data. |
market_plugin_identifier | Deprecated runtime/client compatibility field. |
root_dir_name | Local installation field. |
local_plugin_name | Local installation field. |
install_method | Local installation field. |
registry_url | Local installation field. |
registry_name | Local installation field. |
installed_at | Local installation field. |
Consumers MUST NOT use reserved fields for plugin identity.
The root key $meta is reserved for MarketMetadata.
These fields MAY be accepted by clients during migration, but new market sources MUST NOT emit them:
| Deprecated Field | Replacement |
|---|---|
support_platform | support_platforms |
platform | support_platforms |
Consumers MAY preserve unknown fields.
Consumers MUST NOT use unknown fields for:
A market source is valid only if all rules pass:
$meta is present.$meta is an object.$meta.schema_version is the integer 1.$meta is either a plugin_id or a name key.$meta is a PluginRecord object.name MAY be omitted when the root key is a name key.author and present name values do not contain /.${author}/${name} exactly, or the root key equals name exactly under the compatibility exception.repo is an HTTPS GitHub repository URL.download_url is an HTTPS URL.tags is an array of strings.support_platforms is an array of strings.stars is a non-negative integer.download_count is a non-negative integer.updated_at is an ISO 8601 timestamp.$meta.homepage is an HTTPS URL.$meta.repository is an HTTPS URL.$meta.updated_at is an ISO 8601 timestamp.repo or download_url contains metadata.yaml.metadata.yaml.author equals author.metadata.yaml.name equals name.metadata.yaml.version equals version.For market installation:
plugin_id and registry source to the backend.PluginRecord from that registry source by plugin_id.download_url when available; otherwise it installs using repo.metadata.yaml.metadata.yaml.author/name MUST equal the selected plugin_id.repo, download_url, registry information, and install time in local state.For market-installed plugins:
plugin_id.version.repo/download_url.For non-market installs:
plugin_id from installed metadata.yaml.When binding an installed non-market plugin to a market source:
metadata.yaml.plugin_id.plugin_id.Consumers MAY read legacy market sources during migration.
For legacy sources:
$meta.schema_version during migration.plugin_id from author/name.author or name for market installation.${author}/${name}.New market sources MUST include $meta.schema_version.