TIMESDevelopers
v1.0.0

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.

times.aip.json
{
  "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

FieldTypeRequiredNotes
schemaVersion"1"YesAlways "1" for now.
slugstringYesLowercase kebab case, such as invoice-reminders. Unique across TIMES.
kindapp, integration, packYesDecides where the AIP appears in the marketplace.
versionsemverYesMust be greater than every version you pushed before.
namestringYesDisplay name. Translate it in your catalogs under meta.name.
modeplatform, runtimeYesSee Platform mode and Runtime workers.
uiobjectYesHow the host renders your bundle.
scopesobjectYesPermissions the merchant grants on install.
i18nobjectYesAll four locales are required.
changelogarrayYesRelease notes. The current version needs an entry.
connectobjectIntegrationsOAuth, credentials or configure flow.
runtimeobjectRuntime modeWorker URL and signing settings.
platformobjectNoevents the AIP listens to and a settingsSchema for the configure screen.
catalogobjectNoautoPublish: true publishes as soon as review approves.

ui

FieldValuesNotes
frameworkstatic, vite, nextNext.js must use static export.
runtimeiframeThe only runtime today.
surfacespage, overlay, configureconfigure is the settings screen for integrations.
entrypathHTML entry inside the bundle.
iconpathSquare SVG or PNG, at least 256px.
uses_times_tokenstrueRequired. 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}/