Skip to main content
Your app is described by one file, tassyir.app.toml: its name and handle, the scopes it asks for and why, where it runs, its page in the dashboard, the webhooks it receives and the values it keeps in Tassyir. You upload the file as a version; merchants consent to a version, and their installation stays on it until they accept a newer one.

An example

An app on your own server with a page in the dashboard:
A headless app (no page) gets its first tokens from an install code sent to its auth.callback_url, and may send a webhook to another host:

Fields

  • Every table is strict: a key that is not a manifest field is an error, and the error’s fix names the field you probably meant.
  • Size: at most 64 KB once parsed into JSON. Lengths count UTF-16 code units.
  • Paths are joined to hosting.url, its own path kept: with url = "https://sync.example.com/tassyir", uri = "/hooks" is https://sync.example.com/tassyir/hooks.
  • Every host your data reaches (hosting.url, an absolute webhook uri, auth.callback_url) is shown to the merchant on the install screen.

Validate before you upload

@tassyir/app-manifest is the validator the Tassyir API runs on every upload, so a manifest it accepts is one the API accepts, with the same errors in the same order. Parse the TOML with any TOML 1.0 parser, then validate:
A project made with create-tassyir-app runs this as npm run validate (-- --json for tools). It returns every error at once, never throws, and reads no file, clock or network. Each error has:
The same document always gives the same errors in the same order, whatever the order of its keys: one per field, at most 50, then MANIFEST_TOO_MANY_ERRORS. The package README lists every error code. To check one field as it is typed (a handle in a form, say), use validateManifestField('handle', value).

In your editor

The JSON Schema of the manifest ships with the package. In an editor that reads schema directives (Taplo, Even Better TOML), start the file with:
The schema states the shape; the validator also checks the rules across fields and the exact URL and hostname rules, so a file the schema accepts can still be refused.

Upload a version

In the developer console, open your app’s Versions tab and upload the file. The console sends the parsed manifest to the API, which validates it again and:
  • refuses it with every validator error (APP_MANIFEST_INVALID, each error in the shape above);
  • refuses a handle other than the app’s (APP_MANIFEST_HANDLE_MISMATCH), a manifest identical to the latest version (APP_VERSION_UNCHANGED), and hosting.mode = "tassyir" while hosting is closed (APP_HOSTING_NOT_AVAILABLE);
  • otherwise numbers it (1, 2, …) and makes it current at once. Custom apps are not reviewed: they install only on your own businesses and the one business you name.
Limits per developer account: 50 apps (apps are never deleted), 30 version uploads an hour, and an upload of at most 128 KB. Installations do not move by themselves. A new version is offered to each installation as an update, and applies only when a member of that business accepts it. A version that adds a scope or a new host asks for consent again. See Scopes and consent.

Versions of the format

The manifest’s shape belongs to an API version. Within a version, only new optional fields can be added; a release of @tassyir/app-manifest ships them, and an older release refuses them until you update it.