Contacts, Calendar & Labels
Contacts
Contacts
CRUD operations for contacts and contact emails via /contacts/v4.
Operations
Get Contacts
// Single contact by ID
contact, err := c.GetContact(ctx, contactID)
// Count contacts
count, err := c.CountContacts(ctx)
// Paginated listing
contacts, err := c.GetContacts(ctx, page, pageSize)
// Auto-paginating - get all
allContacts, err := c.GetAllContacts(ctx)
// Auto-paginating with custom page size
allContacts, err := c.GetAllContactsPaged(ctx, pageSize)
Search by Email
// Count matches
count, err := c.CountContactEmails(ctx, "user@example.com")
// Paginated search
emails, err := c.GetContactEmails(ctx, "user@example.com", page, pageSize)
// Get all matching
allEmails, err := c.GetAllContactEmails(ctx, "user@example.com")
Create / Update / Delete
// Bulk create with overwrite and label options
results, err := c.CreateContacts(ctx, proton.CreateContactsReq{
Contacts: []proton.Contact{
{
Cards: []proton.ContactCard{...},
Email: "user@example.com",
},
},
})
// Update a contact
updated, err := c.UpdateContact(ctx, contactID, proton.UpdateContactReq{
Cards: []proton.ContactCard{...},
})
// Bulk delete
err := c.DeleteContacts(ctx, proton.DeleteContactsReq{
IDs: []string{id1, id2},
})
Per-Contact Encryption Preferences
Contact settings are stored as VCard-embedded X-PM-* fields:
// Get encryption settings for a contact
settings := contact.GetSettings()
// Returns: MIME type, PGP scheme (inline/MIME), sign/encrypt flags, PGP keys
// Set encryption settings
contact.SetSettings(proton.ContactSettings{
MIMEType: "text/plain",
Scheme: proton.PGPMIMEScheme,
Sign: true,
Encrypt: true,
EncryptUntrusted: true,
PGPKeys: []proton.PGPKey{...},
})
Key Types
| Type | Description |
|---|---|
Contact |
Composite of ContactMetadata and ContactCards |
ContactMetadata |
ID, name, UID, size, timestamps, emails, labels |
ContactCards |
VCard data for the contact |
ContactEmail |
Email entry with ID, name, email string, type tags, contactID, labels |
ContactSettings |
Per-contact encryption preferences (MIME type, scheme, sign/encrypt flags, PGP keys) |
RecipientType |
Internal vs external recipient classification |
Calendar
Calendar
Calendar and calendar event retrieval via /calendar/v1. Includes key management for encrypted calendar data.
Operations
Calendars
// List all calendars
calendars, err := c.GetCalendars(ctx)
// Get a single calendar
cal, err := c.GetCalendar(ctx, calendarID)
// Get encryption keys for a calendar
keys, err := c.GetCalendarKeys(ctx, calendarID)
// Get shared calendar members
members, err := c.GetCalendarMembers(ctx, calendarID)
// Get passphrase for calendar key decryption
passphrase, err := c.GetCalendarPassphrase(ctx, calendarID)
Calendar Events
// Count events
count, err := c.CountCalendarEvents(ctx, calendarID)
// Paginated listing with optional filters
events, err := c.GetCalendarEvents(ctx, calendarID, page, pageSize, filter)
// Auto-paginating - get all events
allEvents, err := c.GetAllCalendarEvents(ctx, calendarID, filter)
// Single event by ID
event, err := c.GetCalendarEvent(ctx, calendarID, eventID)
Decryption
Calendar events use two-layer encryption:
- Calendar keys (passphrase-locked)
- Shared events add a second layer of sharing key packets
// Unlock calendar keys with passphrase
keyRing, err := keys.Unlock(passphrase)
// Decrypt individual event parts
decoded, err := eventPart.Decode(calKR, addrKR, keyPacket)
// Handles both two-layer decryption and PGP signature verification
Key Types
| Type | Description |
|---|---|
Calendar |
ID, name, description, color, display flag, type (normal/subscribed), flags |
CalendarKey |
Encrypted private key with Unlock(passphrase) returning *crypto.Key |
CalendarKeys |
Slice of keys with Unlock(passphrase) returning *crypto.KeyRing |
CalendarMember |
ID, permissions, email, color, display, calendarID |
CalendarPassphrase |
Encrypted passphrase with Decrypt(memberID, addrKR) for decryption |
CalendarEvent |
UID, start/end times, timezone, full-day flag, author, attendees, encrypted parts |
CalendarEventPart |
Individual part with type (clear/encrypted/signed), data, signature, author |
EventAction |
Delete, Create, Update, UpdateFlags |
PGP Signature Verification
Encrypted calendar parts can also be signed. The Decode method verifies signatures using the address keyring.
Labels & Addresses
Labels
Label (category/folder) management via /core/v4/labels.
Operations
// Fetch labels filtered by type(s)
labels, err := c.GetLabels(ctx, proton.LabelLabel, proton.LabelFolder)
// Find a specific label by ID
label, err := c.GetLabel(ctx, labelID, proton.LabelLabel)
// Create a label
label, err := c.CreateLabel(ctx, proton.CreateLabelReq{
Name: "Personal",
Color: "#ff0000",
Type: proton.LabelLabel,
Parent: parentID,
})
// Update a label
err := c.UpdateLabel(ctx, labelID, proton.UpdateLabelReq{
Name: "Updated Name",
Color: "#00ff00",
})
// Delete a label
err := c.DeleteLabel(ctx, labelID)
System Label Constants
| Constant | ID | Description |
|---|---|---|
InboxLabel |
"0" | Inbox |
AllSentLabel |
"2" | All Sent |
TrashLabel |
"3" | Trash |
SpamLabel |
"4" | Spam |
AllMailLabel |
"5" | All Mail |
StarredLabel |
"10" | Starred |
Email Addresses
Email address management via /core/v4/addresses.
Operations
// List addresses (sorted by order)
addresses, err := c.GetAddresses(ctx)
// Get a single address
addr, err := c.GetAddress(ctx, addressID)
// Reorder addresses
err := c.OrderAddresses(ctx, proton.OrderAddressesReq{...})
// Enable/disable address
err := c.EnableAddress(ctx, addressID)
err := c.DisableAddress(ctx, addressID)
// Delete address
err := c.DeleteAddress(ctx, addressID)
Address Types
| Type | Description |
|---|---|
Original |
Original Proton address |
Alias |
Proton alias |
Custom |
Custom domain address |
Premium |
Premium address |
External |
Bring Your Own Email (BYOE) |
BYOE Detection
if addr.IsBYOEAddress() {
// External type with sending enabled
}
Key Types
| Type | Description |
|---|---|
Label |
ID, parentID, name, path ([]string), color, type |
LabelType |
Label, ContactGroup, Folder, System |
Address |
ID, email, send/receive flags, status, type, order, display name, keys |
AddressStatus |
Disabled, enabled, deleting |
AddressType |
Original, alias, custom, premium, external |
Path Handling
The API sends label path as a string (e.g., "Inbox/SubFolder"), which is split into a []string slice for Go use, with custom MarshalJSON/UnmarshalJSON.