Skip to content

Log an email

client.Email.Log(ctx, body) (*EmailLogResponse, error)
POST/v1/emails/log

Logs an email that no connected account will sync, such as history from a previous CRM or a mailbox export. The email appears on account, contact, and opportunity timelines at $sentAt and threads with related emails. $sentAt must be in the past, and at least one participant must be a workspace member and one must be external.

The Message-ID header (or a generated one) identifies the email. If an email with the same Message-ID already exists, the request returns 409 and writes nothing. Group emails into threads with $threadId, or pass In-Reply-To and References in headers.

Privacy defaults to the most permissive setting among the participants’ connected accounts, else METADATA. Set $privacySetting to override it. Logging an email never sends it, never cancels a sequence enrollment, and creates records only when autoCreateRecords is true. Filter out personal and non-sales mail before logging.

Supports idempotency via the Idempotency-Key header.

Required scope: emails:create

Rate limit category: Write

ParametersExpand Collapse
body EmailLogParams
Fields param.Field[EmailLogParamsFields]

Field values for the logged email. System fields use a $ prefix. Required: $sentAt and $from, plus at least one recipient across $to, $cc, and $bcc.

From string

The sender address. This field accepts a single email address.

SentAt string

When the email was sent, in ISO 8601 format. Must be in the past.

Bcc []stringOptional

Bcc-recipient addresses.

Body EmailLogParamsFieldsBodyOptional

The email body. Pass whichever parts you have.

HTML stringOptional

The HTML part of the email.

Text stringOptional

The plain-text part of the email.

Cc []stringOptional

Cc-recipient addresses.

PrivacySetting stringOptional

The privacy setting for the email (FULL or METADATA). Defaults to the most permissive setting among the participants’ connected accounts, else METADATA.

One of the following:
const EmailLogParamsFieldsPrivacySettingFull EmailLogParamsFieldsPrivacySetting = "FULL"
const EmailLogParamsFieldsPrivacySettingMetadata EmailLogParamsFieldsPrivacySetting = "METADATA"
Subject stringOptional

The email subject line.

ThreadID stringOptional

Any stable grouping key. Emails with the same value share a thread. Overrides threading derived from headers.

minLength1
To []stringOptional

To-recipient addresses.

AutoCreateRecords param.Field[bool]Optional

When true, the post-create sync may create account and contact records for unknown external participants.

Headers param.Field[map[string, string]]Optional

Raw RFC 5322 headers, passed through as read (any key case). Only Message-ID, In-Reply-To, and References are used. At most 64 KB.

ReturnsExpand Collapse
type EmailLogResponse struct{…}
ID string

Unique identifier for the entity.

AccessLevel EmailLogResponseAccessLevel

The caller’s resolved access level for this email.

One of the following:
const EmailLogResponseAccessLevelFull EmailLogResponseAccessLevel = "FULL"
const EmailLogResponseAccessLevelMetadata EmailLogResponseAccessLevel = "METADATA"
CreatedAt string

ISO 8601 timestamp of when the entity was created.

Fields map[string, EmailLogResponseField]

Map of field names to their typed values. System fields are prefixed with $ (e.g. $name, $email); custom attributes use their bare slug.

Value EmailLogResponseFieldValueUnion

The field value, or null if unset.

One of the following:
string
float64
bool
type EmailLogResponseFieldValueArray []string
type EmailLogResponseFieldValueAddress struct{…}
City stringOptional

City name.

Country stringOptional

2-letter ISO 3166-1 alpha-2 country code.

Latitude float64Optional

Latitude coordinate.

Longitude float64Optional

Longitude coordinate.

PostalCode stringOptional

Postal or ZIP code.

State stringOptional

State or province.

Street stringOptional

Street address line 1.

Street2 stringOptional

Street address line 2.

type EmailLogResponseFieldValueFullName struct{…}
FirstName stringOptional

The contact’s first name.

LastName stringOptional

The contact’s last name.

