Pin credentials in .env.deepline
deepline org switch in unattended jobs, and do not prefix
individual Deepline commands with ad hoc API keys.
Use customer-specific output paths:
Documentation Index
Fetch the complete documentation index at: /docs/llms.txt
Use this file to discover all available pages before exploring further.
Run Deepline workflows safely from CI, scheduled jobs, and agent workers. Use it to pilot on a few rows, verify the output, and scale the workflow safely.
| Background job | Play pattern |
|---|---|
| Refresh account signals daily | cron binding |
| Enrich inbound demo requests | webhook binding |
| Clean CRM job changes weekly | scheduled play |
| Process new CSV drops | agent watches folder, runs play |
.env.deeplinecd ~/gtm-workflows/customers/acme
cat >.env.deepline <<'ENV'
DEEPLINE_HOST_URL=https://code.deepline.com
DEEPLINE_API_KEY=dl_acme_workspace_key
ENV
deepline plays run account-refresh --json
deepline org switch in unattended jobs, and do not prefix
individual Deepline commands with ad hoc API keys.
Use customer-specific output paths:
cd ~/gtm-workflows/customers/acme
deepline plays check account-refresh.play.ts
deepline plays run plays/customers/acme/account-refresh.play.ts \
--csv customers/acme/input/accounts.csv
# Set RUN_ID to the completed run ID printed by `plays run`.
deepline runs export "$RUN_ID" --out output/accounts-refreshed-2026-05-11.csv
deepline auth register \
--org-name "Acme" \
--agent-name "acme-nightly-enrichment"
deepline runs list --play account-refresh --json
RUN_ID="run-id-from-your-run-store"
deepline runs watch "$RUN_ID" --json
import { definePlay } from 'deepline';
type Account = {
domain: string;
};
function exactCompanyLookupSql(domain: string): string {
const normalizedDomain = domain.trim().toLowerCase().replaceAll("'", "''");
return `SELECT normalized_domain, company_name, industry FROM companies WHERE normalized_domain = '${normalizedDomain}' LIMIT 1`;
}
export default definePlay(
'account-refresh',
async (ctx, input: { accounts: Account[] }) => {
const rows = await ctx
.dataset('account_refresh', input.accounts)
.withColumn('company_signal', (account, rowCtx) =>
rowCtx.tools.execute({
id: 'company_signal',
tool: 'free_simple_company_search',
input: { sql: exactCompanyLookupSql(account.domain) },
description: 'Refresh company context for this exact domain.',
}),
)
.run({ key: 'domain' });
return { rows };
},
{
description: 'Refresh company context for an account list.',
billing: { maxCreditsPerRun: 25 },
},
);