Skip to content

Log an email

email.log(EmailLogParams**kwargs) -> EmailLogResponse
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
fields: Fields

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_: str

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

sent_at: str

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

bcc: Optional[Sequence[str]]

Bcc-recipient addresses.

body: Optional[FieldsBody]

The email body. Pass whichever parts you have.

html: Optional[str]

The HTML part of the email.

text: Optional[str]

The plain-text part of the email.

cc: Optional[Sequence[str]]

Cc-recipient addresses.

privacy_setting: Optional[Literal["FULL", "METADATA"]]

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:
"FULL"
"METADATA"
subject: Optional[str]

The email subject line.

thread_id: Optional[str]

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

minLength1
to: Optional[Sequence[str]]

To-recipient addresses.

auto_create_records: Optional[bool]

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

headers: Optional[Dict[str, str]]

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
class EmailLogResponse: …
id: str

Unique identifier for the entity.

access_level: Literal["FULL", "METADATA"]

The caller’s resolved access level for this email.

One of the following:
"FULL"
"METADATA"
created_at: str

ISO 8601 timestamp of when the entity was created.

fields: Dict[str, Fields]

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

value: Optional[FieldsValue]

The field value, or null if unset.

One of the following:
str
float
bool
List[str]
class FieldsValueAddress: …
city: Optional[str]

City name.

country: Optional[str]

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

latitude: Optional[float]

Latitude coordinate.

longitude: Optional[float]

Longitude coordinate.

postal_code: Optional[str]

Postal or ZIP code.

state: Optional[str]

State or province.

street: Optional[str]

Street address line 1.

street2: Optional[str]

Street address line 2.

class FieldsValueFullName: …
first_name: Optional[str]

The contact’s first name.

last_name: Optional[str]

The contact’s last name.

value_type: Literal["ADDRESS", "CHECKBOX", "CURRENCY", 12 more]

The data type of the field.

One of the following:
"ADDRESS"
"CHECKBOX"
"CURRENCY"
"DATETIME"
"EMAIL"
"FULL_NAME"
"MARKDOWN"
"MULTI_SELECT"
"NUMBER"
"SINGLE_SELECT"
"SOCIAL_HANDLE"
"TELEPHONE"
"TEXT"
"URL"
"HTML"
object_type: Literal["email"]

Always email.

relationships: Dict[str, Relationships]

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: str

Whether the relationship is has_one or has_many.

object_type: str

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

values: List[str]

IDs of the related entities.

directions: Optional[RelationshipsDirections]

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

as_destination: RelationshipsDirectionsAsDestination

The current record is the destination (incoming) endpoint.

cardinality: Literal["HAS_ONE", "HAS_MANY"]

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
"HAS_ONE"
"HAS_MANY"
values: List[str]

IDs of the related entities in this direction.

as_source: RelationshipsDirectionsAsSource

The current record is the source (outgoing) endpoint.

cardinality: Literal["HAS_ONE", "HAS_MANY"]

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
"HAS_ONE"
"HAS_MANY"
values: List[str]

IDs of the related entities in this direction.

updated_at: Optional[str]

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

external_id: Optional[str]

External identifier for the entity, or null if unset.

Log an email

from lightfield import Lightfield

client = Lightfield(
    api_key="My API Key",
)
email_log_response = client.email.log(
    fields={
        "from_": "$from",
        "sent_at": "$sentAt",
    },
)
print(email_log_response.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"
}