# Daily Lead Qualification Agent (/docs/receipes/daily-lead-qualification-agent)



This recipe tells an agent exactly how to build a daily lead-qualification workflow in andibase.

The workflow is designed for teams that keep lead sources in a folder of database exports and want an agent to turn those imports into candidate companies, request reviewer feedback, and keep bringing in newly available companies every day.

Goal [#goal]

Create five things in one workspace:

1. A `lead-source-company` data definition.
2. A `lead-candidate` data definition.
3. A `lead-candidate-feedback` data definition.
4. One agent that reviews imported companies and generates candidate leads.
5. One automation that runs once per day and asks the agent to process newly available companies and queue them for feedback.

Expected outcome [#expected-outcome]

After following this recipe, the workspace should have:

* a `lead-source-company` definition for normalized companies imported from a folder of database exports
* a `lead-candidate` definition for qualified candidate companies
* a `lead-candidate-feedback` definition for reviewer feedback on candidates
* a `lead-qualification-agent` agent
* a `daily-lead-qualification` automation

At the end of the flow:

* new companies land in `lead-source-company`
* promising companies are turned into `lead-candidate` rows
* candidates move into an `awaiting-feedback` state
* reviewer feedback is captured in `lead-candidate-feedback`
* the next daily run uses that feedback while continuing to process newly imported companies

Use the API documented in:

* [Data Model](/docs/data-model)
* [Get started (for AI Agents)](/docs/agent-get-started)
* [Data definitions API](/docs/api-reference/data-definitions)
* [Data API](/docs/api-reference/data)
* [Agents API](/docs/api-reference/agents)
* [Automations API](/docs/api-reference/automations)
* [Agent Tools](/docs/agent-tools)

Current runtime constraints [#current-runtime-constraints]

The current workspace agent runtime is strong at structured workspace data, but it does not expose a direct tool for browsing arbitrary workspace folders or reading workspace files.

That means this recipe should treat the folder with database exports as an ingestion source, not as the agent's live runtime tool surface.

Use this pattern:

* import the folder content into normalized `lead-source-company` rows first
* let the agent qualify only those structured source rows
* use the daily automation to process newly imported rows once per day
* use candidate state plus feedback rows to request review without pretending there is an interactive approval tool if one is not available
* if direct folder-to-data sync is not available yet, mark ingestion as pending instead of pretending the folder was processed

Agent instructions [#agent-instructions]

When an agent executes this recipe, it should follow these rules:

1. Create the `lead-source-company` definition first.
2. Create the `lead-candidate` definition second.
3. Create the `lead-candidate-feedback` definition third.
4. In the current API, data definition handles are generated from `name`. Use `name: "Lead Source Company"`, `name: "Lead Candidate"`, and `name: "Lead Candidate Feedback"` so the created handles normalize to `lead-source-company`, `lead-candidate`, and `lead-candidate-feedback`.
5. If your execution environment can resolve the created definition ids, you may use relationship fields. If it cannot, use text foreign keys such as `sourceCompanyRecordId` and `candidateRecordId`, because the public HTTP API still expects `dataDefinitionId` for relationship fields.
6. Create the lead-qualification agent with instructions focused on deduping source companies, scoring fit, generating candidate rows, and requesting feedback through candidate state plus feedback records.
7. Create the daily automation last.
8. Do not claim that the agent read a folder directly unless the execution environment actually had a file-reading capability for that folder.
9. If folder ingestion is not available, keep `lead-source-company` rows or automation logs marked as pending and explain what is still missing.
10. Ask the user only when a missing choice materially changes qualification quality, such as the ideal customer profile, geography, segment, or excluded industries.

Step 1: Create the data model [#step-1-create-the-data-model]

Create three data definitions: `lead-source-company`, `lead-candidate`, and `lead-candidate-feedback`.

1\. Lead Source Company definition [#1-lead-source-company-definition]

Use `name: "Lead Source Company"`. The current API derives the handle from the name, so this will create the `lead-source-company` handle.

Recommended fields:

```json
{
  "name": "Lead Source Company",
  "description": "Normalized companies imported from a folder of database exports or other source datasets.",
  "fields": {
    "companyName": {
      "name": "Company name",
      "type": "text"
    },
    "websiteDomain": {
      "name": "Website domain",
      "type": "text"
    },
    "industry": {
      "name": "Industry",
      "type": "text"
    },
    "country": {
      "name": "Country",
      "type": "text"
    },
    "employeeRange": {
      "name": "Employee range",
      "type": "text"
    },
    "revenueRange": {
      "name": "Revenue range",
      "type": "text"
    },
    "sourceFolderPath": {
      "name": "Source folder path",
      "type": "text"
    },
    "sourceFileName": {
      "name": "Source file name",
      "type": "text"
    },
    "sourceRecordKey": {
      "name": "Source record key",
      "type": "text"
    },
    "importedAt": {
      "name": "Imported at",
      "type": "timestamp"
    },
    "qualificationState": {
      "name": "Qualification state",
      "type": "select",
      "options": [
        { "value": "new", "label": "New", "color": "blue" },
        { "value": "processed", "label": "Processed", "color": "green" },
        { "value": "duplicate", "label": "Duplicate", "color": "zinc" },
        { "value": "ignored", "label": "Ignored", "color": "stone" },
        { "value": "pending-ingestion", "label": "Pending ingestion", "color": "amber" }
      ]
    },
    "qualificationNotes": {
      "name": "Qualification notes",
      "type": "text",
      "variant": "long-text"
    }
  }
}
```

Recommended defaults for imported source rows:

* `qualificationState`: `new`
* `importedAt`: now

2\. Lead Candidate definition [#2-lead-candidate-definition]

Use `name: "Lead Candidate"`. The current API derives the handle from the name, so this will create the `lead-candidate` handle.

Recommended fields:

```json
{
  "name": "Lead Candidate",
  "description": "Qualified potential lead candidates generated from imported companies.",
  "fields": {
    "sourceCompanyRecordId": {
      "name": "Source company record id",
      "description": "Store the linked lead-source-company row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "companyName": {
      "name": "Company name",
      "type": "text"
    },
    "websiteDomain": {
      "name": "Website domain",
      "type": "text"
    },
    "industry": {
      "name": "Industry",
      "type": "text"
    },
    "country": {
      "name": "Country",
      "type": "text"
    },
    "fitScore": {
      "name": "Fit score",
      "type": "number"
    },
    "priority": {
      "name": "Priority",
      "type": "select",
      "options": [
        { "value": "low", "label": "Low", "color": "zinc" },
        { "value": "medium", "label": "Medium", "color": "blue" },
        { "value": "high", "label": "High", "color": "amber" },
        { "value": "critical", "label": "Critical", "color": "red" }
      ]
    },
    "candidateStatus": {
      "name": "Candidate status",
      "type": "select",
      "options": [
        { "value": "new", "label": "New", "color": "blue" },
        { "value": "awaiting-feedback", "label": "Awaiting feedback", "color": "amber" },
        { "value": "approved", "label": "Approved", "color": "green" },
        { "value": "rejected", "label": "Rejected", "color": "stone" },
        { "value": "duplicate", "label": "Duplicate", "color": "zinc" }
      ]
    },
    "whyNow": {
      "name": "Why now",
      "type": "text",
      "variant": "long-text"
    },
    "qualificationReason": {
      "name": "Qualification reason",
      "type": "text",
      "variant": "long-text"
    },
    "recommendedNextStep": {
      "name": "Recommended next step",
      "type": "text",
      "variant": "long-text"
    },
    "feedbackRequestedAt": {
      "name": "Feedback requested at",
      "type": "timestamp"
    },
    "feedbackRequestNote": {
      "name": "Feedback request note",
      "type": "text",
      "variant": "long-text"
    },
    "lastFeedbackSummary": {
      "name": "Last feedback summary",
      "type": "text",
      "variant": "long-text"
    },
    "candidateBatchDate": {
      "name": "Candidate batch date",
      "type": "date"
    }
  }
}
```

Recommended defaults for agent-created candidate rows:

* `candidateStatus`: `awaiting-feedback`
* `candidateBatchDate`: today
* `feedbackRequestedAt`: now
* `feedbackRequestNote`: short explanation of what the reviewer should validate

3\. Lead Candidate Feedback definition [#3-lead-candidate-feedback-definition]

Use `name: "Lead Candidate Feedback"`. The current API derives the handle from the name, so this will create the `lead-candidate-feedback` handle.

Recommended fields:

```json
{
  "name": "Lead Candidate Feedback",
  "description": "Reviewer feedback on qualified lead candidates.",
  "fields": {
    "candidateRecordId": {
      "name": "Candidate record id",
      "description": "Store the linked lead-candidate row id when the client only has public HTTP API access.",
      "type": "text"
    },
    "reviewerName": {
      "name": "Reviewer name",
      "type": "text"
    },
    "verdict": {
      "name": "Verdict",
      "type": "select",
      "options": [
        { "value": "approve", "label": "Approve", "color": "green" },
        { "value": "reject", "label": "Reject", "color": "stone" },
        { "value": "needs-work", "label": "Needs work", "color": "amber" }
      ]
    },
    "notes": {
      "name": "Notes",
      "type": "text",
      "variant": "long-text"
    },
    "createdAtManual": {
      "name": "Created at manual",
      "type": "timestamp"
    }
  }
}
```

If your client already has the created definition ids, you can replace the text foreign keys with relationship fields:

```json
{
  "sourceCompanyId": {
    "name": "Source company",
    "type": "relationship",
    "dataDefinitionId": "<lead-source-company-definition-id>"
  },
  "candidateId": {
    "name": "Candidate",
    "type": "relationship",
    "dataDefinitionId": "<lead-candidate-definition-id>"
  }
}
```

4\. Example create requests [#4-example-create-requests]

Create the definitions with `POST /api/v1/data-definitions`.

Current API note:

* the create payload uses `name`, `description`, and `fields`
* the handle is derived from `name`
* data rows are created with `data`, not `attributes`

Example for `lead-source-company`:

```bash
curl -X POST "https://andibase.com/api/v1/data-definitions" \
  -H "Authorization: Bearer $ANDI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Lead Source Company",
    "description": "Normalized companies imported from a folder of database exports or other source datasets.",
    "fields": {
      "companyName": { "name": "Company name", "type": "text" },
      "websiteDomain": { "name": "Website domain", "type": "text" },
      "industry": { "name": "Industry", "type": "text" },
      "country": { "name": "Country", "type": "text" },
      "sourceFolderPath": { "name": "Source folder path", "type": "text" },
      "sourceFileName": { "name": "Source file name", "type": "text" },
      "sourceRecordKey": { "name": "Source record key", "type": "text" },
      "importedAt": { "name": "Imported at", "type": "timestamp" },
      "qualificationState": {
        "name": "Qualification state",
        "type": "select",
        "options": [
          { "value": "new", "label": "New", "color": "blue" },
          { "value": "processed", "label": "Processed", "color": "green" },
          { "value": "pending-ingestion", "label": "Pending ingestion", "color": "amber" }
        ]
      }
    }
  }'
```

Create sample imported company rows with `POST /api/v1/data-definitions/lead-source-company/data/upsert-many`.

```bash
curl -X POST "https://andibase.com/api/v1/data-definitions/lead-source-company/data/upsert-many" \
  -H "Authorization: Bearer $ANDI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "data": {
          "companyName": "Northwind Logistics",
          "websiteDomain": "northwind-logistics.example",
          "industry": "Logistics",
          "country": "Chile",
          "employeeRange": "200-500",
          "revenueRange": "10M-50M",
          "sourceFolderPath": "/imports/leads",
          "sourceFileName": "march-db-export.csv",
          "sourceRecordKey": "northwind-logistics-001",
          "importedAt": "2026-03-20T09:00:00.000Z",
          "qualificationState": "new"
        }
      }
    ]
  }'
```

Step 2: Create the lead qualification agent [#step-2-create-the-lead-qualification-agent]

Create one workspace agent with handle `lead-qualification-agent`.

Recommended behavior:

* review only newly imported source companies that have not been processed yet
* avoid duplicate candidates by domain, company name, or obvious near-duplicates
* score fit against the current ideal customer profile
* create candidate rows only when the company looks promising enough
* mark candidates as `awaiting-feedback`, store the rationale, and leave a clear feedback request note
* update source rows to `processed`, `duplicate`, or `ignored`
* use reviewer feedback to improve future qualification decisions without rewriting historical facts

Recommended agent payload:

```json
{
  "name": "Lead Qualification Agent",
  "handle": "lead-qualification-agent",
  "description": "Reviews imported companies, creates lead candidates, and tracks feedback.",
  "model": "openai/gpt-5.4",
  "capabilities": {
    "webAccess": false,
    "browserAccess": false,
    "objectsAccess": true
  },
  "instructions": "You manage a lead-qualification workflow. Use the lead-source-company, lead-candidate, and lead-candidate-feedback data definitions as the source of truth. Be action-oriented: make reasonable assumptions, complete the work when the intended outcome is clear, and avoid asking for confirmation on every small step. Review only source companies whose qualificationState is new. Create lead-candidate rows only when the company appears to be a meaningful prospect based on industry, geography, size, and stated ICP rules. Avoid duplicates by checking existing candidate company names and domains first. When you create a candidate, set candidateStatus to awaiting-feedback, explain the qualificationReason clearly, store a practical recommendedNextStep, and write a short feedbackRequestNote that tells the reviewer what to validate or challenge. After processing a source row, update its qualificationState to processed, duplicate, or ignored. When user feedback appears in lead-candidate-feedback, incorporate it into future judgments but do not alter historical reviewer feedback. Never pretend that direct folder sync happened unless the source rows already exist."
}
```

Create the agent with `POST /api/v1/agents`.

Step 3: Create the daily automation [#step-3-create-the-daily-automation]

Create one automation with handle `daily-lead-qualification`.

The automation should run once per day and call the agent to process newly imported source companies.

Current platform note:

* automations can run on `cron`
* automation scripts can call an agent with `api.callAgent(...)`
* if folder-to-data ingestion is not available yet, the automation should still run and report that ingestion is pending instead of silently failing

Recommended automation payload:

```json
{
  "name": "Daily lead qualification",
  "handle": "daily-lead-qualification",
  "description": "Runs once per day to qualify newly imported companies and create candidate leads.",
  "enabled": true,
  "config": {
    "triggers": [
      {
        "type": "cron",
        "enabled": true,
        "config": {
          "cron": "0 8 * * *"
        }
      }
    ],
    "script": {
      "source": "async function main(input, api) {\\n  api.log('daily lead qualification started', { input });\\n\\n  const reply = await api.callAgent({\\n    handle: 'lead-qualification-agent',\\n    prompt: [\\n      'Process newly imported lead-source-company rows since the last daily run.',\\n      'Create lead-candidate rows for qualified companies.',\\n      'Avoid duplicates against existing lead-candidate rows.',\\n      'Update each processed source row qualificationState.',\\n      'For every new candidate, set candidateStatus to awaiting-feedback and write a concise feedbackRequestNote.',\\n      'Summarize the candidate batch so a reviewer can quickly approve, reject, or request changes.',\\n      'If there are no new source rows because folder ingestion is not set up yet, state that ingestion is pending and do not invent candidates.',\\n      'Explain why every new candidate is promising and what feedback is needed next.'\\n    ].join(' ')\\n  });\\n\\n  return { ok: true, chatId: reply.chatId, reply: reply.reply };\\n}\\n\\nmain;"
    }
  }
}
```

Create the automation with `POST /api/v1/automations`.

Step 4: Feedback loop [#step-4-feedback-loop]

When reviewers give feedback on candidates, store it in `lead-candidate-feedback`.

Recommended operating pattern:

1. Reviewer adds one feedback row per candidate.
2. Candidate status is updated to `approved`, `rejected`, or remains `awaiting-feedback`.
3. On the next daily run, the agent can inspect recent feedback rows before scoring new companies.

If the current execution environment cannot proactively ask the user for feedback, use data state to request it:

* mark candidates as `awaiting-feedback`
* set `feedbackRequestedAt`
* store a short `feedbackRequestNote` that says what the reviewer should validate
* store a short note in `lastFeedbackSummary` such as `Waiting for reviewer decision`

Step 5: Daily operating loop [#step-5-daily-operating-loop]

Use this operating loop for the ongoing workflow:

1. New database exports are normalized into `lead-source-company`.
2. The daily automation runs and asks the agent to review only rows that are still `new`.
3. The agent creates `lead-candidate` rows for promising companies and leaves them in `awaiting-feedback`.
4. Reviewers add rows to `lead-candidate-feedback` and optionally update the candidate status.
5. The next daily run reads recent feedback before qualifying the next batch of newly imported companies.

Recommended acceptance checks [#recommended-acceptance-checks]

An agent should consider the recipe complete only if all of the following are true:

1. `lead-source-company` exists and includes the required fields.
2. `lead-candidate` exists and includes either the `sourceCompanyId` relationship or the `sourceCompanyRecordId` fallback used by the current public HTTP API flow.
3. `lead-candidate-feedback` exists and includes either the `candidateId` relationship or the `candidateRecordId` fallback used by the current public HTTP API flow.
4. `lead-qualification-agent` exists.
5. `daily-lead-qualification` exists and includes one enabled cron trigger.
6. At least one sample `lead-source-company` row can be created successfully.
7. At least one candidate can be created with `candidateStatus: awaiting-feedback` and a non-empty `feedbackRequestNote`.
8. The recipe makes it explicit that folder ingestion is pending when direct folder sync is not available.

Minimal delivery summary [#minimal-delivery-summary]

When the agent finishes, it should report:

* the created data definition handles
* the created agent handle
* the created automation handle
* whether folder-to-data ingestion is working or still pending
* how reviewer feedback is requested and captured
* any assumptions made for ICP, geography, company size, or excluded industries


## Documentation Navigation
Use these paths to traverse the relevant docs and generated API reference files for the app.
- Daily Lead Qualification Agent [current] -> `/docs/receipes/daily-lead-qualification-agent` (source: `content/docs/receipes/daily-lead-qualification-agent.mdx`)
- andibase Overview -> `/docs` (source: `content/docs/index.mdx`)
- Get started (for AI Agents) -> `/docs/agent-get-started` (source: `content/docs/agent-get-started.mdx`)
- Agent Tools -> `/docs/agent-tools` (source: `content/docs/agent-tools.mdx`)
- Agents -> `/docs/agents` (source: `content/docs/agents.mdx`)
- Agent Auth -> `/docs/api-reference/agent-auth`
- Get agent login request -> `/docs/api-reference/agent-auth/get-api-v1-agent-auth-requests-usercode`
- Exchange agent login -> `/docs/api-reference/agent-auth/post-api-v1-agent-auth-exchange`
- Start agent login -> `/docs/api-reference/agent-auth/post-api-v1-agent-auth-requests`
- Approve agent login -> `/docs/api-reference/agent-auth/post-api-v1-agent-auth-requests-usercode-approve`
- Deny agent login -> `/docs/api-reference/agent-auth/post-api-v1-agent-auth-requests-usercode-deny`
- Agents -> `/docs/api-reference/agents`
- Delete workspace agent -> `/docs/api-reference/agents/delete-api-v1-agents-id`
- List workspace agents -> `/docs/api-reference/agents/get-api-v1-agents`
- Get workspace agent -> `/docs/api-reference/agents/get-api-v1-agents-id`
- List agent chats -> `/docs/api-reference/agents/get-api-v1-agents-id-chats`
- Get agent chat -> `/docs/api-reference/agents/get-api-v1-agents-id-chats-chatid`
- Update workspace agent -> `/docs/api-reference/agents/patch-api-v1-agents-id`
- Create workspace agent -> `/docs/api-reference/agents/post-api-v1-agents`
- Send agent message -> `/docs/api-reference/agents/post-api-v1-agents-id-chats-chatid-messages`
- Apps -> `/docs/api-reference/apps`
- Delete app -> `/docs/api-reference/apps/delete-api-v1-apps-id`
- List workspace apps -> `/docs/api-reference/apps/get-api-v1-apps`
- Get app by id -> `/docs/api-reference/apps/get-api-v1-apps-id`
- Update app -> `/docs/api-reference/apps/patch-api-v1-apps-id`
- Create app -> `/docs/api-reference/apps/post-api-v1-apps`
- Automations -> `/docs/api-reference/automations`
- Delete workspace automation -> `/docs/api-reference/automations/delete-api-v1-automations-id`
- List workspace automations -> `/docs/api-reference/automations/get-api-v1-automations`
- Get workspace automation -> `/docs/api-reference/automations/get-api-v1-automations-id`
- List automation runs -> `/docs/api-reference/automations/get-api-v1-automations-id-runs`
- Get automation run -> `/docs/api-reference/automations/get-api-v1-automations-id-runs-runid`
- Update workspace automation -> `/docs/api-reference/automations/patch-api-v1-automations-id`
- Create workspace automation -> `/docs/api-reference/automations/post-api-v1-automations`
- Run automation -> `/docs/api-reference/automations/post-api-v1-automations-id-run`
- Trigger automation webhook -> `/docs/api-reference/automations/post-api-v1-automations-webhooks-publicid-secret`
- Channels -> `/docs/api-reference/channels`
- Delete channel -> `/docs/api-reference/channels/delete-api-v1-channels-channelid`
- List channels -> `/docs/api-reference/channels/get-api-v1-channels`
- Get channel -> `/docs/api-reference/channels/get-api-v1-channels-channelid`
- Update channel -> `/docs/api-reference/channels/patch-api-v1-channels-channelid`
- Create channel -> `/docs/api-reference/channels/post-api-v1-channels`
- Data -> `/docs/api-reference/data`
- Data Definitions -> `/docs/api-reference/data-definitions`
- Delete data definition -> `/docs/api-reference/data-definitions/delete-api-v1-data-definitions-id`
- List data definitions -> `/docs/api-reference/data-definitions/get-api-v1-data-definitions`
- Get data definition -> `/docs/api-reference/data-definitions/get-api-v1-data-definitions-id`
- Update data definition -> `/docs/api-reference/data-definitions/patch-api-v1-data-definitions-id`
- Create data definition -> `/docs/api-reference/data-definitions/post-api-v1-data-definitions`
- Data SQL Query -> `/docs/api-reference/data-sql-query`
- Run SQL query against workspace data -> `/docs/api-reference/data-sql-query/post-api-v1-data-sql-query`
- Get data by id -> `/docs/api-reference/data/get-api-v1-data-definitions-definitionid-data-id`
- Select all data row ids -> `/docs/api-reference/data/get-api-v1-data-definitions-definitionid-data-select-all`
- List data -> `/docs/api-reference/data/get-api-v1-data-definitions-definitionid-query`
- Patch many data rows -> `/docs/api-reference/data/patch-api-v1-data-definitions-definitionid-data-patch-many`
- Delete many data rows -> `/docs/api-reference/data/post-api-v1-data-definitions-definitionid-data-delete-many`
- Upsert many data rows -> `/docs/api-reference/data/post-api-v1-data-definitions-definitionid-data-upsert-many`
- DuckDB Query -> `/docs/api-reference/duckdb-query`
- Run a DuckDB query against registered sources -> `/docs/api-reference/duckdb-query/post-api-v1-duckdb-query`
- Explorer -> `/docs/api-reference/explorer`
- Delete explorer folder -> `/docs/api-reference/explorer/delete-api-v1-workspace-nodes-nodeid`
- List explorer nodes -> `/docs/api-reference/explorer/get-api-v1-workspace-nodes`
- List explorer folders -> `/docs/api-reference/explorer/get-api-v1-workspace-nodes-folders`
- Rename explorer folder -> `/docs/api-reference/explorer/patch-api-v1-workspace-nodes-nodeid-rename`
- Create folder -> `/docs/api-reference/explorer/post-api-v1-workspace-nodes-folders`
- Move explorer node -> `/docs/api-reference/explorer/post-api-v1-workspace-nodes-nodeid-move`
- Files -> `/docs/api-reference/files`
- List workspace files -> `/docs/api-reference/files/get-api-v1-files`
- Read file content -> `/docs/api-reference/files/get-api-v1-files-fileid-content`
- Create file -> `/docs/api-reference/files/post-api-v1-files`
- Complete file upload -> `/docs/api-reference/files/post-api-v1-files-fileid-complete`
- Presign multipart parts -> `/docs/api-reference/files/post-api-v1-files-fileid-parts`
- Update file content -> `/docs/api-reference/files/put-api-v1-files-fileid-content`
- Messages -> `/docs/api-reference/messages`
- List channel messages -> `/docs/api-reference/messages/get-api-v1-channels-channelid-messages`
- List thread messages -> `/docs/api-reference/messages/get-api-v1-channels-channelid-threads-threadid-messages`
- Create channel message -> `/docs/api-reference/messages/post-api-v1-channels-channelid-messages`
- Create thread message -> `/docs/api-reference/messages/post-api-v1-channels-channelid-threads-threadid-messages`
- Notifications -> `/docs/api-reference/notifications`
- List notification devices -> `/docs/api-reference/notifications/get-api-v1-notifications-devices`
- Check Expo notification receipts -> `/docs/api-reference/notifications/post-api-v1-notifications-receipts`
- Send workspace notifications -> `/docs/api-reference/notifications/post-api-v1-notifications-send`
- Runs -> `/docs/api-reference/runs`
- List workspace runs -> `/docs/api-reference/runs/get-api-v1-runs`
- Get workspace run -> `/docs/api-reference/runs/get-api-v1-runs-runid`
- Threads -> `/docs/api-reference/threads`
- List channel threads -> `/docs/api-reference/threads/get-api-v1-channels-channelid-threads`
- Get thread -> `/docs/api-reference/threads/get-api-v1-channels-channelid-threads-threadid`
- Create thread -> `/docs/api-reference/threads/post-api-v1-channels-channelid-threads`
- Workflows -> `/docs/api-reference/workflows`
- Delete workflow definition -> `/docs/api-reference/workflows/delete-api-v1-workflows-id`
- List workflow definitions -> `/docs/api-reference/workflows/get-api-v1-workflows`
- Get workflow definition -> `/docs/api-reference/workflows/get-api-v1-workflows-id`
- Update workflow definition -> `/docs/api-reference/workflows/patch-api-v1-workflows-id`
- Create workflow definition -> `/docs/api-reference/workflows/post-api-v1-workflows`
- Workspaces -> `/docs/api-reference/workspaces`
- Delete workspace API key -> `/docs/api-reference/workspaces/delete-api-v1-workspaces-workspacehandle-api-keys-keyid`
- Delete workspace credential -> `/docs/api-reference/workspaces/delete-api-v1-workspaces-workspacehandle-credentials-credentialid`
- Delete workspace invitation -> `/docs/api-reference/workspaces/delete-api-v1-workspaces-workspacehandle-invitations-invitationid`
- Delete workspace user -> `/docs/api-reference/workspaces/delete-api-v1-workspaces-workspacehandle-users-userid`
- List my workspaces -> `/docs/api-reference/workspaces/get-api-v1-workspaces`
- List workspace API keys -> `/docs/api-reference/workspaces/get-api-v1-workspaces-workspacehandle-api-keys`
- List workspace credentials -> `/docs/api-reference/workspaces/get-api-v1-workspaces-workspacehandle-credentials`
- List workspace credential tools -> `/docs/api-reference/workspaces/get-api-v1-workspaces-workspacehandle-credentials-credentialid-tools`
- List workspace invitations -> `/docs/api-reference/workspaces/get-api-v1-workspaces-workspacehandle-invitations`
- List workspace users -> `/docs/api-reference/workspaces/get-api-v1-workspaces-workspacehandle-users`
- Create workspace -> `/docs/api-reference/workspaces/post-api-v1-workspaces`
- Create workspace API key -> `/docs/api-reference/workspaces/post-api-v1-workspaces-workspacehandle-api-keys`
- Create workspace credential -> `/docs/api-reference/workspaces/post-api-v1-workspaces-workspacehandle-credentials`
- Invite user to workspace -> `/docs/api-reference/workspaces/post-api-v1-workspaces-workspacehandle-invitations`
- Create workspace user -> `/docs/api-reference/workspaces/post-api-v1-workspaces-workspacehandle-users`
- Apps -> `/docs/apps` (source: `content/docs/apps.mdx`)
- Authentication -> `/docs/authentication` (source: `content/docs/authentication.mdx`)
- Building Blocks -> `/docs/building-blocks` (source: `content/docs/building-blocks.mdx`)
- Data Model -> `/docs/data-model` (source: `content/docs/data-model.mdx`)
- Embedded Host Actions -> `/docs/embedded-host-actions` (source: `content/docs/embedded-host-actions.mdx`)
- Introduction -> `/docs/introduction` (source: `content/docs/introduction.mdx`)
- Recipes -> `/docs/receipes` (source: `content/docs/receipes/index.mdx`)
- Construction Site Visit Agent -> `/docs/receipes/construction-site-visit-agent` (source: `content/docs/receipes/construction-site-visit-agent.mdx`)
- Day Planner Agent -> `/docs/receipes/day-planner-agent` (source: `content/docs/receipes/day-planner-agent.mdx`)
- Expense Tracker -> `/docs/receipes/expense-tracker` (source: `content/docs/receipes/expense-tracker.mdx`)
- Legal Case Tracker -> `/docs/receipes/legal-case-tracker` (source: `content/docs/receipes/legal-case-tracker.mdx`)
- Spare Parts Request Agent -> `/docs/receipes/spare-parts-request-agent` (source: `content/docs/receipes/spare-parts-request-agent.mdx`)
- Weekly Report Email Agent -> `/docs/receipes/weekly-report-email-agent` (source: `content/docs/receipes/weekly-report-email-agent.mdx`)
- UI Components -> `/docs/ui-components` (source: `content/docs/ui-components.mdx`)