tappify.extension.json accepts. This page is generated from the JSON Schema
the SDK, the CLI and Tappify all validate against, so it cannot drift from what a publish
enforces. Do not edit it by hand; the next SDK release overwrites it.
Point your editor at it and get completion and validation while you edit:
tappify extension init writes that line, and
tappify extension doctor adds it when it is missing.
$schema
string · optional
The URL of this JSON Schema. Editors read it for completion and inline validation.
id
string · required · pattern ^[a-z][a-z0-9-]{2,39}$
The identifier for this extension, unique across the Tap Store and fixed after the first publish.
name
string · required · 2–40 characters
The name owners see in the Tap Store and on every surface this extension renders.
description
string · required · 10–200 characters
The one line owners read on the Tap Store card and on the install screen.
icon
string · required · 1–200 characters
The icon file carried in the bundle, as a path relative to the manifest. Square png or svg, at most 512 KB.
category
"market_data" | "subscriptions" | "product_analytics" | "crashes" | "attribution" | "experiments" | "messaging" | "session_replay" | "localization" | "design" | "ci_cd" | "trackers" | "support" | "chat" | "ad_monetization" | "warehouse" | "compliance" | "additional_stores" · required
The Tap Store section owners browse and filter by.
sdk
string · required · 1–60 characters
The SDK range this build targets, such as “^2.0.0”. The host serves one major at a time and rejects a range that excludes it.
visibility
"public" | "unlisted" | "private" · required
Who can find and install this extension. “public” lists it in the Tap Store and needs all five listing fields; “unlisted” installs by link; “private” installs only in your own workspace.
installScope
"project" | "organization" · required
Whether one install belongs to a single project or to a whole organization. An organization install contributes no pages, tabs, widgets or series, because those render on a project.
scopes
object[] · required · 1–19 entries
The permissions an owner grants at install. Declare only what your contributions use.
contributes
object · required
What this extension adds to the host. At most 20 UI contributions in total, and a page, tab, widget, row action, marker or settings panel needs the ui:render scope.
contributes.pages
object[] · optional · at most 20 entries
Pages of this extension’s own, each on its own route under the project. nav: true also puts one in the project navigation.
contributes.tabs
object[] · optional · at most 20 entries
Tabs beside the host’s own on a named host page.
contributes.widgets
object[] · optional · at most 20 entries
Cards drawn into a named slot on a host page.
contributes.series
object[] · optional · at most 20 entries
Lines drawn onto a host chart from a metric the connector writes. The host draws the line on the chart this names and puts the vendor in the chart legend; a stale metric is drawn dashed with the time of its last sync.
contributes.banners
object[] · optional · at most 20 entries
Banners raised on a host page by a webhook declared with as: “banner”. The host draws one at the top of that page, carrying the why sentence from the delivery, until the owner dismisses it.
contributes.rowActions
object[] · optional · at most 20 entries
Actions offered on a row of a host table.
contributes.markers
object[] · optional · at most 20 entries
Markers drawn on a host chart by a webhook declared with as: “event”. Needs the ui:render and alerts:write scopes. The host draws the glyph on the chart time axis at the moment the delivery arrived, with the vendor named on hover.
contributes.settings
object · optional
The settings panel owners open for this install.
contributes.storage
record of object · optional · keys match ^[a-z][a-z0-9_]*$
The hosted storage collections this extension reads and writes. At most 10, and the name “settings” is reserved. Needs the storage:write scope.
contributes.connector
object · optional
How this extension authenticates against an outside service, how often it syncs, and the metrics it writes.
contributes.connector.auth
object · optional
How owners authenticate this connector.
contributes.connector.auth.fields
object[] · optional · at most 20 entries
The credentials owners enter. They reach your server as credentials on every call.
contributes.connector.auth.oauth
object · optional
The endpoints, for method: "oauth".
contributes.connector.metrics
object[] · optional · at most 50 entries
The metrics this connector writes into the metrics store. Needs the metrics:write scope.
contributes.connector.metrics.dimensions
object[] · optional · at most 10 entries
The breakdowns this metric can be split by.
contributes.webhooks
object[] · optional · at most 20 entries
The events this extension’s server posts to Tappify, and what each one becomes. An alert or a banner needs the alerts:write scope.
contributes.ai
object · optional
What this extension offers the assistant: tools, mentions, actions, knowledge, skills, prompts and context providers.
contributes.ai.tools
object[] · optional · at most 15 entries
The tools the assistant may call on your server. Needs the ai:tools scope.
contributes.ai.mentions
object[] · optional · at most 10 entries
The things owners can name with @ in chat, and where to list them. Needs the ai:tools scope.
contributes.ai.actions
object[] · optional · at most 10 entries
The actions the assistant may run, each behind an owner approval. Needs the ai:actions scope, and each action’s own scope. tap.actions.run creates the run and resolves with it; the host draws the approval card and calls your server only once the owner approves.
contributes.ai.knowledge
object[] · optional · at most 20 entries
Markdown the assistant indexes and cites when it answers about this extension.
contributes.ai.skills
object[] · optional · at most 5 entries
Markdown procedures that shape how the assistant works. Needs the ai:skills scope.
contributes.ai.prompts
object[] · optional · at most 20 entries
Prompt templates the host offers owners as chips. Needs the ai:skills scope.
contributes.ai.context
object[] · optional · at most 3 entries
Providers the host calls to put your data in front of the assistant. Needs the ai:skills scope.
contributes.work
object · optional
The work destination this extension creates issues, pages or messages in. Needs the work:create and work:sync scopes.
contributes.work.container
object · required
Where items land, and how owners pick one.
contributes.work.fields
object · required
What a created item carries.
contributes.work.status
object · optional
How status travels back from your system.
contributes.work.status.map
object · required
Your status names, grouped into the three stages Tappify draws.
server
object · optional
Your own server: where the host calls it, and what it answers. Required once you declare a connector, a webhook, an assistant contribution, a work destination or a procedure.
server.procedures
record of object · optional · keys match ^[a-zA-Z][a-zA-Z0-9_-]{1,59}$
The procedures the host may call on your server, by name, each with its input and output schema. At most 30.
telemetry
string[] · optional · at most 20 entries · each pattern ^[a-z][a-z0-9_]*$ · each at most 60 characters
The telemetry names this extension may report. tap.telemetry.event rejects a name that is not declared here.