Référence du manifest d’application
Le fichier manifest stripe-app.json constitue la configuration centrale de votre Stripe App. Il déclare l’identité de votre application, ses permissions, ses vues d’interface, ses politiques de sécurité et son comportement après installation.
Exemple de manifest complet
{ "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" }}Référence du schéma
Champs de premier niveau
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | Oui | Identifiant unique de l’application en notation de domaine inversé (format slug) |
version | string | Oui | Chaîne de version sémantique (par exemple "1.2.0") |
name | string | Oui | Nom affiché sur la marketplace (35 caractères maximum) |
icon | string | Oui | Chemin relatif vers le fichier d’icône de l’application (PNG ou SVG de 300x300) |
distribution_type | string | Oui | "public" pour la marketplace ou "private" pour un usage interne |
sandbox_install_compatible | boolean | Non | Indique si l’application peut être installée en mode sandbox ou test |
stripe_api_access_type | string | Non | Méthode d’accès à l’API : "oauth" ou "api_key" |
allowed_redirect_uris | string[] | Non | URI de redirection OAuth autorisées pour le parcours d’installation |
permissions | PermissionRequest[] | Oui | Tableau de demandes de permission |
ui_extension | UIExtensionManifest | Non | Configuration de l’extension d’interface |
post_install_action | PostInstallAction | Non | Action à exécuter après l’installation de l’application |
constants | object | Non | Paires clé-valeur accessibles dans l’application à l’exécution |
id
L’identifiant de l’application est une chaîne au format slug, généralement en notation de domaine inversé :
"id": "com.tajo.brevo-integration"- Il doit être unique parmi toutes les Stripe Apps
- N’utilisez que des lettres minuscules, des chiffres, des tirets et des points
- Il ne peut plus être modifié une fois l’application créée
- Il détermine l’URL de l’application sur la marketplace
version
Suit le versionnement sémantique :
"version": "1.2.0"- MAJOR : changements incompatibles ou ajouts de fonctionnalités majeures
- MINOR : nouvelles fonctionnalités, rétrocompatibles
- PATCH : corrections de bugs et améliorations mineures
- Doit être incrémenté à chaque envoi
distribution_type
Détermine qui peut installer votre application :
| Valeur | Description |
|---|---|
"public" | Disponible pour tous les utilisateurs sur la Stripe App Marketplace |
"private" | Installable uniquement sur votre propre compte Stripe |
stripe_api_access_type
Détermine la manière dont votre application s’authentifie auprès de l’API Stripe :
| Valeur | Description |
|---|---|
"oauth" | Utilise le flux OAuth 2.0 pour l’authentification (recommandé pour les applications publiques) |
"api_key" | Utilise des clés API restreintes (adapté aux applications privées) |
PermissionRequest
Chaque demande de permission déclare une permission précise de l’API Stripe dont votre application a besoin :
{ "permission": "customer_read", "purpose": "Read customer profiles to sync with Brevo contacts"}| Champ | Type | Requis | Description |
|---|---|---|---|
permission | string | Oui | L’identifiant de la permission (voir la référence des permissions) |
purpose | string | Oui | Explication lisible par un humain de la raison pour laquelle cette permission est nécessaire |
Recommandations pour le champ purpose :
- Rédigez des explications claires et précises, compréhensibles par les marchands
- Expliquez à quoi sert la permission, et pas seulement ce qu’elle autorise
- Restez concis, une seule phrase suffit
- Évitez le jargon technique
UIExtensionManifest
Configure les composants d’interface de votre application :
{ "ui_extension": { "views": [...], "content_security_policy": {...} }}| Champ | Type | Requis | Description |
|---|---|---|---|
views | ViewManifest[] | Oui | Tableau de déclarations de vues |
content_security_policy | CSPRequest | Non | Content Security Policy applicable aux ressources externes |
ViewManifest
Chaque vue associe un composant React à un viewport du Dashboard Stripe :
{ "viewport": "stripe.dashboard.customer.detail", "component": "CustomerDetailView"}| Champ | Type | Requis | Description |
|---|---|---|---|
viewport | string | Oui | L’emplacement du Dashboard où cette vue s’affiche (voir la référence des viewports) |
component | string | Oui | Nom du composant React à afficher (il doit correspondre au nom du composant exporté) |
Une même application peut déclarer plusieurs vues pour différents viewports :
"views": [ { "viewport": "stripe.dashboard.customer.detail", "component": "CustomerDetailView" }, { "viewport": "stripe.dashboard.payment.detail", "component": "PaymentDetailView" }, { "viewport": "stripe.dashboard.home.overview", "component": "OverviewView" }]CSPRequest
La Content Security Policy détermine les domaines externes auxquels votre application peut se connecter :
{ "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" }}| Champ | Type | Requis | Description |
|---|---|---|---|
connect-src | string[] | Non | Domaines vers lesquels l’application peut émettre des requêtes réseau |
image-src | string[] | Non | Domaines depuis lesquels l’application peut charger des images |
purpose | string | Oui | Explication de la nécessité de ces connexions externes |
Caution
N’incluez que les domaines auxquels votre application a réellement besoin de se connecter. Des entrées CSP trop nombreuses peuvent déclencher un examen plus poussé lors de la révision.
PostInstallAction
Configure ce qui se passe immédiatement après qu’un utilisateur a installé votre application :
{ "post_install_action": { "type": "onboarding" }}| Champ | Type | Requis | Description |
|---|---|---|---|
type | string | Oui | Le type d’action (voir ci-dessous) |
url | string | Conditionnel | URL pour les actions de type external |
Types d’action
| Type | Comportement |
|---|---|
"onboarding" | Ouvre la vue d’onboarding de l’application dans le Dashboard |
"settings" | Ouvre la vue des paramètres de l’application dans le Dashboard |
"external" | Redirige l’utilisateur vers une URL externe (le champ url est obligatoire) |
Exemples :
// Open onboarding flow{ "post_install_action": { "type": "onboarding" }}
// Open settings page{ "post_install_action": { "type": "settings" }}
// Redirect to external setup{ "post_install_action": { "type": "external", "url": "https://app.tajo.io/stripe/setup" }}Consultez le guide des actions après installation pour des schémas d’implémentation détaillés.
Constantes
Définissez des paires clé-valeur statiques accessibles à l’exécution dans votre application :
{ "constants": { "API_BASE_URL": "https://api.tajo.io/v1", "SYNC_INTERVAL_SECONDS": "300", "MAX_BATCH_SIZE": "100" }}- Toutes les valeurs doivent être des chaînes de caractères
- Les constantes sont intégrées à l’application au moment de la compilation
- Utilisez les constantes pour la configuration qui varie d’un environnement à l’autre
- Ne stockez jamais de secrets ni de clés API dans des constantes, utilisez plutôt la Secret Store API
Accédez aux constantes dans le code de votre application :
import { constants } from '@stripe/ui-extension-sdk/constants';
const apiUrl = constants.API_BASE_URL;Manifest étendu pour le développement
Pendant le développement en local, des champs supplémentaires sont disponibles :
{ "id": "com.tajo.brevo-integration", "version": "0.1.0", "name": "Tajo for Brevo (Dev)", "icon": "./assets/icon-dev.png", "distribution_type": "private", "sandbox_install_compatible": true, "dev": { "hot_reload": true, "port": 4242 }}La section dev est supprimée lors des compilations de production et des envois de l’application. Réservez-la aux réglages de confort pour le développement en local.
Validation
Validez votre manifest avant de l’envoyer :
# Validate manifest syntax and schemastripe apps validate
# Check for common issuesstripe apps checkErreurs de validation courantes :
| Erreur | Cause | Correction |
|---|---|---|
Invalid permission | Identifiant de permission inconnu | Consultez la référence des permissions |
Invalid viewport | Identifiant de viewport inconnu | Consultez la référence des viewports |
Missing purpose | Permission sans champ purpose | Ajoutez une chaîne purpose à chaque permission |
Invalid version | Chaîne de version non conforme à semver | Utilisez le format MAJOR.MINOR.PATCH |
Icon not found | Le chemin de l’icône ne se résout pas | Vérifiez que le fichier d’icône existe au chemin indiqué |