ValueType string

The data type of the field.

One of the following:
const EmailLogResponseFieldValueTypeAddress EmailLogResponseFieldValueType = "ADDRESS"
const EmailLogResponseFieldValueTypeCheckbox EmailLogResponseFieldValueType = "CHECKBOX"
const EmailLogResponseFieldValueTypeCurrency EmailLogResponseFieldValueType = "CURRENCY"
const EmailLogResponseFieldValueTypeDatetime EmailLogResponseFieldValueType = "DATETIME"
const EmailLogResponseFieldValueTypeEmail EmailLogResponseFieldValueType = "EMAIL"
const EmailLogResponseFieldValueTypeFullName EmailLogResponseFieldValueType = "FULL_NAME"
const EmailLogResponseFieldValueTypeMarkdown EmailLogResponseFieldValueType = "MARKDOWN"
const EmailLogResponseFieldValueTypeMultiSelect EmailLogResponseFieldValueType = "MULTI_SELECT"
const EmailLogResponseFieldValueTypeNumber EmailLogResponseFieldValueType = "NUMBER"
const EmailLogResponseFieldValueTypeSingleSelect EmailLogResponseFieldValueType = "SINGLE_SELECT"
const EmailLogResponseFieldValueTypeSocialHandle EmailLogResponseFieldValueType = "SOCIAL_HANDLE"
const EmailLogResponseFieldValueTypeTelephone EmailLogResponseFieldValueType = "TELEPHONE"
const EmailLogResponseFieldValueTypeText EmailLogResponseFieldValueType = "TEXT"
const EmailLogResponseFieldValueTypeURL EmailLogResponseFieldValueType = "URL"
const EmailLogResponseFieldValueTypeHTML EmailLogResponseFieldValueType = "HTML"
ObjectType EmailLogResponseObjectType

Always email.

Relationships map[string, EmailLogResponseRelationship]

Map of relationship names to their associated entities. System relationships are prefixed with $ (e.g. $owner, $contact). A self-referential relationship keeps its merged values and includes optional directional values. List filters select the current record’s role with :asSource or :asDestination, for example ?parent:asSource[contains]=account_id.

Cardinality string

Whether the relationship is has_one or has_many.

ObjectType string

The type of the related object (e.g. account, contact).

Values []string

IDs of the related entities.

Directions EmailLogResponseRelationshipDirectionsOptional

Directional values for a self-referential relationship. List filters use the relationship key with :asSource or :asDestination; writes continue to use the bare key.

AsDestination EmailLogResponseRelationshipDirectionsAsDestination

The current record is the destination (incoming) endpoint.

Cardinality string

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
const EmailLogResponseRelationshipDirectionsAsDestinationCardinalityHasOne EmailLogResponseRelationshipDirectionsAsDestinationCardinality = "HAS_ONE"
const EmailLogResponseRelationshipDirectionsAsDestinationCardinalityHasMany EmailLogResponseRelationshipDirectionsAsDestinationCardinality = "HAS_MANY"
Values []string

IDs of the related entities in this direction.

AsSource EmailLogResponseRelationshipDirectionsAsSource

The current record is the source (outgoing) endpoint.

Cardinality string

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
const EmailLogResponseRelationshipDirectionsAsSourceCardinalityHasOne EmailLogResponseRelationshipDirectionsAsSourceCardinality = "HAS_ONE"
const EmailLogResponseRelationshipDirectionsAsSourceCardinalityHasMany EmailLogResponseRelationshipDirectionsAsSourceCardinality = "HAS_MANY"
Values []string

IDs of the related entities in this direction.

UpdatedAt string

ISO 8601 timestamp of when the entity was last updated, or null.

ExternalID stringOptional

External identifier for the entity, or null if unset.

Log an email

package main

import (
  "context"
  "fmt"

  "github.com/Lightfld/lightfield-go"
  "github.com/Lightfld/lightfield-go/option"
)

