---
title: "App Manifest-referentie | Tajo"
description: "Volledige schemareferentie voor het manifestbestand stripe-app.json waarmee je Stripe Apps configureert"
url: https://tajo.io/nl/docs/stripe-apps/app-manifest/
markdown: https://tajo.io/nl/docs/stripe-apps/app-manifest.md
lang: nl-NL
author: "Set Noa"
author_url: https://tajo.io/nl/set-noa/
robots: noindex
---

Vraag vroegtijdige toegang aan

Vul je voornaam en je zakelijke e-mailadres in. We sturen je een link om je aanvraag voor toegang tot Tajo te bevestigen.

# App Manifest-referentie

[Set Noa](https://tajo.io/nl/set-noa/)

Het manifestbestand `stripe-app.json` is de centrale configuratie van je Stripe App. Het legt de identiteit, de rechten, de UI-weergaven, het beveiligingsbeleid en het gedrag na installatie van je app vast.

Caution

**Status: gepland, niet gebouwd.** Tajo heeft geen Stripe App, dus niets in dit onderdeel kan vandaag worden geïnstalleerd. De app-identifiers, URL’s en credentials op deze pagina zijn illustratieve voorbeelden, geen werkende endpoints.

## Volledig manifestvoorbeeld

```json
{
  "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": "Read 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.example.com",
        "https://api.brevo.com"
      ],
      "image-src": [
        "https://cdn.example.com",
        "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.example.com/v1",
    "SYNC_INTERVAL_SECONDS": "300"
  }
}
```

## Schemareferentie

### Velden op het hoogste niveau

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `id` | string | Ja | Unieke app-identificatie in omgekeerde domeinnotatie (slugformaat) |
| `version` | string | Ja | Semantische versietekenreeks (bijvoorbeeld `"1.2.0"`) |
| `name` | string | Ja | Weergavenaam in de marketplace (maximaal 35 tekens) |
| `icon` | string | Ja | Relatief pad naar het icoonbestand van de app (PNG of SVG van 300x300) |
| `distribution_type` | string | Ja | `"public"` voor de marketplace of `"private"` voor intern gebruik |
| `sandbox_install_compatible` | boolean | Nee | Of de app in sandbox- of testmodus geïnstalleerd kan worden |
| `stripe_api_access_type` | string | Nee | Manier van API-toegang: `"oauth"` of `"api_key"` |
| `allowed_redirect_uris` | string\[\] | Nee | Toegestane OAuth-redirect-URI’s voor de installatieflow |
| `permissions` | PermissionRequest\[\] | Ja | Array met rechtenverzoeken |
| `ui_extension` | UIExtensionManifest | Nee | Configuratie van de UI-extensie |
| `post_install_action` | PostInstallAction | Nee | Actie die volgt op de installatie van de app |
| `constants` | object | Nee | Sleutel-waardeparen die tijdens runtime beschikbaar zijn in de app |

### id

De app-identificatie is een tekenreeks in slugformaat, meestal in omgekeerde domeinnotatie:

```json
"id": "com.tajo.brevo-integration"
```

- Moet uniek zijn binnen alle Stripe Apps
- Gebruik alleen kleine letters, cijfers, koppeltekens en punten
- Kan niet meer worden gewijzigd nadat de app is aangemaakt
- Bepaalt de URL van de app in de marketplace

### version

Volgt semantische versionering:

```json
"version": "1.2.0"
```

- **MAJOR**: brekende wijzigingen of ingrijpende nieuwe functionaliteit
- **MINOR**: nieuwe functies, achterwaarts compatibel
- **PATCH**: bugfixes en kleine verbeteringen
- Moet bij elke upload worden opgehoogd

### distribution\_type

Bepaalt wie je app kan installeren:

| Waarde | Beschrijving |
| --- | --- |
| `"public"` | Beschikbaar voor iedereen in de Stripe App Marketplace |
| `"private"` | Alleen te installeren vanuit je eigen Stripe-account |

### stripe\_api\_access\_type

Bepaalt hoe je app zich authenticeert bij de Stripe API:

| Waarde | Beschrijving |
| --- | --- |
| `"oauth"` | Gebruikt de OAuth 2.0-flow voor authenticatie (aanbevolen voor publieke apps) |
| `"api_key"` | Gebruikt beperkte API-sleutels (geschikt voor private apps) |

## PermissionRequest

Elk rechtenverzoek legt vast welk specifiek Stripe API-recht je app nodig heeft:

```json
{
  "permission": "customer_read",
  "purpose": "Read customer profiles to sync with Brevo contacts"
}
```

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `permission` | string | Ja | De identificatie van het recht (zie [Rechtenreferentie](https://tajo.io/nl/docs/stripe-apps/permissions)) |
| `purpose` | string | Ja | Uitleg in gewone taal waarom dit recht nodig is |

**Richtlijnen voor purpose:**

- Schrijf duidelijke, concrete uitleg die merchants begrijpen
- Leg uit waarvoor het recht wordt gebruikt, niet alleen wat het toegang geeft
- Houd de beschrijving kort (één zin)
- Vermijd technisch jargon

## UIExtensionManifest

Configureert de UI-componenten van je app:

```json
{
  "ui_extension": {
    "views": [...],
    "content_security_policy": {...}
  }
}
```

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `views` | ViewManifest\[\] | Ja | Array met weergavedeclaraties |
| `content_security_policy` | CSPRequest | Nee | Content Security Policy voor externe bronnen |

## ViewManifest

Elke weergave koppelt een React-component aan een viewport van het Stripe Dashboard:

```json
{
  "viewport": "stripe.dashboard.customer.detail",
  "component": "CustomerDetailView"
}
```

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `viewport` | string | Ja | De plek in het Dashboard waar deze weergave verschijnt (zie [Viewportsreferentie](https://tajo.io/nl/docs/stripe-apps/viewports)) |
| `component` | string | Ja | Naam van de React-component die wordt weergegeven (moet overeenkomen met de geëxporteerde componentnaam) |

Eén app kan meerdere weergaven declareren voor verschillende viewports:

```json
"views": [
  {
    "viewport": "stripe.dashboard.customer.detail",
    "component": "CustomerDetailView"
  },
  {
    "viewport": "stripe.dashboard.payment.detail",
    "component": "PaymentDetailView"
  },
  {
    "viewport": "stripe.dashboard.home.overview",
    "component": "OverviewView"
  }
]
```

## CSPRequest

De Content Security Policy bepaalt met welke externe domeinen je app verbinding mag maken:

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

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `connect-src` | string\[\] | Nee | Domeinen waarnaar de app netwerkverzoeken mag sturen |
| `image-src` | string\[\] | Nee | Domeinen waarvan de app afbeeldingen mag laden |
| `purpose` | string | Ja | Uitleg waarom deze externe verbindingen nodig zijn |

Caution

Neem alleen domeinen op waarmee je app daadwerkelijk verbinding moet maken. Te veel CSP-vermeldingen kunnen leiden tot een strengere review.

## PostInstallAction

Bepaalt wat er direct gebeurt nadat iemand je app installeert:

```json
{
  "post_install_action": {
    "type": "onboarding"
  }
}
```

| Veld | Type | Verplicht | Beschrijving |
| --- | --- | --- | --- |
| `type` | string | Ja | Het type actie (zie hieronder) |
| `url` | string | Voorwaardelijk | URL voor acties van het type `external` |

### Actietypen

| Type | Gedrag |
| --- | --- |
| `"onboarding"` | Opent de onboardingweergave van de app in het Dashboard |
| `"settings"` | Opent de instellingenweergave van de app in het Dashboard |
| `"external"` | Stuurt de gebruiker door naar een externe URL (vereist het veld `url`) |

Voorbeelden:

```json
// 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"
  }
}
```

Bekijk de [gids over acties na installatie](https://tajo.io/nl/docs/stripe-apps/post-install) voor uitgewerkte implementatiepatronen.

## Constants

Definieer statische sleutel-waardeparen die tijdens runtime beschikbaar zijn in je app:

```json
{
  "constants": {
    "API_BASE_URL": "https://api.example.com/v1",
    "SYNC_INTERVAL_SECONDS": "300",
    "MAX_BATCH_SIZE": "100"
  }
}
```

- Alle waarden moeten tekenreeksen zijn
- Constanten worden tijdens de build in de app opgenomen
- Gebruik constanten voor configuratie die per omgeving verschilt
- Sla **nooit** geheimen of API-sleutels op als constante, gebruik daarvoor de Secret Store API

Constanten uitlezen in je appcode:

```typescript
import { constants } from '@stripe/ui-extension-sdk/constants';

const apiUrl = constants.API_BASE_URL;
```

## Uitgebreid manifest voor ontwikkeling

Tijdens lokale ontwikkeling zijn er extra velden beschikbaar:

```json
{
  "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
  }
}
```

De sectie `dev` wordt weggelaten bij productiebuilds en bij het uploaden van de app. Gebruik hem alleen voor gemaksinstellingen tijdens lokale ontwikkeling.

## Validatie

Valideer je manifest voordat je het uploadt:

```bash
# Validate manifest syntax and schema
stripe apps validate

# Check for common issues
stripe apps check
```

Veelvoorkomende validatiefouten:

| Fout | Oorzaak | Oplossing |
| --- | --- | --- |
| `Invalid permission` | Onbekende identificatie van een recht | Bekijk de [Rechtenreferentie](https://tajo.io/nl/docs/stripe-apps/permissions) |
| `Invalid viewport` | Onbekende viewport-identificatie | Bekijk de [Viewportsreferentie](https://tajo.io/nl/docs/stripe-apps/viewports) |
| `Missing purpose` | Recht zonder het veld purpose | Voeg aan elk recht een purpose-tekst toe |
| `Invalid version` | Versietekenreeks die geen semver is | Gebruik het formaat `MAJOR.MINOR.PATCH` |
| `Icon not found` | Het icoonpad kan niet worden gevonden | Controleer of het icoonbestand op het opgegeven pad staat |
