---
title: Lightfield API Integration on Truto
slug: lightfield
category: CRM
canonical: "https://truto.one/integrations/detail/lightfield/"
---

# Lightfield API Integration on Truto



**Category:** CRM  
**Status:** Beta

## MCP-ready AI tools

Truto exposes 87 tools for Lightfield that AI agents can call directly.

- **lightfield_auth_validate** — Validate the current lightfield API key and confirm it is active before making scoped API requests. Returns: id, createdAt, fields, httpLink. Takes no parameters beyond authentication.
- **lightfield_accounts_get_definitions** — Get the field and relationship definitions available on Lightfield accounts, covering both system-defined and custom fields. Returns: fieldDefinitions, objectType, relationshipDefinitions. Useful for discovering field keys, select options, and relationship cardinalities before creating or updating records. Takes no parameters.
- **lightfield_accounts_list_field_history** — Get the value-change history for a single field on a Lightfield account, newest first, with consecutive identical values collapsed. Returns history entries with displayValue, value, valueType, isCreate, and recordedAt. Required: account_id, field_key. Only attribute-backed fields have history — column-backed system fields return an error.
- **create_a_lightfield_account** — Create a new Lightfield account record. Returns the created account including id, fields, relationships, createdAt, updatedAt, and httpLink. Required: fields (must include $name). Read-only: $howTheyMakeMoney and $accountStatus cannot be set; a $website improves background enrichment matching.
- **update_a_lightfield_account_by_id** — Update an existing Lightfield account by id; only the fields and relationships included in the request are modified. Returns the updated account including id, fields, relationships, createdAt, updatedAt, and httpLink. Required: id. Read-only: $howTheyMakeMoney and $accountStatus cannot be updated.
- **get_single_lightfield_account_by_id** — Get a single Lightfield account by id. Returns the account record including id, fields, relationships, createdAt, updatedAt, httpLink, and externalId. Required: id.
- **list_all_lightfield_accounts** — List Lightfield accounts, paginated (max 25 per page). Returns account records including id, createdAt, fields, httpLink, relationships, updatedAt, and externalId. Pass status=trashed to list accounts currently in the trash instead of live records.
- **delete_a_lightfield_account_by_id** — Delete a Lightfield account by id. The account is soft-deleted to the trash and can be restored later; associated contacts, tasks, and notes are untouched. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId). Required: id. No-op if the account is already in the trash.
- **lightfield_accounts_restore** — Restore a trashed Lightfield account back to active. Returns the restored account record including id, createdAt, fields, httpLink, relationships, and externalId. Required: account_id. No-op if the account is not trashed; find trashed accounts by listing with status=trashed.
- **lightfield_contacts_get_definitions** — Get the schema of all field and relationship definitions available on contacts in Lightfield, including both system-defined and custom fields. Returns: fieldDefinitions, relationshipDefinitions, objectType.
- **lightfield_contacts_list_field_history** — Get the value-change history for a single field on a Lightfield contact, newest first, with consecutive identical values collapsed. Returns: data, hasMore, nextCursor. Required: contact_id, field_key. Only attribute-backed fields have history; column-backed system fields return an error. Max 100 entries per page.
- **create_a_lightfield_contact** — Create a contact in Lightfield; it is automatically enriched in the background after creation. Returns the created contact with id, fields, relationships, httpLink, createdAt, updatedAt, and externalId. Required: fields. $name is an object { firstName, lastName }, not a plain string; use list filtering first to avoid duplicates.
- **update_a_lightfield_contact_by_id** — Update an existing Lightfield contact by id; only included fields and relationships are modified. Returns the updated contact with id, fields, relationships, httpLink, createdAt, updatedAt, and externalId. Required: id. $name is an object { firstName, lastName }, not a plain string.
- **get_single_lightfield_contact_by_id** — Get a single Lightfield contact by id. Returns the full contact record with id, fields, relationships, httpLink, createdAt, updatedAt, and externalId. Required: id.
- **list_all_lightfield_contacts** — List contacts in lightfield with pagination and trash-state filtering. Returns: id, createdAt, updatedAt, fields, httpLink, relationships, externalId. Pass status=trashed to list contacts currently in the trash (requires the contacts:restore scope).
- **delete_a_lightfield_contact_by_id** — Delete a contact in lightfield. Soft-deletes the contact by moving it to the trash, where it can be restored from the Lightfield UI; deleting an already-trashed contact is a no-op. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId). Required: id.
- **lightfield_contacts_restore** — Restore a trashed contact in lightfield, bringing it back to active. Restoring a contact that is not trashed is a no-op and returns the existing record. Returns the restored contact including id, createdAt, fields, updatedAt, and externalId. Required: contact_id.
- **create_a_lightfield_list** — Create a new list in Lightfield. Returns the created list including id, createdAt, fields, and httpLink. Requires fields.$name and fields.$objectType ($account, $contact, or $opportunity). Supports idempotency via the Idempotency-Key header.
- **update_a_lightfield_list_by_id** — Update a Lightfield list by id; only fields included in the request are modified. Returns the updated list including id, createdAt, fields, and httpLink. Required: id. Supports idempotency via the Idempotency-Key header.
- **get_single_lightfield_list_by_id** — Get a single Lightfield list by id. Returns the list record including id, createdAt, fields (typed values; system fields are $-prefixed), and httpLink. Required: id.
- **list_all_lightfield_lists** — List Lightfield lists with pagination. Returns list records including id, createdAt, fields, and httpLink. Max 25 per page.
- **lightfield_lists_list_accounts** — List the accounts that belong to a Lightfield list. Returns account records including id, createdAt, fields, relationships, updatedAt, and externalId. Required: list_id. Max 25 per page.
- **lightfield_lists_list_contacts** — List contacts that belong to a specific list in Lightfield. Returns a paginated array of contact records including id, createdAt, fields (typed field map), httpLink, relationships, updatedAt, and externalId. Required: list_id. Max 25 records per page.
- **lightfield_lists_list_opportunities** — List opportunities that belong to a specific list in Lightfield. Returns a paginated array of opportunity records including id, createdAt, fields (typed field map), httpLink, relationships, updatedAt, and externalId. Required: list_id. Max 25 records per page.
- **delete_a_lightfield_list_by_id** — Delete a Lightfield list by moving it to the trash; the list is soft-deleted and can be restored from the Lightfield UI, while its member entities are unaffected. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId). Required: id. Deleting an already-trashed list is a no-op that returns the existing record.
- **lightfield_meetings_get_definitions** — Get the field and relationship definitions for lightfield meetings. Returns: fieldDefinitions, objectType, relationshipDefinitions.
- **create_a_lightfield_meeting** — Create a past-dated meeting record in lightfield. Returns the created meeting with id, accessLevel, createdAt, fields, and relationships. Only the $transcript relationship is writable on create. Required: fields ($title, $startDate, $endDate); both times must be in the past.
- **update_a_lightfield_meeting_by_id** — Update an existing lightfield meeting by id. Only fields.$privacySetting and relationships.$transcript.replace are writable; clearing or removing $transcript is not supported. Returns: id, accessLevel, createdAt, updatedAt, fields, relationships, objectType, httpLink, externalId. Required: id.
- **get_single_lightfield_meeting_by_id** — Get a single lightfield meeting by id. Fields and transcript visibility are privacy-redacted per caller and the response includes a read-only accessLevel. Returns: id, accessLevel, createdAt, updatedAt, fields, relationships, objectType, httpLink, externalId. Required: id.
- **list_all_lightfield_meetings** — List lightfield meetings. Returns meeting records with id, accessLevel, createdAt, fields, and relationships; transcript or content fields may be redacted per caller. Pass status=trashed to list meetings currently in the trash. Max 25 per page.
- **delete_a_lightfield_meeting_by_id** — Delete a meeting in Lightfield by moving it to the trash; the soft-deleted meeting can be restored later. Returns the deleted record (id, accessLevel, createdAt, fields, relationships, updatedAt). Required: id. Deleting a meeting that is already trashed returns a 404.
- **lightfield_meetings_restore** — Restore a trashed meeting in Lightfield, bringing it back to active. Returns the restored meeting including id, accessLevel, createdAt, fields, and updatedAt. Required: meeting_id. Restoring a meeting that is not trashed is a no-op and returns the existing record.
- **lightfield_notes_get_definitions** — Get the note field and relationship definitions in lightfield. Useful for understanding the shape of note data before creating or updating records. Returns: error.
- **create_a_lightfield_note** — Create a new note in lightfield. The note author is automatically set to the API key owner. Returns the created note including id, createdAt, fields, httpLink, and relationships. Required: fields (with $title).
- **update_a_lightfield_note_by_id** — Update an existing lightfield note by id — only included fields and relationships are modified; omitted fields are left unchanged. Returns the updated note including id, fields, relationships, updatedAt, and httpLink. Required: id.
- **get_single_lightfield_note_by_id** — Get a single lightfield note by id. Returns the note including id, createdAt, fields, relationships, and httpLink. Required: id.
- **list_all_lightfield_notes** — List lightfield notes, paginated. Returns note records including id, createdAt, fields, relationships, and updatedAt. Pass status=trashed to list notes currently in the trash instead of live records.
- **delete_a_lightfield_note_by_id** — Delete a Lightfield note by moving it to the trash (soft-delete; the note can be restored from the Lightfield UI). Deleting an already-trashed note is a no-op that returns the existing record. Required: id. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId).
- **lightfield_notes_restore** — Restore a trashed Lightfield note, bringing it back to active. Restoring a note that is not trashed is a no-op and returns the existing record; trashed notes can be found by listing notes filtered to status=trashed. Returns the restored note record: id, createdAt, fields, httpLink, relationships, updatedAt, externalId. Required: note_id.
- **lightfield_opportunities_get_definitions** — Get the field and relationship definitions available on opportunities in Lightfield, covering both system-defined and custom fields. Returns: fieldDefinitions, objectType, relationshipDefinitions. Useful for understanding record shape before creating or updating opportunities.
- **lightfield_opportunities_list_field_history** — Get the value-change history for a single field on an opportunity, newest first, with consecutive identical values collapsed. Returns each entry with: value, valueType, displayValue, recordedAt, isCreate. Required: opportunity_id, field_key. Only attribute-backed fields have history; max 100 entries per page.
- **create_a_lightfield_opportunity** — Create a new opportunity in Lightfield. Returns the created record: id, createdAt, fields, relationships, httpLink, updatedAt, and externalId. Requires fields with $name and relationships with $account. Lightfield generates the opportunity summary in the background; $opportunityStatus is read-only and cannot be set via the API.
- **update_a_lightfield_opportunity_by_id** — Update an existing opportunity by id in Lightfield; only included fields and relationships are modified. Returns the updated record: id, createdAt, fields, relationships, httpLink, updatedAt, and externalId. Required: id. $opportunityStatus is read-only and cannot be updated.
- **get_single_lightfield_opportunity_by_id** — Get a single opportunity by id in Lightfield. Returns the opportunity record: id, createdAt, fields (map of typed field values), relationships, httpLink, updatedAt, and externalId. Required: id.
- **list_all_lightfield_opportunities** — List opportunities in Lightfield, paginated with offset and limit (max 25 per page, default 25). Filter by $field query parameters (e.g. ?$account=acc_123) and pass status=trashed to list records currently in the trash. Returns: id, createdAt, updatedAt, fields, httpLink, relationships, externalId. Optional: status.
- **delete_a_lightfield_opportunity_by_id** — Delete an opportunity in Lightfield by moving it to the trash (soft delete; it can be restored, and associated tasks, notes, and meetings are kept). Calling delete on an already-trashed opportunity is a no-op that returns the existing record. Required: id. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId).
- **lightfield_opportunities_restore** — Restore a trashed opportunity in Lightfield, bringing it back to active. Find trashed opportunities first via list with status=trashed. Calling restore on an opportunity that is not trashed is a no-op that returns the existing record. Returns: id, createdAt, updatedAt, fields, httpLink, relationships, externalId. Required: opportunity_id.
- **lightfield_tasks_get_definitions** — Get the field and relationship definitions available on tasks in Lightfield. Returns fieldDefinitions, objectType, and relationshipDefinitions — use it to discover the available system fields and relationship keys before creating or updating task records.
- **create_a_lightfield_task** — Create a new task in Lightfield. Returns the created task including id, fields, relationships, createdAt, and httpLink. Required: $title, $status, and $assignedTo. Supports idempotency via the Idempotency-Key header.
- **update_a_lightfield_task_by_id** — Update an existing task in Lightfield by id — only the included fields and relationships are modified. Returns the updated task including id, fields, relationships, updatedAt, and httpLink. Required: id. Supports idempotency via the Idempotency-Key header.
- **get_single_lightfield_task_by_id** — Retrieve a single task in Lightfield by id. Returns the task object including id, fields, relationships, createdAt, and httpLink. Required: id.
- **list_all_lightfield_tasks** — List tasks in Lightfield, paginated. Returns each task's id, fields, relationships, createdAt, and httpLink. Pass status=trashed to list tasks currently in the trash instead of live records.
- **delete_a_lightfield_task_by_id** — Delete a Lightfield task by id — the task is soft-deleted to the trash and can be restored later; deleting an already-trashed task is a no-op that returns the existing record. Required: id. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId).
- **lightfield_tasks_restore** — Restore a trashed Lightfield task back to active — restoring a task that is not trashed is a no-op that returns the existing record, and trashed tasks can be found via the tasks list with status=trashed. Returns: id, createdAt, fields, httpLink, relationships, updatedAt, externalId. Required: task_id.
- **get_single_lightfield_member_by_id** — Get a single Lightfield member by id. Returns the full member object including id, createdAt, fields ($email, $name, $profileImage, $role), httpLink, relationships, and updatedAt. Required: id.
- **list_all_lightfield_members** — List members in your Lightfield workspace. Returns each member's id, createdAt, fields ($email, $name, $profileImage, $role), httpLink, relationships, and updatedAt. Max 25 records per page.
- **get_single_lightfield_workflow_run_by_id** — Get the current status of a workflow run in lightfield. Returns the WorkflowRunStatusResponse with its status field (e.g. running, completed, failed). Required: id.
- **create_a_lightfield_file** — Create a file upload session in Lightfield. Returns the upload session object including id, filename, mimeType, sizeBytes, status, uploadUrl, and uploadHeaders. Requires filename, mimeType, and sizeBytes. Max 512 MB; after uploading the file bytes to uploadUrl, finalize with complete.
- **lightfield_files_complete** — Complete a Lightfield file upload after its bytes have been uploaded. Returns the file object including id, filename, mimeType, sizeBytes, status, createdAt, completedAt, and expiresAt. Required: file_id.
- **get_single_lightfield_file_by_id** — Get a single Lightfield file by id. Works for any retrievable file id, including ones returned in a CRM record's $files relationship. Returns the file object including id, filename, mimeType, sizeBytes, status, createdAt, completedAt, and expiresAt. Required: id.
- **list_all_lightfield_files** — List files in your Lightfield workspace. Returns the file object including id, filename, mimeType, sizeBytes, status, createdAt, completedAt, and expiresAt. Omits files uploaded through the app and synced chat attachments. Max 25 per page.
- **lightfield_files_get_url** — Get a temporary signed download URL for a Lightfield file. Returns: url, expiresAt. Only available for files in COMPLETED status; works for any retrievable file id, including files uploaded through the app. Required: file_id.
- **lightfield_files_cancel** — Cancel a pending file upload in lightfield by transitioning it to CANCELLED; only uploads still in PENDING status can be cancelled. Returns the file with id, filename, mimeType, sizeBytes, status, createdAt, completedAt, and expiresAt. Required: file_id.
- **create_a_lightfield_object** — Create a new record for a custom object type in Lightfield. Returns the created record including id, createdAt, fields, httpLink, relationships, updatedAt, and externalId. Required: entity_slug, fields.
- **get_single_lightfield_object_by_id** — Get a single custom object record by id in Lightfield. Returns the record including id, createdAt, fields, httpLink, relationships, updatedAt, and externalId. Required: entity_slug, id.
- **update_a_lightfield_object_by_id** — Update a custom object record by id in Lightfield; only the fields and relationships included in the request are modified. Returns the updated record including id, createdAt, fields, relationships, updatedAt, and externalId. Required: entity_slug, id.
- **delete_a_lightfield_object_by_id** — Move a custom object record to the trash by id in Lightfield; the record is soft-deleted and can be restored afterwards. Returns the deleted record (id, createdAt, fields, httpLink, relationships, updatedAt, externalId). Deleting an already-trashed record is a no-op. Required: entity_slug, id.
- **lightfield_objects_restore** — Restore a trashed custom object record in Lightfield, returning it to active. Returns the restored record including id, createdAt, fields, relationships, updatedAt, and externalId. Restoring a record that is not trashed is a no-op. Required: entity_slug, value_id.
- **list_all_lightfield_objects** — List records for a custom object type in Lightfield, filterable via $field query parameters. Returns each record's id, createdAt, fields map, relationships, httpLink, updatedAt, and externalId. Required: entity_slug.
- **lightfield_object_types_get_definitions** — Get the field and relationship definitions for a custom object type in lightfield. Returns: fieldDefinitions, objectType, relationshipDefinitions. Required: entity_slug.
- **list_all_lightfield_object_types** — List all custom object types available to the caller in lightfield. Returns each type's label and objectType (the slug used to reference the type in the API).
- **lightfield_object_types_list_field_history** — Get the value-change history for a single field on a custom object record in lightfield, newest first. Returns: data, hasMore, nextCursor. Required: entity_slug, value_id, field_key. Only attribute-backed fields have history; max 100 entries per page.
- **get_single_lightfield_email_by_id** — Get a single Lightfield email by id. Returns: id, createdAt, updatedAt, sentAt. Required: id. Fields are redacted based on the caller's privacy resolution.
- **list_all_lightfield_emails** — List Lightfield emails with pagination. Returns: id, accessLevel, createdAt, fields, httpLink, objectType, relationships, updatedAt, externalId. List items omit the $body field; retrieve by id for the message HTML. Max 25 records per page.
- **lightfield_emails_send** — Send a new email via the connected Lightfield email account that owns the from address. Returns: sentAt. Required: from, to, subject, and messageBody. New sends only — replies and forwards are not yet supported.
- **lightfield_emails_draft** — Create a draft email in the connected Lightfield mailbox that owns the from address. Returns: draftedAt. Required: from. At least one of to, cc, bcc, subject, messageBody, or attachments must also be populated — sending only from returns a 400.
- **lightfield_merges_merge_accounts** — Merge two lightfield accounts into one — the primary account keeps its id and the duplicate is soft-deleted. Returns the merge operation (id, status), the surviving primary account (id, createdAt, fields, relationships), and a merge summary (fieldWriteCount, syncRepointedCount, warnings). Required: primaryId, duplicateId.
- **lightfield_merges_merge_contacts** — Merge two lightfield contacts into one — the primary contact keeps its id and the duplicate is soft-deleted. Returns the merge operation (id, status), the surviving primary contact (id, createdAt, fields, relationships), and a merge summary (fieldWriteCount, syncRepointedCount, warnings). Required: primaryId, duplicateId.
- **lightfield_merges_merge_opportunities** — Merge two lightfield opportunities into one — the primary opportunity keeps its id, the duplicate is soft-deleted, and both must belong to the same account. Returns the merge operation (id, status), the surviving primary opportunity (id, createdAt, fields, relationships), and a merge summary (fieldWriteCount, syncRepointedCount, warnings). Required: primaryId, duplicateId.
- **lightfield_merges_merge_object_values** — Merge two records of a custom object type in lightfield — the primary record keeps its id and the duplicate is soft-deleted; both records must belong to that object type. Returns the merge operation (id, status), the surviving primary record (id, createdAt, fields, relationships), and a merge summary (fieldWriteCount, syncRepointedCount, warnings). Required: entity_slug, primaryId, duplicateId.
- **get_single_lightfield_merge_by_id** — Get a lightfield merge operation by id. Returns: id, createdAt, duplicateId, entityType, primaryId, status, updatedAt. Required: id.
- **get_single_lightfield_message_by_id** — Get a single Lightfield message by id. Message text is redacted per the caller's channel-visibility resolution and surfaced with a read-only accessLevel; attachment file IDs are exposed under relationships.$attachment. Returns: id, accessLevel, createdAt, fields, httpLink, objectType, relationships, updatedAt, externalId. Required: id.
- **list_all_lightfield_messages** — List Lightfield messages, filtered to those in channels the caller may see; each message includes a read-only accessLevel. Returns: id, accessLevel, createdAt, fields, httpLink, objectType, relationships, updatedAt, externalId. Max 25 per page.
- **get_single_lightfield_channel_by_id** — Get a single Lightfield channel by id. Returns the channel object including id, createdAt, fields (a map of typed field values), relationships, httpLink, objectType, updatedAt, and externalId. Required: id. Returns 404 if the channel is not visible to the caller — a private channel the caller is not a member of is indistinguishable from one that does not exist.
- **list_all_lightfield_channels** — List channels in lightfield visible to the caller (public channels, channels they are a member of, and org-wide-visible providers). Returns channel objects with id, createdAt, fields, relationships, and updatedAt. Max 25 per page.
- **lightfield_enrichment_runs_enrich** — Start an enrichment run for a contact or account in Lightfield: missing field values are looked up from enrichment providers and written back to the record. Returns: status. Runs in the background — poll get with the returned run id; only one run can be in flight per record. Required: entity_slug, entity_id.
- **get_single_lightfield_enrichment_run_by_id** — Get the status of a Lightfield enrichment run by id. Returns: id, createdAt, status, updatedAt. Required: id (the enrichment run id).

