Skip to main content
Every field 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.

listing

object · optional What owners read on your Tap Store listing page. A public extension needs all five fields.

pricing

never · optional Reserved. Tappify sets pricing outside the manifest, so a manifest that carries this field fails validation.

score

never · optional Reserved. Tappify computes the quality score, so a manifest that carries this field fails validation.