> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tappify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# TappifyHandlerOptions

> The routes and settings createTappifyHandler builds a fetch handler from.

The routes and settings `createTappifyHandler` builds a fetch handler from.

## Remarks

The `tools`, `actions` and `procedures` tables are keyed by the names the
augmentation `tappify extension types` writes, so a handler for an undeclared
name does not compile. `events` is keyed by Tappify's own event catalogue and
`work` by the fixed set of work operations; `mentions` and `context` take any id.
A route Tappify calls with no handler registered answers 404 with
`TAP_HANDLER_MISSING`. Export this object as well as the handler: the testing
entry's `createTestClient` takes the options, not the built handler.

## Properties

### actions?

```ts theme={null}
optional actions?: {
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined;
};
```

One handler per declared action, answering `POST /tappify/actions/<id>`.

#### Index Signature

```ts theme={null}
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined
```

***

### basePath?

```ts theme={null}
optional basePath?: string;
```

The prefix your framework mounts the handler under, such as `/api`.

***

### context?

```ts theme={null}
optional context?: Record<string, TappifyRouteHandler<undefined, ContextBlock, unknown>>;
```

One handler per declared context block, answering `GET /tappify/context/<id>`.

***

### events?

```ts theme={null}
optional events?: {
  approval.requested?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  digest.sent?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  featuring.started?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  incident.opened?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  incident.resolved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  install.created?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  install.paused?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  install.resumed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  install.revoked?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  install.token_rotated?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  keyword.set_changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  metadata.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  playbook.step_approved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  price.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  release.shipped?: TappifyRouteHandler<undefined, void, {
     build: string;
     version: string;
  }>;
  review.thread_opened?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  review.thread_resolved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  scopes.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  score.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  screenshots.updated?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
  settings.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
};
```

One handler per Tappify event you subscribe to; each answers 204.

##### approval.requested?

```ts theme={null}
optional approval.requested?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### digest.sent?

```ts theme={null}
optional digest.sent?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### featuring.started?

```ts theme={null}
optional featuring.started?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### incident.opened?

```ts theme={null}
optional incident.opened?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### incident.resolved?

```ts theme={null}
optional incident.resolved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### install.created?

```ts theme={null}
optional install.created?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### install.paused?

```ts theme={null}
optional install.paused?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### install.resumed?

```ts theme={null}
optional install.resumed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### install.revoked?

```ts theme={null}
optional install.revoked?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### install.token\_rotated?

```ts theme={null}
optional install.token_rotated?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### keyword.set\_changed?

```ts theme={null}
optional keyword.set_changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### metadata.changed?

```ts theme={null}
optional metadata.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### playbook.step\_approved?

```ts theme={null}
optional playbook.step_approved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### price.changed?

```ts theme={null}
optional price.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### release.shipped?

```ts theme={null}
optional release.shipped?: TappifyRouteHandler<undefined, void, {
  build: string;
  version: string;
}>;
```

##### review\.thread\_opened?

```ts theme={null}
optional review.thread_opened?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### review\.thread\_resolved?

```ts theme={null}
optional review.thread_resolved?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### scopes.changed?

```ts theme={null}
optional scopes.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### score.changed?

```ts theme={null}
optional score.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### screenshots.updated?

```ts theme={null}
optional screenshots.updated?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

##### settings.changed?

```ts theme={null}
optional settings.changed?: TappifyRouteHandler<undefined, void, Record<string, unknown>>;
```

***

### extensionId

```ts theme={null}
extensionId: string;
```

The `id` from the manifest, which the install token's audience has to match.

***

### health?

```ts theme={null}
optional health?: () => 
  | TappifyHealth
| Promise<TappifyHealth>;
```

Answers `GET /tappify/health`. Left out, the route answers `{ ok: true }`.

#### Returns

\| [`TappifyHealth`](/extensions/reference/server-api/Interface.TappifyHealth)
\| `Promise`\<[`TappifyHealth`](/extensions/reference/server-api/Interface.TappifyHealth)>

***

### jwks?

```ts theme={null}
optional jwks?: JSONWebKeySet;
```

A key set to verify against, which skips the fetch. For tests.

***

### jwksUrl?

```ts theme={null}
optional jwksUrl?: string;
```

Where to fetch the signing keys. Defaults to `DEFAULT_JWKS_URL`.

***

### mentions?

```ts theme={null}
optional mentions?: Record<string, TappifyRouteHandler<{
  q: string;
}, MentionItems, unknown>>;
```

One handler per declared mention, answering `GET /tappify/mentions/<id>?q=`.

***

### metrics?

```ts theme={null}
optional metrics?: TappifyRouteHandler<MetricsInput, MetricsResponse, unknown>;
```

Answers `POST /tappify/metrics` for a connector contribution.

***

### procedures?

```ts theme={null}
optional procedures?: {
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined;
};
```

One handler per declared procedure, which is what `useTapServer` calls.

#### Index Signature

```ts theme={null}
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined
```

***

### tools?

```ts theme={null}
optional tools?: {
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined;
};
```

One handler per declared tool, answering `POST /tappify/tools/<id>`.

#### Index Signature

```ts theme={null}
[key: string]: 
  | TappifyRouteHandler<unknown, unknown, unknown>
  | undefined
```

***

### work?

```ts theme={null}
optional work?: {
  attach?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
  comment?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
  create?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
  list_containers?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
  resolve?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
  status?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
};
```

One handler per work operation, answering `POST /tappify/work/<operation>`.

#### attach?

```ts theme={null}
optional attach?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```

#### comment?

```ts theme={null}
optional comment?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```

#### create?

```ts theme={null}
optional create?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```

#### list\_containers?

```ts theme={null}
optional list_containers?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```

#### resolve?

```ts theme={null}
optional resolve?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```

#### status?

```ts theme={null}
optional status?: TappifyRouteHandler<Record<string, unknown>, unknown, unknown>;
```