## How it works

1. **Link your customer's Lightfield account.** Use Truto's frontend SDK; we handle every OAuth and API key flow so you don't need to create the OAuth app.
2. **Authentication is automatic.** Truto refreshes tokens, stores credentials securely, and injects them into every API request.
3. **Call Truto's API to reach Lightfield.** The Proxy API is a 1-to-1 mapping of the Lightfield API.
4. **Get a unified response format.** Every response uses a single shape, with cursor-based pagination and data in the `result` field.

## Use cases

- **Push conversational intelligence into Lightfield's AI brain** — Call recording and notetaker platforms can sync meetings and transcripts directly into Lightfield so its AI agents can reason over external call data alongside native CRM context. This makes your product indispensable to Lightfield-using sales teams who want every conversation surfaced in their CRM.
- **Turn product usage into qualified pipeline** — Product analytics, PLG, and billing tools can convert in-app signals into Lightfield contacts, custom objects, and opportunities automatically. Your users get a working PLG motion without manual CRM hygiene.
- **Deliver AI-drafted outbound into the rep's own outbox** — Sales engagement and intent-data platforms can drop personalized emails as drafts for the assigned AE to review, or send them directly on their behalf. This upgrades your tool from a logging system into an execution layer inside the rep's daily workflow.
- **Base commissions on verifiable CRM history** — RevOps, commission, and forecasting tools can pull Lightfield's granular field history to reconstruct exactly when opportunity stages changed. This eliminates payout disputes without polling or custom webhook infrastructure.
- **Keep records clean with native merge operations** — Data quality and GTM enrichment tools can resolve duplicates using Lightfield's native merge endpoints for accounts, contacts, and opportunities. Relationships on the surviving record are preserved automatically, which is a hard problem to solve correctly from the outside.

