---
title: Canny
description: Connect Canny, understand its sync behavior, and query every table and column it writes.
species: reference
---
# Canny

Connect Canny with an API key. The source writes 8 fixed tables under `titan.canny`.
```sql
select
  id,
  name,
  created
from titan.canny.boards
limit 10
```

## Connect Canny

1. Open **Apps**, choose **Connect app**, and select **Canny**.
2. Enter an API key.
3. Review the tables, then save the source.
4. Watch **Sync history** until the first run completes.

Credentials are stored as secrets. They never become lake columns or appear in query results.

## Sync behavior

Boards, posts, votes, comments, users, changelog entries, tags, and status changes sync together.

A new source syncs when you connect it and then follows its schedule. The default recurring interval is 4 hours. An interrupted run keeps its completed progress and retries safely.

Every lake table also has the [system columns](/v2/docs/concepts/your-lake#the-system-columns) `_synced_at` and `_deleted`; the column reference below lists source columns only.

## Table reference

### `boards`

`titan.canny.boards` has 5 source columns.

```columns table=canny.boards
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
created                                 datetime            Source field `created`.
url                                     string              Source field `url`.
post_count                              integer             Source field `postCount`.
```

### `posts`

`titan.canny.posts` has 9 source columns.

```columns table=canny.posts
id                                      string pk           Source field `id`.
title                                   string              Source field `title`.
details                                 string              Source field `details`.
status                                  string              Source field `status`.
score                                   integer             Source field `score`.
comment_count                           integer             Source field `commentCount`.
author_id                               string              Source field `authorID`.
board_id                                string              Source field `boardID`.
created                                 datetime            Source field `created`.
```

### `votes`

`titan.canny.votes` has 4 source columns.

```columns table=canny.votes
id                                      string pk           Source field `id`.
post_id                                 string              Source field `postID`.
voter_id                                string              Source field `voterID`.
created                                 datetime            Source field `created`.
```

### `comments`

`titan.canny.comments` has 5 source columns.

```columns table=canny.comments
id                                      string pk           Source field `id`.
post_id                                 string              Source field `postID`.
author_id                               string              Source field `authorID`.
value                                   string              Source field `value`.
created                                 datetime            Source field `created`.
```

### `users`

`titan.canny.users` has 5 source columns.

```columns table=canny.users
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
email                                   string              Source field `email`.
created                                 datetime            Source field `created`.
user_id                                 string              Source field `userID`.
```

### `changelog_entries`

`titan.canny.changelog_entries` has 4 source columns.

```columns table=canny.changelog_entries
id                                      string pk           Source field `id`.
title                                   string              Source field `title`.
status                                  string              Source field `status`.
published_at                            datetime            Source field `publishedAt`.
```

### `tags`

`titan.canny.tags` has 4 source columns.

```columns table=canny.tags
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
board_id                                string              Source field `boardID`.
created                                 datetime            Source field `created`.
```

### `status_changes`

`titan.canny.status_changes` has 5 source columns.

```columns table=canny.status_changes
id                                      string pk           Source field `id`.
post_id                                 string              Source field `postID`.
status                                  string              Source field `status`.
changer_id                              string              Source field `changerID`.
created                                 datetime            Source field `created`.
```

## Deletes and history

Rows are merged by their source key. When the source can prove that a row was deleted, Supernova keeps the row and sets `_deleted` so queries can choose whether to include history. Filter current-state queries with `where not _deleted`.
