Curiosity

Gmail

Ingests Gmail threads, messages, attachments, and contacts using the Gmail API history ID mechanism for incremental sync. Can also send mail from the workspace.

variant=info text="Email" variant=success text="OAuth" variant=success text="Maps ACLs" variant=primary text="Can send"

What gets ingested

Element Mapped to
Thread _Thread
Message _Message (subject, body, headers, labels)
Attachment _FileEntry + _Blob
Folder / label _Folder
Sender / recipient address books _Contact

Authentication

  • Type: OAuth 2.0 against Google (per-user).
  • Scopes requested:
    • https://www.googleapis.com/auth/gmail.modify (read + label management)
    • https://www.googleapis.com/auth/contacts.readonly
    • https://www.googleapis.com/auth/contacts.other.readonly
    • https://www.googleapis.com/auth/userinfo.email
    • https://www.googleapis.com/auth/userinfo.profile

Access control mapping

Source Carried into the graph?
Per-user mailbox Yes — each connected user is the sole owner of their messages and attachments.
Shared mailboxes Not supported — each user connects independently.

Sync cadence

  • Default cron: every 15 minutes.
  • Incremental sync: Gmail History API (users.history.list?startHistoryId=...). The connector tracks two cursors per user:
    • historyId for messages/labels
    • A separate sync token for the contact directory
flowchart LR Conn[Connector] -->|history.list| Gmail[(Gmail)] Gmail -->|nextHistoryId| Conn Conn -->|persist| State[(User cursors)] State --> NextRun[Next run] Conn -.->|when expired| FullSync[Force full sync]

Notable

  • Implements IEmailTask so the workspace can use Gmail as the outbound mailer (chosen per-user).
  • Token expiry is tracked centrally; users with expired credentials get a re-auth prompt in the integrations UI.