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
| Field | Type | Description |
|---|---|---|
id | UUID | Required. ID of the person. |
account_id | UUID | Nullable. ID of the account of the person. Null when the person has no account. |
name | string | Nullable. Full name of the person. |
title | string | Nullable. Job title of the person. |
email | string | Nullable. Email address of the person. |
linkedin_url | string | Nullable. LinkedIn URL of the person. |
campaign_ids | array of UUID | IDs of the campaigns that hold the person. Empty after the person leaves its last campaign. |
contacted_at | timestamp | Nullable. Time when the person became contacted. Null when the person is not contacted. |
created_at | timestamp | Required. Time when the person was created. |
updated_at | timestamp | Required. Time of the last change. |
membership | object | Nullable. The state of the person in the campaign of the request. Only a request with campaign_id has it. Read Membership. |
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_personwithcontactedset totruemarks the person as contacted now.- A person that is already contacted keeps the first contacted time.
contactedset tofalseclearscontacted_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
search_people lists the people of the organization in ascending ID order. It takes the filters of search_accounts and account_id:
| Filter | Description |
|---|---|
campaign_id | Only the people in this campaign. Each item then has membership. An unknown campaign gives 404. |
account_id | Only the people of this account. An unknown account gives 404. |
review_state | Only the people with this review state in the campaign: new, reviewed or passed. It needs campaign_id, else the request gives 422. |
name | Only the people whose name starts with this text, in any case. 1 to 200 characters. |
limit, cursor | Pagination. Read Paginate and handle errors. |
Update rules
update_personchangesname,title,email,linkedin_urlandcontacted.- Only the fields in the body change. A null or absent field does not change.
nameandtitleare 1 to 500 characters.emailandlinkedin_urlare 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
| Question | Rule |
|---|---|
| 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.
| Operation | Method and path | Purpose |
|---|---|---|
search_people | GET /people | Search the people of the organization. |
get_person | GET /people/{person_id} | Get one person. |
update_person | PATCH /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"Related
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.