Manifest reference
Every field in times.aip.json.
Every AIP ships a times.aip.json at the root of its bundle. The JSON Schema lives at /schemas/times.aip.schema.json. Unknown keys are rejected, so do not add a $schema key to the file. Run times manifest validate before every push.
{
"schemaVersion": "1",
"slug": "invoice-reminders",
"kind": "app",
"version": "1.0.0",
"name": "Invoice Reminders",
"mode": "platform",
"ui": {
"framework": "vite",
"runtime": "iframe",
"surfaces": ["page"],
"entry": "./dist/index.html",
"icon": "./icon.svg",
"uses_times_tokens": true
},
"scopes": {
"required": ["invoices:read", "buyers:read"],
"optional": ["events:subscribe"]
},
"i18n": {
"locales": ["en", "am", "om", "ti"],
"catalogs": {
"en": "./i18n/messages/en.json",
"am": "./i18n/messages/am.json",
"om": "./i18n/messages/om.json",
"ti": "./i18n/messages/ti.json"
}
},
"changelog": [
{
"version": "1.0.0",
"date": "2026-10-17",
"summaryKey": "changelog.v1_0_0.summary",
"highlightKeys": ["changelog.v1_0_0.reminders"]
}
]
}Top-level fields
| Field | Type | Required | Notes |
|---|---|---|---|
schemaVersion | "1" | Yes | Always "1" for now. |
slug | string | Yes | Lowercase kebab case, such as invoice-reminders. Unique across TIMES. |
kind | app, integration, pack | Yes | Decides where the AIP appears in the marketplace. |
version | semver | Yes | Must be greater than every version you pushed before. |
name | string | Yes | Display name. Translate it in your catalogs under meta.name. |
mode | platform, runtime | Yes | See Platform mode and Runtime workers. |
ui | object | Yes | How the host renders your bundle. |
scopes | object | Yes | Permissions the merchant grants on install. |
i18n | object | Yes | All four locales are required. |
changelog | array | Yes | Release notes. The current version needs an entry. |
connect | object | Integrations | OAuth, credentials or configure flow. |
runtime | object | Runtime mode | Worker URL and signing settings. |
platform | object | No | events the AIP listens to and a settingsSchema for the configure screen. |
catalog | object | No | autoPublish: true publishes as soon as review approves. |
ui
| Field | Values | Notes |
|---|---|---|
framework | static, vite, next | Next.js must use static export. |
runtime | iframe | The only runtime today. |
surfaces | page, overlay, configure | configure is the settings screen for integrations. |
entry | path | HTML entry inside the bundle. |
icon | path | Square SVG or PNG, at least 256px. |
uses_times_tokens | true | Required. Import @times/aip-sdk/tokens.css so your UI follows the merchant theme. |
scopes
required scopes are granted on install. optional scopes are requested at runtime with client.requestScopes(). See Scopes for the full list.
changelog
Each entry has version, date (YYYY-MM-DD), summaryKey and highlightKeys. The keys point into your i18n catalogs, so release notes show in the merchant language. Write highlights as what the merchant can now do, not commit messages.
connect
"connect": {
"mode": "oauth",
"oauth": {
"provider": "slack",
"scopes": ["chat:write", "channels:read"]
}
}mode is oauth, credentials or configure. Supported OAuth providers are slack, google, whatsapp and telegram. TIMES holds the OAuth client secrets. Your bundle never sees them.
CDN layout
Published bundles are served from:
https://aip.times.et/{apps|integrations|packs}/{slug}/{version}/


