Manage people/contacts in Dalil AI CRM — create, read, update, delete, search, and list person records including name, email, phone, LinkedIn, city, job title, and company associations.
Dalil AI: Person API Skills
Quick Reference
Base URL:
https://app.usedalil.aiAuth:
Authorization: Bearer {apiKey}Content-Type:
application/json(POST/PATCH requests only)Accept:
application/json(GET requests)Resource path:
/rest/people
GraphQL search (POST /graphql):
searchInputis a plainString!variable — do NOT pass as an object{query: "...", includedObjectNameSingulars: [...]}(causes type error)limitmust be hardcoded in the query string — do NOT pass as a$limitvariable (causes type error)Returns IDs only — always follow up with REST to fetch full records
Endpoints
Operation | Method | Path | Required Fields |
|---|---|---|---|
Create | POST |
|
|
Get | GET |
|
|
List | GET |
| — |
Update | PATCH |
|
|
Delete | DELETE |
|
|
Search by name | POST |
|
|
Search by email | GET |
| email value |
Search by LinkedIn | GET |
| LinkedIn URL |
Search by phone | GET |
| phone number |
Create Person
Request Body
Required Fields
name.firstName(string) — First name of the person
Optional Fields
name.lastName(string) — Last nameemails.primaryEmail(string) — Primary emailemails.additionalEmails(string[]) — Additional emailsphones.primaryPhoneNumber(string) — Phone number without country codephones.primaryPhoneCountryCode(string) — Two-letter country code, e.g. "US"phones.primaryPhoneCallingCode(string) — Calling code with +, e.g. "+1"linkedinLink.primaryLinkUrl(string) — LinkedIn URLlinkedinLink.primaryLinkLabel(string) — Display labelxLink.primaryLinkUrl(string) — X/Twitter URLxLink.primaryLinkLabel(string) — Display labelavatarUrl(string) — Avatar image URLjobTitle(string) — Job titlecity(string) — CitycompanyId(UUID) — Associated companyownerId(UUID) — Record owner (workspace member)
Update Person
Send only fields to update. Same field shapes as create.
Get Person
Query params: depth (0, 1, or 2)
List People
Query params: limit, starting_after, order_by, filter, depth
Delete Person
Search Patterns
By Name (GraphQL + REST)
Step 1 — GraphQL search to get IDs:
POST to https://app.usedalil.ai/graphql
Step 2 — Fetch full records:
By Email (REST)
By LinkedIn (REST)
By Phone (REST)
Filter Examples
Gotchas
Name is a nested object — Use
{ "name": { "firstName": "John" } }, not"firstName": "John"at the top level.Link fields require full structure — LinkedIn, X, and other links need
{ primaryLinkUrl, primaryLinkLabel, secondaryLinks: [] }.Phone search requires splitting — When given a number like "+15551234567", split into calling code "+1" and number "5551234567" for the filter.
GraphQL search returns IDs only — Follow up with
GET /rest/people?filter=id[in]:[id1,id2]to fetch full records.Empty fields are auto-cleaned — Null, undefined, or empty string values are stripped from the request body before sending.
Email filter uses nested path — Use
emails.primaryEmail[ilike]:value, notprimaryEmail[ilike]:value.GraphQL
limitmust be hardcoded, not a variable — Passing$limit: Intas a variable causes a type error. Inline it directly:limit: 5.depth=1responses are large (~42KB for a list) — Even at depth=1, list responses with multiple records are very large and may exceed tool read limits. Prefer fetching records individually viaGET /rest/people/{id}?depth=1and extracting only the fields you need, rather than batch-fetching withfilter=id[in]:[...]&depth=1.URL-encode GET filter params — Filter strings contain special characters (
[,],:) that break manually constructed URLs. Use URL encoding when making requests (e.g.,curl -G --data-urlencode "filter=...").id[in]filter requires bracket syntax — The array value must be wrapped in brackets:id[in]:[uuid1,uuid2]. Passing a bare comma-separated list (id[in]:uuid1,uuid2) causes a 500 error.GraphQL
searchInputis a plain string, not an object — Pass the search term as aString!variable. Do NOT pass it as{query: "...", includedObjectNameSingulars: [...]}— that causes a type error. TheincludedObjectNameSingularsandlimitare separate top-level arguments on thesearchfield.PersonSearchResultis not a valid GraphQL type — Do not use inline fragments like... on PersonSearchResult. Thesearchquery returns a unified edge/node structure; access fields directly onnode(e.g.,recordId,objectNameSingular,label).