API Documentation

API Documentation

API Documentation

Introduction to Dalil AI APi Documentation

Introduction to Dalil AI APi Documentation

Introduction to Dalil AI APi Documentation

Dalil AI is a CRM platform for managing contacts, companies, deals, tasks, and notes. This API gives you full programmatic access to all CRM data — create, read, update, delete, and search any record in your workspace.

Base URL: https://app.usedalil.ai


Quick Start

1. Get your API key from your Dalil AI workspace: Settings → API Keys

2. Make your first request:

curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=5"
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=5"
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=5"

3. Explore the guides below to start building your integration.

Every request requires Authorization: Bearer YOUR_API_KEY in the header. Without it, you'll get a 401 Unauthorized response.


How the API Works

Dalil AI exposes two interfaces:

Interface

Path

Purpose

REST API

/rest/...

All CRUD operations — create, read, update, delete, list

GraphQL

/graphql

Full-text search only (returns record IDs)


The Search Pattern

Full-text search (searching by name, title, etc.) goes through GraphQL, but GraphQL only returns IDs. You then fetch the full records via REST. This two-step approach applies to all standard entities:

Step 1: POST /graphql  get list of recordIds
Step 2: GET /rest/{entity}?filter=id[in]:[id1,id2]  get full records
Step 1: POST /graphql  get list of recordIds
Step 2: GET /rest/{entity}?filter=id[in]:[id1,id2]  get full records
Step 1: POST /graphql  get list of recordIds
Step 2: GET /rest/{entity}?filter=id[in]:[id1,id2]  get full records

Pipelines use a different GraphQL query (searchPipeline) — see the Pipeline guide for details.


Important Conventions at a Glance

Convention

Rule

Currency amounts

In micros — multiply by 1,000,000 (e.g., $50 → 50000000)

SELECT / MULTI_SELECT

Values must be UPPER_SNAKE_CASE

Link fields (LinkedIn, domain, X)

Always { primaryLinkUrl, primaryLinkLabel, secondaryLinks: [] }

Person name

Nested object { firstName, lastName }, not flat fields

Note / Task body

Use bodyV2 with { markdown, blocknote } — or send plain body text for auto-conversion

Filter parameters

URL-encode them — they contain [, ], : characters that break raw URLs


Guides

Guide

What It Covers

Authentication

API key setup, auth headers, error codes

Pagination, Filtering & Sorting

Cursor pagination, filter syntax, comparators, sorting

Field Types

Data formats for every field type — TEXT, CURRENCY, LINKS, FULL_NAME, etc.

Metadata

Discovering custom fields, pipelines, and workspace members

Webhooks

Real-time event notifications


Resources

Core Entities

Resource

Endpoint

Operations

Person

/rest/people

Create, Get, List, Update, Delete, Search

Company

/rest/companies

Create, Get, List, Update, Delete, Search

Opportunity

/rest/opportunities

Create, Get, List, Update, Delete, Search


Activity Entities

Resource

Endpoint

Operations

Note

/rest/notes

Create, Get, List, Update, Delete, Search

Task

/rest/tasks

Create, Get, List, Update, Delete, Search


Relationship Entities

Notes and tasks are standalone records. Use these endpoints to link them to people, companies, or opportunities.

Resource

Endpoint

Operations

Note Relation

/rest/noteTargets

Create, Get, List, Update, Delete

Task Relation

/rest/taskTargets

Create, Get, List, Update, Delete


Dynamic Entities

Resource

Endpoint

Operations

Pipeline

/rest/{namePlural}

Create, Get, List, Update, Delete, Search

Pipeline endpoints are dynamic — you must discover the namePlural for each pipeline via the Metadata API before using them.


Common Workflows

Create a person and attach a note

# Step 1: Create the person
curl -X POST "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": {"firstName": "Jane", "lastName": "Doe"}}'

# Step 2: Create the note
curl -X POST "https://app.usedalil.ai/rest/notes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Intro call", "body": "Discussed product fit."}'

# Step 3: Link note to person
curl -X POST "https://app.usedalil.ai/rest/noteTargets" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"noteId": "note-uuid", "personId": "person-uuid"}'
# Step 1: Create the person
curl -X POST "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": {"firstName": "Jane", "lastName": "Doe"}}'

# Step 2: Create the note
curl -X POST "https://app.usedalil.ai/rest/notes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Intro call", "body": "Discussed product fit."}'

# Step 3: Link note to person
curl -X POST "https://app.usedalil.ai/rest/noteTargets" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"noteId": "note-uuid", "personId": "person-uuid"}'
# Step 1: Create the person
curl -X POST "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": {"firstName": "Jane", "lastName": "Doe"}}'

# Step 2: Create the note
curl -X POST "https://app.usedalil.ai/rest/notes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Intro call", "body": "Discussed product fit."}'

# Step 3: Link note to person
curl -X POST "https://app.usedalil.ai/rest/noteTargets" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"noteId": "note-uuid", "personId": "person-uuid"}'


Search for a company by name

# Step 1: GraphQL search
curl -X POST "https://app.usedalil.ai/graphql" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query Search($searchInput: String!) { search(searchInput: $searchInput, includedObjectNameSingulars: [\"company\"], limit: 5) { edges { node { recordId label } } } }",
    "variables": {"searchInput": "Acme"}
  }'

# Step 2: Fetch full records (use IDs from step 1)
curl -G "https://app.usedalil.ai/rest/companies" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "filter=id[in]:[id1,id2]" \
  --data-urlencode "depth=1"
# Step 1: GraphQL search
curl -X POST "https://app.usedalil.ai/graphql" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query Search($searchInput: String!) { search(searchInput: $searchInput, includedObjectNameSingulars: [\"company\"], limit: 5) { edges { node { recordId label } } } }",
    "variables": {"searchInput": "Acme"}
  }'

# Step 2: Fetch full records (use IDs from step 1)
curl -G "https://app.usedalil.ai/rest/companies" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "filter=id[in]:[id1,id2]" \
  --data-urlencode "depth=1"
# Step 1: GraphQL search
curl -X POST "https://app.usedalil.ai/graphql" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query Search($searchInput: String!) { search(searchInput: $searchInput, includedObjectNameSingulars: [\"company\"], limit: 5) { edges { node { recordId label } } } }",
    "variables": {"searchInput": "Acme"}
  }'

# Step 2: Fetch full records (use IDs from step 1)
curl -G "https://app.usedalil.ai/rest/companies" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "filter=id[in]:[id1,id2]" \
  --data-urlencode "depth=1"


Paginate through all people

# Page 1
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]"

# Page 2 (pass the last record's ID as starting_after)
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]" \
  --data-urlencode "starting_after=LAST-RECORD-UUID"
# Page 1
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]"

# Page 2 (pass the last record's ID as starting_after)
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]" \
  --data-urlencode "starting_after=LAST-RECORD-UUID"
# Page 1
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]"

# Page 2 (pass the last record's ID as starting_after)
curl -G "https://app.usedalil.ai/rest/people" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "limit=60" \
  --data-urlencode "order_by=createdAt[DescNullsLast]" \
  --data-urlencode "starting_after=LAST-RECORD-UUID"

On this page

Headings appear here in Preview.

On this page

Headings appear here in Preview.