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

Connect SendGrid with an API key. The source writes 6 fixed tables under `titan.sendgrid`.
```sql
select
  id,
  email,
  first_name
from titan.sendgrid.contacts
limit 10
```

## Connect SendGrid

1. Open **Apps**, choose **Connect app**, and select **SendGrid**.
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

Contacts, lists, campaigns, email templates, suppressions, and global unsubscribes 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

### `contacts`

`titan.sendgrid.contacts` has 9 source columns.

```columns table=sendgrid.contacts
id                                      string pk           Source field `id`.
email                                   string              Source field `email`.
first_name                              string              Source field `firstName`.
last_name                               string              Source field `lastName`.
city                                    string              Source field `city`.
country                                 string              Source field `country`.
created_at                              datetime            Source field `createdAt`.
updated_at                              datetime            Source field `updatedAt`.
custom_fields                           json                Source field `customFields`.
```

### `lists`

`titan.sendgrid.lists` has 5 source columns.

```columns table=sendgrid.lists
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
contact_count                           integer             Source field `contactCount`.
created_at                              datetime            Source field `createdAt`.
updated_at                              datetime            Source field `updatedAt`.
```

### `campaigns`

`titan.sendgrid.campaigns` has 6 source columns.

```columns table=sendgrid.campaigns
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
status                                  string              Source field `status`.
send_at                                 datetime            Source field `sendAt`.
created_at                              datetime            Source field `createdAt`.
updated_at                              datetime            Source field `updatedAt`.
```

### `templates`

`titan.sendgrid.templates` has 4 source columns.

```columns table=sendgrid.templates
id                                      string pk           Source field `id`.
name                                    string              Source field `name`.
generation                              string              Source field `generation`.
updated_at                              datetime            Source field `updatedAt`.
```

### `suppressions`

`titan.sendgrid.suppressions` has 4 source columns.

```columns table=sendgrid.suppressions
email                                   string pk           Source field `email`.
reason                                  string              Source field `reason`.
status                                  string              Source field `status`.
created_at                              datetime            Source field `createdAt`.
```

### `global_unsubscribes`

`titan.sendgrid.global_unsubscribes` has 2 source columns.

```columns table=sendgrid.global_unsubscribes
email                                   string pk           Source field `email`.
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`.
