Справочник App Manifest

Файл манифеста stripe-app.json, центральная конфигурация вашего Stripe App. В нём объявляются идентичность приложения, разрешения, UI-представления, политики безопасности и поведение после установки.

Полный пример манифеста

{
"id": "com.tajo.brevo-integration",
"version": "1.2.0",
"name": "Tajo for Brevo",
"icon": "./assets/icon.png",
"distribution_type": "public",
"sandbox_install_compatible": true,
"stripe_api_access_type": "oauth",
"allowed_redirect_uris": [
"https://tajo.io/stripe/callback",
"https://tajo.io/stripe/oauth/complete"
],
"permissions": [
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Update customer metadata with Brevo sync status"
},
{
"permission": "charge_read",
"purpose": "Access payment history for Brevo event tracking"
},
{
"permission": "product_read",
"purpose": "Sync product catalog to Brevo for personalized campaigns"
},
{
"permission": "event_read",
"purpose": "Subscribe to real-time events for Brevo automation triggers"
},
{
"permission": "invoice_read",
"purpose": "Track invoice lifecycle events in Brevo"
}
],
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.customer.list",
"component": "CustomerListView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
},
{
"viewport": "stripe.dashboard.drawer.default",
"component": "DrawerView"
},
{
"viewport": "stripe.dashboard.settings",
"component": "SettingsView"
},
{
"viewport": "stripe.dashboard.onboarding",
"component": "OnboardingView"
}
],
"content_security_policy": {
"connect-src": [
"https://api.tajo.io",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.tajo.io",
"https://assets.brevo.com"
],
"purpose": "Connect to Tajo API for data sync and Brevo API for contact management"
}
},
"post_install_action": {
"type": "onboarding"
},
"constants": {
"API_BASE_URL": "https://api.tajo.io/v1",
"SYNC_INTERVAL_SECONDS": "300"
}
}

Справочник схемы

Поля верхнего уровня

ПолеТипОбязательноОписание
idстрокаДаУникальный идентификатор приложения в формате обратной доменной нотации
versionстрокаДаСемантическая версия (например, "1.2.0")
nameстрокаДаОтображаемое имя на маркетплейсе (макс. 35 символов)
iconстрокаДаОтносительный путь к файлу иконки приложения (300x300 PNG или SVG)
distribution_typeстрокаДа"public" для маркетплейса или "private" для внутреннего использования
sandbox_install_compatibleбулевоНетМожет ли приложение устанавливаться в sandbox/тестовом режиме
stripe_api_access_typeстрокаНетМетод доступа к API: "oauth" или "api_key"
allowed_redirect_urisstring[]НетРазрешённые URI перенаправления OAuth для процесса установки
permissionsPermissionRequest[]ДаМассив запросов разрешений
ui_extensionUIExtensionManifestНетКонфигурация UI-расширения
post_install_actionPostInstallActionНетДействие после установки приложения
constantsobjectНетПары ключ-значение, доступные в приложении во время выполнения

id

"id": "com.tajo.brevo-integration"
  • Должен быть глобально уникальным среди всех Stripe Apps
  • Используйте только строчные буквы, цифры, дефисы и точки
  • Нельзя изменить после создания приложения
  • Определяет URL приложения на маркетплейсе

version

Следует семантическому версионированию:

"version": "1.2.0"
  • MAJOR: Критические изменения или значительные новые функции
  • MINOR: Новые функции, обратно совместимые
  • PATCH: Исправления ошибок и незначительные улучшения
  • Должна увеличиваться при каждой загрузке

distribution_type

ЗначениеОписание
"public"Доступно на Stripe App Marketplace для всех пользователей
"private"Устанавливается только вашим собственным аккаунтом Stripe

stripe_api_access_type

ЗначениеОписание
"oauth"Использует OAuth 2.0 для аутентификации (рекомендуется для публичных приложений)
"api_key"Использует ограниченные API-ключи (подходит для приватных приложений)

PermissionRequest

{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
}
ПолеТипОбязательноОписание
permissionстрокаДаИдентификатор разрешения (см. Справочник разрешений)
purposeстрокаДаПонятное объяснение, зачем нужно это разрешение

UIExtensionManifest

{
"ui_extension": {
"views": [...],
"content_security_policy": {...}
}
}
ПолеТипОбязательноОписание
viewsViewManifest[]ДаМассив объявлений представлений
content_security_policyCSPRequestНетContent Security Policy для внешних ресурсов

ViewManifest

{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
}
ПолеТипОбязательноОписание
viewportстрокаДаМесто в Dashboard (см. Справочник вьюпортов)
componentстрокаДаИмя React-компонента для рендеринга

CSPRequest

{
"content_security_policy": {
"connect-src": [
"https://api.tajo.io",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.tajo.io"
],
"purpose": "Connect to Tajo API for data sync and load images from CDN"
}
}

Caution

Включайте только домены, к которым приложению действительно нужен доступ. Избыточные записи CSP могут привлечь дополнительное внимание при проверке.

PostInstallAction

{
"post_install_action": {
"type": "onboarding"
}
}

Типы действий

ТипПоведение
"onboarding"Открывает представление онбординга приложения в Dashboard
"settings"Открывает представление настроек приложения в Dashboard
"external"Перенаправляет пользователя на внешний URL (требует поле url)

Constants

{
"constants": {
"API_BASE_URL": "https://api.tajo.io/v1",
"SYNC_INTERVAL_SECONDS": "300",
"MAX_BATCH_SIZE": "100"
}
}
  • Все значения должны быть строками
  • Constants встраиваются в приложение во время сборки
  • Никогда не храните secrets или API-ключи как constants, используйте Secret Store API
import { constants } from '@stripe/ui-extension-sdk/constants';
const apiUrl = constants.API_BASE_URL;

Валидация

Terminal window
# Validate manifest syntax and schema
stripe apps validate
# Check for common issues
stripe apps check

Распространённые ошибки валидации:

ОшибкаПричинаРешение
Invalid permissionНеизвестный идентификатор разрешенияПроверьте Справочник разрешений
Invalid viewportНеизвестный идентификатор вьюпортаПроверьте Справочник вьюпортов
Missing purposeРазрешение без поля purposeДобавьте строку purpose к каждому разрешению
Invalid versionСтрока версии не в формате semverИспользуйте формат MAJOR.MINOR.PATCH
Icon not foundПуть к иконке не разрешаетсяУбедитесь, что файл иконки существует по указанному пути

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

AI-ассистент

Привет! Спрашивайте меня о документации.

Начните бесплатно с Brevo