func main() {
  client := githubcomlightfldlightfieldgo.NewClient(
    option.WithAPIKey("My API Key"),
  )
  emailLogResponse, err := client.Email.Log(context.TODO(), githubcomlightfldlightfieldgo.EmailLogParams{
    Fields: githubcomlightfldlightfieldgo.EmailLogParamsFields{
      From: "$from",
      SentAt: "$sentAt",
    },
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", emailLogResponse.ID)
}
{
  "id": "eml_cm0abc456def789",
  "accessLevel": "FULL",
  "createdAt": "2026-05-01T09:00:00.000Z",
  "fields": {
    "$subject": {
      "value": "Following up on our chat",
      "valueType": "TEXT"
    },
    "$sentAt": {
      "value": "2026-05-01T08:30:00.000Z",
      "valueType": "DATETIME"
    },
    "$from": {
      "value": [
        "sales@acme.com"
      ],
      "valueType": "EMAIL"
    },
    "$to": {
      "value": [
        "lead@example.com"
      ],
      "valueType": "EMAIL"
    },
    "$cc": {
      "value": [
        "string"
      ],
      "valueType": "EMAIL"
    },
    "$bcc": {
      "value": [
        "string"
      ],
      "valueType": "EMAIL"
    },
    "$privacySetting": {
      "value": "string",
      "valueType": "TEXT"
    },
    "$body": {
      "value": "<p>Hi there,</p><p>Following up on our chat earlier this week.</p>",
      "valueType": "HTML"
    }
  },
  "httpLink": null,
  "objectType": "email",
  "relationships": {
    "$account": {
      "cardinality": "has_many",
      "objectType": "account",
      "values": [
        "acc_cm4stu901uvw234"
      ],
      "directions": {
        "asDestination": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        },
        "asSource": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        }
      }
    },
    "$contact": {
      "cardinality": "has_many",
      "objectType": "contact",
      "values": [
        "con_cm2ghi789jkl012"
      ],
      "directions": {
        "asDestination": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        },
        "asSource": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        }
      }
    }
  },
  "updatedAt": "2026-05-01T10:00:00.000Z",
  "externalId": "externalId"
}
Returns Examples
{
  "id": "eml_cm0abc456def789",
  "accessLevel": "FULL",
  "createdAt": "2026-05-01T09:00:00.000Z",
  "fields": {
    "$subject": {
      "value": "Following up on our chat",
      "valueType": "TEXT"
    },
    "$sentAt": {
      "value": "2026-05-01T08:30:00.000Z",
      "valueType": "DATETIME"
    },
    "$from": {
      "value": [
        "sales@acme.com"
      ],
      "valueType": "EMAIL"
    },
    "$to": {
      "value": [
        "lead@example.com"
      ],
      "valueType": "EMAIL"
    },
    "$cc": {
      "value": [
        "string"
      ],
      "valueType": "EMAIL"
    },
    "$bcc": {
      "value": [
        "string"
      ],
      "valueType": "EMAIL"
    },
    "$privacySetting": {
      "value": "string",
      "valueType": "TEXT"
    },
    "$body": {
      "value": "<p>Hi there,</p><p>Following up on our chat earlier this week.</p>",
      "valueType": "HTML"
    }
  },
  "httpLink": null,
  "objectType": "email",
  "relationships": {
    "$account": {
      "cardinality": "has_many",
      "objectType": "account",
      "values": [
        "acc_cm4stu901uvw234"
      ],
      "directions": {
        "asDestination": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        },
        "asSource": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        }
      }
    },
    "$contact": {
      "cardinality": "has_many",
      "objectType": "contact",
      "values": [
        "con_cm2ghi789jkl012"
      ],
      "directions": {
        "asDestination": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        },
        "asSource": {
          "cardinality": "HAS_ONE",
          "values": [
            "string"
          ]
        }
      }
    }
  },
  "updatedAt": "2026-05-01T10:00:00.000Z",
  "externalId": "externalId"
}