## What you can build

- **Meeting + transcript sync with file attachment** — Create past meetings in Lightfield and attach raw transcript files via the two-step file upload (create then complete) so Lightfield's AI can ingest the full conversation.
- **PLG-to-pipeline automation** — Detect product events in your app and automatically create or update contacts, accounts, custom objects, and opportunities in Lightfield with the right ownership and linkage.
- **AI-drafted email delivery** — Generate personalized outbound in your product and deliver it into the correct rep's Lightfield drafts for approval, or send immediately on their behalf.
- **Background contact and account enrichment** — Create a minimal record from an email or domain and trigger a Lightfield enrichment run, letting Lightfield handle the heavy profile population asynchronously.
- **Stage-change audit trail for commissions and forecasting** — Stream opportunity, account, and contact field history with precise timestamps into your reporting layer to drive accurate payouts and pipeline analytics.
- **Structured markdown briefs on records** — Publish research summaries, account plans, or deal briefs as rich markdown notes attached to the relevant account or opportunity, readable by both reps and Lightfield's AI.

## FAQs

### How do end users connect their Lightfield account?

Truto handles the Lightfield auth flow for your users and validates the credentials via the lightfield_auth_validate check before any sync runs. You never store or rotate Lightfield API keys yourself.

### Can we support custom objects and custom fields?

Yes. Lightfield exposes custom objects through the objects and object type endpoints, and you can retrieve field definitions per entity (accounts, contacts, opportunities, meetings, notes, tasks, object types) to dynamically render and write to custom fields in your UI.

### How do we attach files like call transcripts or PDFs?

File uploads are a two-step flow: call create_a_lightfield_file to initiate, upload the bytes, then call lightfield_files_complete. You can then attach the file to a meeting, note, or other record via its relationships payload.

### How do we track exactly when a field changed, like an opportunity stage?

Use the field history endpoints for accounts, contacts, opportunities, and custom object types. They return discrete value changes with recordedAt timestamps, which removes the need to diff snapshots or rely on webhook replay.

### Do we need to handle Lightfield's privacy and permission rules?

No. Lightfield enforces privacy at the API layer. Reads for meetings, messages, and related entities are redacted per the connected user's access, and responses include a read-only accessLevel so you can reflect what's visible without reimplementing permissions.

### Can we send or draft emails on behalf of the connected user?

Yes. Use lightfield_emails_draft to place a message in the user's drafts for review, or lightfield_emails_send to send immediately. The from address must correspond to a Lightfield member the connection is authorized to act on behalf of.
