result.data | object | Yes | — | A contact record in your CRM, as the lookups (GET /contacts?idsOrEmails=, GET /contacts?crmIds=, GET /contacts/{idOrEmail}) return it. Not to be confused with a lead which is a contact specifically added to a campaign. |
result.data._id | string | No | — | Unique contact identifier |
result.data.teamId | string | No | — | Team identifier the contact belongs to |
result.data.fullName | string | No | — | Contact’s calculated full name |
result.data.email | string | No | — | Contact’s primary email address Format: email. |
result.data.fields | record | No | — | Contact fields, standard (firstName, lastName, phone, jobTitle…) and custom |
result.data.campaigns | array | No | — | List of campaigns the contact is associated with |
result.data.campaigns[].campaignId | string | No | — | — |
result.data.campaigns[].campaignState | string | No | — | — |
result.data.campaigns[].leadState | string | No | — | — |
result.data.campaigns[].leadId | string | No | — | — |
result.data.linkedinUrl | string | No | — | Contact’s LinkedIn profile URL |
result.data.linkedinUrlSalesNav | string | No | — | Contact’s LinkedIn Sales Navigator URL |
result.data.ownerId | string | No | — | ID of the user who owns this contact |
result.data.createdAt | string | No | — | Contact creation timestamp Format: date-time. |
result.data.createdBy | string | No | — | ID of the user who created the contact |
result.data.unsubscribed | boolean | No | — | Whether the contact is globally unsubscribed. When true, no outreach will be sent to this contact. |
result.data.phonesStatuses | array | No | — | Verification status of each verified phone number. |
result.data.phonesStatuses[].phone | string | No | — | The phone number, as stored in fields |
result.data.phonesStatuses[].status | "valid" | "invalid" | No | — | Allowed: valid, invalid. |
result.data.crmSync | object | No | — | CRM sync status for the contact, resolved against the team’s active CRM provider (Hubspot, Salesforce, or Pipedrive). Only present when a CRM is connected and the contact has a record in it. crmRecordId maps a crmIds lookup back to the ids sent. |
result.data.crmSync.provider | "hubspot" | "salesforce" | "pipedrive" | No | — | Active CRM provider for the team. Allowed: hubspot, salesforce, pipedrive. |
result.data.crmSync.crmRecordId | string | null | No | — | Identifier of the contact record on the CRM side. null when the lemlist contact has not been synced yet. |
result.data.crmSync.syncDisabled | boolean | No | — | When true, automatic sync is paused for this contact. |
result.data.crmSync.errors | array | No | — | List of recent sync errors. Empty when the contact is synced cleanly. |
result.data.crmSync.errors[].type | string | No | — | Coarse error category (e.g. CONNECT_FAILED, CREATE_FAILED, UPDATE_FAILED). |
result.data.crmSync.errors[].reason | string | No | — | Specific error reason (e.g. UNIQUE_INDEX_ERROR_CONTACT, INVALID_EMAIL, PROPERTY_DOESNT_EXIST). |
result.data.crmSync.errors[].raisedAt | string | No | — | Timestamp when the error was last raised. Format: date-time. |
result.data.crmSync.errors[].metadata | record | No | — | Extra context. For UNIQUE_INDEX_ERROR_COMPANY, contains alreadyExistingCompanyId — the lemlist company that already occupies the conflicting CRM record. Use it to remap contacts onto the right lemlist company before deleting the duplicate. |
result.data.fieldRejections | array | No | — | Values lemlist refused to write on this contact, each with its reason. Empty when none. Filter the list endpoint to only flagged contacts via GET /contacts?fieldRejectionReason=.... |
result.data.fieldRejections[].field | string | No | — | The record field the rejected value targeted (e.g. emails, linkedinUrl, domain). |
result.data.fieldRejections[].reason | string | No | — | Why the value was rejected, prefixed by its origin — enrichment_* (raised while enriching) or crm_sync_* (raised during CRM sync). Same values accepted by the fieldRejectionReason query param. |
result.data.fieldRejections[].source | string | No | — | Where the rejection came from — an enrichment source (lemrich) or a CRM provider (hubspot, salesforce, pipedrive). |
result.data.fieldRejections[].conflictingRecordId | string | No | — | The lemlist record that already holds the value, when the rejection identifies one — use it to merge or remap before resolving the duplicate. Always a lemlist id (ctc_… for a contact, cpn_… for a company), never a CRM record id. Omitted otherwise. |
result.data.fieldRejections[].rejectedValue | string | No | — | The value that was refused. |
result.data.fieldRejections[].rejectedAt | string | No | — | When the rejection was recorded. Format: date-time. |
result.meta | object | No | — | Additional response metadata (status, paging). |