Skip to content
Signal
Dashboard

People

The person object: one contact across all campaigns, with a contacted state.

A person is one contact across all campaigns of the organization. A person can belong to one account. One person can be in many campaigns. The core fields (name, title, email and LinkedIn URL) are the same in every campaign. The state of the person in one campaign is its membership.

The person object

FieldTypeDescription
idUUIDRequired. ID of the person.
account_idUUIDNullable. ID of the account of the person. Null when the person has no account.
namestringNullable. Full name of the person.
titlestringNullable. Job title of the person.
emailstringNullable. Email address of the person.
linkedin_urlstringNullable. LinkedIn URL of the person.
campaign_idsarray of UUIDIDs of the campaigns that hold the person. Empty after the person leaves its last campaign.
contacted_attimestampNullable. Time when the person became contacted. Null when the person is not contacted.
created_attimestampRequired. Time when the person was created.
updated_attimestampRequired. Time of the last change.
membershipobjectNullable. The state of the person in the campaign of the request. Only a request with campaign_id has it. Read Membership.
{
  "id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
  "account_id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "name": "Jane Doe",
  "title": "Head of Operations",
  "email": "jane@acme.com",
  "linkedin_url": "https://www.linkedin.com/in/janedoe",
  "campaign_ids": ["3f2b8a4e-1c5d-4e7f-9a0b-6c2d8e1f4a7b"],
  "contacted_at": null,
  "created_at": "2026-09-23T12:00:00.000Z",
  "updated_at": "2026-09-23T12:00:00.000Z",
  "membership": null
}

Where people come from

A discovery run looks for people at each account when the campaign targets person. contacts_per_account sets the number. An import run with entity_type person adds people from rows or a CSV file. Read Runs.

Use add_people_to_campaign to add an existing person to another campaign. When the account of the person is not in that campaign, the account joins too. Read Membership.

Contacted state

The contacted state belongs to the person. It is the same in every campaign.

  • update_person with contacted set to true marks the person as contacted now.
  • A person that is already contacted keeps the first contacted time.
  • contacted set to false clears contacted_at.
  • The contacted state does not change the review state in any campaign.
  • A review state change does not change the contacted state.

The contacted_at of an account is the latest contacted_at of its people.

search_people lists the people of the organization in ascending ID order. It takes the filters of search_accounts and account_id:

FilterDescription
campaign_idOnly the people in this campaign. Each item then has membership. An unknown campaign gives 404.
account_idOnly the people of this account. An unknown account gives 404.
review_stateOnly the people with this review state in the campaign: new, reviewed or passed. It needs campaign_id, else the request gives 422.
nameOnly the people whose name starts with this text, in any case. 1 to 200 characters.
limit, cursorPagination. Read Paginate and handle errors.

Update rules

  • update_person changes name, title, email, linkedin_url and contacted.
  • Only the fields in the body change. A null or absent field does not change.
  • name and title are 1 to 500 characters. email and linkedin_url are 1 to 2048 characters. Signal removes leading and trailing spaces.
  • A change to a core field applies to the person in every campaign that holds it.
  • To change the review state in one campaign, use set_person_review_state.

Identity and merges

QuestionRule
When do records match?Names contain each other, plus the same email or LinkedIn URL. A matching name alone is insufficient.
When does matching run?During identity resolution after discovery, import or membership changes. Background reconciliation and supported reads can resolve pending records.
Which ID survives a merge?The record with the smallest, oldest ID.
What does a merged ID return?The surviving record. Save its returned id; it can differ from the requested ID. Updates also address the survivor.
What happens after the last membership is removed?Reads by ID still work. Search omits the record. A later matching import or add can reuse the ID.

Import inputs have current matching limitations. The identity rule applies to the values that ingest research resolves.

Operations

Each path below follows $LINKT_API_URL/v2. Set LINKT_API_URL to the origin only, for example https://api.signal.linkt.ai.

OperationMethod and pathPurpose
search_peopleGET /peopleSearch the people of the organization.
get_personGET /people/{person_id}Get one person.
update_personPATCH /people/{person_id}Change the core fields or the contacted state of a person.
curl --fail-with-body --request GET "$LINKT_API_URL/v2/people?limit=5" \
  --header "x-api-key: $LINKT_API_KEY"

API reference: search_people

Import identity rules

Person imports accept an optional account_id. Signal uses a tenant-scoped account copy as the saved person's parent. Additional people found during research have separate identities. Read Runs to correlate each input person with its result. APP-483 candidate. Signals can refer to an existing person through person_ids. Filter signals with person_id to read those observations and any known account relationship. Observing a person does not create a contact or campaign membership. Use explicit import and membership operations.

On this page