Skip to content

Command Reference

Every discolike command, grouped the way the CLI groups them. Each entry lists the exact usage line, every option, and a runnable example.

New here? Start with Getting Started for install, authentication, and output formats.

Account usage and quota.

Month-to-date usage: requests, records, and spend.

discolike account usage [OPTIONS]
FlagTypeDefaultDescription
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike account usage
{
"requests_mtd": null,
"records_mtd": null,
"spend_mtd": null,
"account_status": "active",
"month_to_date_requests": 14,
"month_to_date_records": 11794,
"month_to_date_spend": 24.99,
"max_spend": "unlimited",
"total_available_spend": "unlimited",
"carryover_credits": 0.0,
"top_up_credits": 0.0,
"usage_summary": {
"2026-08": [
{
"access_id": "••••••••isco",
"description": "[API] Internal key",
"requests": 13,
"total_records": 11744,
"monthly_spend": 24.79
}
],
...
},
...
}

REST endpoint: Usage API. SDK equivalent: client.account.usage().

Enrich a CSV of domains with DiscoLike datasets. This command is synchronous and returns the enriched rows directly.

discolike append [OPTIONS] FILE
FlagTypeDefaultDescription
FILE (argument)pathrequiredCSV of domains to enrich.
--datasetstrrequiredDataset to append (repeatable): bizdata, redirects, domain_status, growth, vendors. Omitting it exits 2 before any request.
--domain-columnstrnoneColumn in the CSV that holds domains.
--csv / --no-csvboolunsetRequest the enriched rows as CSV (written via --output).
--outputpathnoneFile to write a CSV response to.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--query-idstrnoneSaved query ID whose domains are included alongside the file/—domain ones (repeatable).

Pass --output whenever the API returns CSV bytes; without it the command exits 2 with --output is required when the response is CSV bytes. With --output it writes the bytes verbatim and prints {"written": "<path>", "bytes": <count>}.

Terminal window
discolike append domains.csv --dataset bizdata --dataset growth
Terminal window
discolike append domains.csv --domain-column website --csv --output enriched.csv

REST endpoint: Append API. SDK equivalent: client.append().

Manage credentials: log in (browser or API key), check status, log out.

auth login and auth status honour the root --base-url: auth login logs in to that host’s authorization server and auth status verifies against it. A root --api-key passed explicitly on the command line switches auth login to the API-key flow with that key, and is the key auth status reports as "source": "option". Credential resolution, consent reuse, and the config file are covered in Getting Started.

Log in via the browser (OAuth) or with an API key, verify, and save to the local config file.

discolike auth login [OPTIONS]
FlagTypeDefaultDescription
--api-keystrnoneLog in with an API key instead of the browser. Create one at https://app.discolike.com/account/management/keys.
--methodstroauthoauth (browser login, default) or api_key (prompts for a key unless --api-key is given). Any other value is a usage error, exit 2.
--no-browserflagoffPrint the login URL instead of opening a browser.
--portint0Fixed loopback port for the browser redirect (default: random; use with SSH).

Browser flow (the default). The CLI fetches the authorization server’s metadata from the API host, registers itself as a public PKCE client or reuses the registration saved from an earlier login, starts a listener on http://127.0.0.1:<port>/callback, and prints the authorization URL to stderr before opening it. If no browser can be opened it says so and leaves the URL for you to open by hand. It then waits up to 180 seconds for the redirect, exchanges the code for tokens, verifies the session with a usage call, and saves it. On success the payload goes to stderr, not stdout:

{"logged_in": true, "method": "oauth", "expires_at": "2026-08-28T20:15:00+00:00"}
Terminal window
discolike auth login

On a remote machine, pin the port, forward it, and open the printed URL in a local browser:

Terminal window
ssh -L 51234:127.0.0.1:51234 build-host
discolike auth login --no-browser --port 51234

API-key flow. --api-key KEY uses that key; --method api_key prompts for one with hidden input. The key is verified with a usage call before anything is written, and a bad key exits 3 and writes nothing. The success payload is {"logged_in": true, "source": "api_key"} on stderr.

Terminal window
discolike auth login --api-key dk-live-...
Terminal window
discolike auth login --method api_key

Failures of the browser flow itself exit 1 with a single JSON line on stderr:

messageCause
Timed out after 180s waiting for the browser loginNo redirect arrived within the wait
Authorization failed: <error_description or error>The authorization server redirected back with an error, such as access_denied when consent was refused
Invalid OAuth callback (state mismatch or missing code)The redirect did not carry the expected state and code
Token exchange failed: <error>The code could not be exchanged for tokens
{"error": "LoginError", "message": "Authorization failed: access_denied"}

A saved client registration the server no longer accepts (invalid_client or unauthorized_client) is discarded and replaced automatically, with the browser flow run once more; only a second rejection surfaces as a LoginError. Errors from the authorization server outside the browser round trip, such as unreachable metadata or a rejected registration, are AuthenticationError and exit 3 like any other API error.

Show which credential is in use (option, env, or config) and verify it against the API. No options.

discolike auth status
FieldPresentValue
sourcealwaysoption for a root --api-key, env for DISCOLIKE_API_KEY, config for the config file
methodalwaysoauth or api_key
api_keyAPI key onlyThe key masked to its last four characters
expires_atOAuth onlyAccess-token expiry as an ISO 8601 UTC timestamp
expiredOAuth onlyWhether the access token is past expires_at. The session is still refreshed on the next command, so this can be true while valid is true
validalwaystrue; an invalid credential raises instead

The option is checked first, then the environment variable, then the config file. With no credential anywhere, it exits 3.

Terminal window
discolike auth status
{
"source": "config",
"method": "oauth",
"expires_at": "2026-08-28T20:15:00+00:00",
"expired": false,
"valid": true
}
{
"source": "env",
"method": "api_key",
"api_key": "…isco",
"valid": true
}

Delete saved credentials from the local config file (the registered OAuth client is kept). No options. Idempotent - logging out twice is not an error.

discolike auth logout
Terminal window
discolike auth logout

Prints {"logged_out": true}. The OAuth session or API key is removed; the oauth_client registration stays so the next browser login does not ask for consent again.

Volume pulls with checkpoint and resume: walk the company index past the 10,000-per-search ceiling, size a contact pull for free, then pull N contacts per company into one CSV. Filters come from --params-file, --param, and the common flags; the paging parameters are managed by the command and a supplied value is dropped with a note on stderr.

Every bulk command validates the request against the SDK model before the first billable call, keeps one request in flight under --rate-limit, retries on 429 and 5xx above the SDK’s own retries, prints progress to stderr, and prints one JSON summary to stdout. Rate limits are per plan: /discover and /contacts allow 5 per minute on Starter, 10 on Pro, 15 on Team, 25 on Company, and 50 on Enterprise; /contacts/count allows six times that.

Walk the company index past 10,000 results, one exclusion list per page, appending to a CSV.

discolike bulk companies [OPTIONS]
FlagTypeDefaultDescription
--icp-promptstrnoneNatural-language ideal customer profile description.
--domainstrnoneSeed domain for lookalike matching (repeatable).
--phrase-matchstrnonePhrase the company website must contain (repeatable).
--negate-phrase-matchstrnoneNegate the --phrase-match filter (repeatable).
--categorystrnoneIndustry category filter (repeatable).
--countrystrnoneISO country code filter (repeatable).
--statestrnoneState or region filter (repeatable).
--employee-rangestrnoneEmployee count range filter.
--revenue-rangestrnoneRevenue range filter.
--variancestrnoneResult diversity: LOW, MID_LOW, MEDIUM, MID_HIGH, HIGH, UNRESTRICTED.
--exclusion-query-idstrnoneSaved query ID whose results are excluded (repeatable). Also the way to reuse the lists a previous run created.
--paramstrnoneExtra API parameter as KEY=VALUE (comma-separates into a list); see the endpoint reference (repeatable).
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.
--max-companiesint10000Stop once this many companies are in --out.
--page-sizeint10000Companies per discover call (20 to 10000).
--run-namestrbulkPrefix for the exclusion lists created per page (<run-name>-round-N).
--outpathcompanies.csvCSV to append each page to; resumes if present.
--overwriteflagoffIgnore an existing --out and start clean instead of resuming.
--rate-limitint10Calls per minute to stay under on /discover.

Mechanics: each page is a discover call at --page-size; its net-new domains are appended to the CSV (domain, name, country, employees, similarity) and saved as an exclusion list named <run-name>-round-N, which is passed as exclusion_query_id on the next page (a tail shorter than 20 domains rides on exclude_domain instead, since saved lists need at least 20). The loop stops when a page returns nothing net-new, when a page comes back shorter than requested, or at --max-companies. Rerunning with the same --out reads the CSV back and rebuilds the exclusion set in 10,000-domain lists before continuing; pass the original ids as --exclusion-query-id to reuse them instead. Reach is bounded by the account’s exclusion capacity of 250,000 domains; the command warns there, and the fix is to slice the ICP (by state, employee band, sub-vertical) into separate runs.

max_records, offset, exclude_domain, and exclusion_query_id inside --params-file or --param are managed by the command and dropped with a note.

Terminal window
discolike bulk companies --params-file form.json --max-companies 50000 \
--run-name agencies --out companies.csv
round 1: +10,000 net-new (10,000 total)
round 2: +10,000 net-new (20,000 total)
...
{
"companies": 43210,
"new": 43210,
"rounds": 5,
"exclusion_query_ids": ["…", "…", "…", "…"],
"out": "companies.csv"
}

REST endpoint: Discover API and Queries API. SDK equivalent: client.discover() in a loop with client.queries.create_exclusion_list().

Size a contact pull for free: matching contacts across the domain list, and the cap at --per-company.

discolike bulk estimate [OPTIONS]
FlagTypeDefaultDescription
--domains-filepathrequiredCSV with a domain column, or one domain per line.
--per-companyint10Contacts per company the pull would ask for (1 to 100).
--icp-promptstrnoneNatural-language ICP prompt used to derive contact filters.
--summarystrnoneFilter by profile summary text (semantic search); ranks who comes back per company.
--negate-summarystrnoneExclude contacts matching this summary description.
--senioritystrnoneFilter by seniority level (repeatable).
--negate-senioritystrnoneExclude seniority levels (repeatable).
--departmentstrnoneFilter by department (repeatable).
--negate-departmentstrnoneExclude departments (repeatable).
--titlestrnoneFilter by job title (repeatable).
--negate-titlestrnoneExclude job titles (repeatable).
--person-countrystrnoneFilter by contact country (repeatable).
--person-statestrnoneFilter by contact state/region (repeatable).
--has-email / --no-has-emailboolonOnly contacts with an email address.
--exclusion-query-idstrnoneSaved query ID whose results are excluded (repeatable).
--paramstrnoneExtra API parameter as KEY=VALUE (comma-separates into a list); see the endpoint reference (repeatable).
--params-filepathnoneJSON object of API parameter names; --param and named flags override its values.
--rate-limitint30Calls per minute on the free /contacts/count.

Runs contacts count over the list in 1,000-domain slices with the same filters bulk contacts will use and sums the result. contacts_capped is the most the pull can return at --per-company; the real yield is usually lower, two to three usable emails per company is a normal outcome at 5 to 10 per company once ranking and --negate-summary apply.

Terminal window
discolike bulk estimate --domains-file companies.csv --per-company 10 \
--summary "growth marketing lead" --negate-summary "controller, accountant, bookkeeping"
{
"companies": 43210,
"contacts_available": 118004,
"contacts_capped": 118004,
"per_company": 10
}

REST endpoint: Contacts API. SDK: client.contacts.count().

Pull up to --per-company contacts for every domain in the file into one CSV, resumable by slice.

discolike bulk contacts [OPTIONS]

Uses the same filters as bulk estimate, with output and resume controls:

FlagTypeDefaultDescription
--domains-filepathrequiredCSV with a domain column, or one domain per line.
--per-companyint10Contacts per company the pull would ask for (1 to 100).
--icp-promptstrnoneNatural-language ICP prompt used to derive contact filters.
--summarystrnoneFilter by profile summary text (semantic search); ranks who comes back per company.
--negate-summarystrnoneExclude contacts matching this summary description.
--senioritystrnoneFilter by seniority level (repeatable).
--negate-senioritystrnoneExclude seniority levels (repeatable).
--departmentstrnoneFilter by department (repeatable).
--negate-departmentstrnoneExclude departments (repeatable).
--titlestrnoneFilter by job title (repeatable).
--negate-titlestrnoneExclude job titles (repeatable).
--person-countrystrnoneFilter by contact country (repeatable).
--person-statestrnoneFilter by contact state/region (repeatable).
--has-email / --no-has-emailboolonOnly contacts with an email address.
--exclusion-query-idstrnoneSaved query ID whose results are excluded (repeatable).
--paramstrnoneExtra API parameter as KEY=VALUE (comma-separates into a list); see the endpoint reference (repeatable).
--params-filepathnoneJSON object of API parameter names; --param and named flags override its values.
--outpathcontacts.csvCSV to append to; <out>.checkpoint tracks finished slices.
--overwriteflagoffIgnore an existing --out and its checkpoint and start clean.
--rate-limitint10Calls per minute to stay under on /contacts/discover.

Mechanics: /contacts/discover ignores offset when results_by_company is set, so the command paginates by slicing the domain list at 10000 / per-company domains per call, with results_by_company at --per-company and max_records at the slice’s cap. Each response is flattened to one row per contact (persona_id, first_name, last_name, name, title, seniority, department, email, email_validated, phone, linkedin, connections, domain, company_name, country, state, industry, employees, revenue_range, jobstart_date), de-duplicated on persona_id against the run and the rows already in the CSV, and appended; the slice index is then written to <out>.checkpoint. A rerun skips finished slices. Billing is net-new only with a 90-day cache, so a rerun after a crash does not re-charge for records already pulled.

domain, max_records, offset, results_by_company, and max_companies inside --params-file or --param are managed by the command and dropped with a note.

Terminal window
discolike bulk contacts --domains-file companies.csv --per-company 10 \
--summary "growth marketing lead" --negate-summary "controller, accountant, bookkeeping" \
--out contacts.csv
43,210 companies | 44 slice(s) of 1000 | 44 to run
slice 1/44: 2,391 contacts (2,391 this run)
slice 2/44: 2,402 contacts (4,793 this run)
...
{
"companies": 43210,
"slices": 44,
"slices_run": 44,
"contacts": 104388,
"out": "contacts.csv",
"checkpoint": "contacts.csv.checkpoint"
}

REST endpoint: Contacts API. SDK: client.contacts.discover() per slice.

Company profiles by domain: firmographics, scores, growth, redirects, vendors, subsidiaries, and public links. Every subcommand takes a required DOMAIN argument and is synchronous.

SDK equivalents for this whole group live on client.companies.

Full company profile (firmographics) for a domain.

discolike company data [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company data stripe.com
{
"domain": "stripe.com",
"name": "Stripe",
"status": {
"status": "active",
"confidence": 0.89
},
"score": 701,
"start_date": "2011-01-04",
"end_date": null,
"address": {
"street": "354 Oyster Point Blvd",
"city": "South San Francisco",
"state": "California",
"zip": "94080",
"country": "US"
},
"phones": [
"+16504279276",
"+18889262289"
],
...
}

REST endpoint: BizData API. SDK: client.companies.data().

Company score for a domain.

discolike company score [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company score stripe.com
{
"domain": "stripe.com",
"score": 701,
"parameters": {
"base_score": 688.0,
"recency_multiplier": 1.0,
"growth_boost": 12.06,
"lookback_360": 476,
"lookback_720": 291,
"expiration_penalty": 1.0
},
"first_event": "2011-01-04"
}

REST endpoint: Score API. SDK: client.companies.score().

Growth signals for a domain.

discolike company growth [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company growth stripe.com

REST endpoint: Growth API. SDK: client.companies.growth().

Domain redirects for a company domain.

discolike company redirects [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--matchstrnoneDomain match mode, e.g. loose.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company redirects stripe.com --match loose

REST endpoint: Redirects API. SDK: client.companies.redirects().

Vendors associated with a company domain.

discolike company vendors [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--matchstrnoneDomain match mode, e.g. loose.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company vendors stripe.com

REST endpoint: Vendors API. SDK: client.companies.vendors().

Subsidiaries of a company domain.

discolike company subsidiaries [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--matchstrnoneDomain match mode, e.g. loose.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company subsidiaries stripe.com --match loose

REST endpoint: Subsidiaries API. SDK: client.companies.subsidiaries().

Public profile links for a domain from a given source. --source is required.

discolike company public-links [OPTIONS] DOMAIN
FlagTypeDefaultDescription
DOMAIN (argument)strrequiredCompany domain, e.g. stripe.com.
--sourcestrrequiredPublic link source, e.g. crunchbase.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike company public-links stripe.com --source crunchbase

Omitting --source is a usage error and exits 2.

REST endpoint: PublicLink API. SDK: client.companies.public_links().

Find contacts: search and count by filters, look up or match individuals, and run bulk/generative discovery jobs. SDK equivalents live on client.contacts.

search, count and discover share one filter block, repeated in full in each table below.

Search contacts matching the given filters.

discolike contacts search [OPTIONS]
FlagTypeDefaultDescription
--icp-promptstrnoneNatural-language ICP prompt used to derive contact filters.
--senioritystrnoneFilter by seniority level (repeatable).
--negate-senioritystrnoneExclude seniority levels (repeatable).
--departmentstrnoneFilter by department (repeatable).
--negate-departmentstrnoneExclude departments (repeatable).
--titlestrnoneFilter by job title (repeatable).
--negate-titlestrnoneExclude job titles (repeatable).
--domainstrnoneFilter by company domain (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain.
--person-countrystrnoneFilter by contact country (repeatable).
--negate-person-countrystrnoneExclude contact countries (repeatable).
--filter-industrystrnoneFilter by company industry (repeatable).
--negate-filter-industrystrnoneExclude company industries (repeatable).
--filter-countrystrnoneFilter by company country (repeatable).
--negate-filter-countrystrnoneExclude company countries (repeatable).
--employee-rangestrnoneCompany employee range, e.g. 50-200.
--has-email / --no-has-emailboolunsetOnly contacts with (or without) an email address.
--jobstart-datestrnoneJob start date filter: min date or ‘min,max’ range, e.g. 2025-01-01 or 2025-01-01,2025-06-30.
--max-recordsintnoneMaximum number of contacts to return.
--offsetintnoneNumber of records to skip for pagination.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--paramstrnoneExtra key=value query parameter forwarded to the SDK (repeatable).
--namestrnoneFilter by contact name (partial match supported).
--summarystrnoneFilter by profile summary text (semantic search).
--negate-summarystrnoneExclude contacts matching this summary description.
--skillsstrnoneFilter by skill (repeatable).
--person-statestrnoneFilter by contact state/region (repeatable).
--persona-idintnoneFilter by persona ID (repeatable).
--filter-statestrnoneFilter by company state/region (repeatable).
--negate-filter-statestrnoneExclude contacts at companies in this state (repeatable).
--email-validatedboolnoneOnly contacts with (or without) a validated email address.
--has-phoneboolnoneOnly contacts with (or without) a phone number.
--has-mobileboolnoneOnly contacts with (or without) a mobile phone number.
--has-linkedinboolnoneOnly contacts with (or without) a LinkedIn profile.
--min-connectionsintnoneMinimum LinkedIn connections required.
--inclusion-query-idstrnoneInclude only contacts from companies in this saved query (repeatable).
--exclusion-query-idstrnoneExclude contacts from companies in this saved query (repeatable).
--max-companiesintnoneMaximum number of enriched companies to return; cannot be combined with —max-records.
--results-by-companyintnoneMaximum contacts per company domain (default 5; 0 removes the cap).
--include-search-contactsboolnoneInclude contacts from the search index (broader coverage).
--consensusintnoneNumber of query vectors to combine for consensus search.
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.
Terminal window
discolike contacts search --seniority vp --department marketing \
--domain stripe.com --has-email --max-records 5

--icp-text is not accepted here; it exists only on contacts generate.

REST endpoint: Contacts API. SDK: client.contacts.search().

Count contacts matching the given filters. Same filter block as search, without --max-records and --offset.

discolike contacts count [OPTIONS]
FlagTypeDefaultDescription
--icp-promptstrnoneNatural-language ICP prompt used to derive contact filters.
--senioritystrnoneFilter by seniority level (repeatable).
--negate-senioritystrnoneExclude seniority levels (repeatable).
--departmentstrnoneFilter by department (repeatable).
--negate-departmentstrnoneExclude departments (repeatable).
--titlestrnoneFilter by job title (repeatable).
--negate-titlestrnoneExclude job titles (repeatable).
--domainstrnoneFilter by company domain (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain.
--person-countrystrnoneFilter by contact country (repeatable).
--negate-person-countrystrnoneExclude contact countries (repeatable).
--filter-industrystrnoneFilter by company industry (repeatable).
--negate-filter-industrystrnoneExclude company industries (repeatable).
--filter-countrystrnoneFilter by company country (repeatable).
--negate-filter-countrystrnoneExclude company countries (repeatable).
--employee-rangestrnoneCompany employee range, e.g. 50-200.
--has-email / --no-has-emailboolunsetOnly contacts with (or without) an email address.
--jobstart-datestrnoneJob start date filter: min date or ‘min,max’ range, e.g. 2025-01-01 or 2025-01-01,2025-06-30.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--paramstrnoneExtra key=value query parameter forwarded to the SDK (repeatable).
--namestrnoneFilter by contact name (partial match supported).
--summarystrnoneFilter by profile summary text (semantic search).
--negate-summarystrnoneExclude contacts matching this summary description.
--skillsstrnoneFilter by skill (repeatable).
--person-statestrnoneFilter by contact state/region (repeatable).
--persona-idintnoneFilter by persona ID (repeatable).
--filter-statestrnoneFilter by company state/region (repeatable).
--negate-filter-statestrnoneExclude contacts at companies in this state (repeatable).
--email-validatedboolnoneOnly contacts with (or without) a validated email address.
--has-phoneboolnoneOnly contacts with (or without) a phone number.
--has-mobileboolnoneOnly contacts with (or without) a mobile phone number.
--has-linkedinboolnoneOnly contacts with (or without) a LinkedIn profile.
--min-connectionsintnoneMinimum LinkedIn connections required.
--inclusion-query-idstrnoneInclude only contacts from companies in this saved query (repeatable).
--exclusion-query-idstrnoneExclude contacts from companies in this saved query (repeatable).
--max-recordsintnoneMaximum number of contacts to count (20-10000).
--max-companiesintnoneMaximum number of enriched companies to return; cannot be combined with —max-records.
--offsetintnoneNumber of records to skip for pagination.
--results-by-companyintnoneMaximum contacts per company domain (default 5; 0 removes the cap).
--include-search-contactsboolnoneInclude contacts from the search index (broader coverage).
--consensusintnoneNumber of query vectors to combine for consensus search.
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.
Terminal window
discolike contacts count --seniority vp --domain stripe.com
{
"count": 56
}

REST endpoint: Contacts API. SDK: client.contacts.count().

Look up a single contact by persona ID, LinkedIn URL, or email.

discolike contacts lookup [OPTIONS]
FlagTypeDefaultDescription
--persona-idintnoneLook up by persona ID.
--linkedinstrnoneLook up by LinkedIn profile URL.
--emailstrnoneLook up by email address.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

All three identifiers are optional, and you can pass several at once - the API decides which to use.

Terminal window
discolike contacts lookup --email jane@example.com

REST endpoint: Contacts API. SDK: client.contacts.lookup().

Match a person name to contact records.

discolike contacts match [OPTIONS] NAME
FlagTypeDefaultDescription
NAME (argument)strrequiredFull name of the person to match.
--company-namestrnoneCompany name to narrow the match.
--domainstrnoneCompany domain to narrow the match.
--person-countrystrnoneContact country to narrow the match.
--limitintnoneMaximum number of matches to return.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike contacts match "Jane Doe" --company-name "Acme Corp" --domain acme.com --limit 5

REST endpoint: Contact Match API. SDK: client.contacts.match().

Match many person queries in one async job. Task family contactmatch.

discolike contacts bulk-match [OPTIONS]
FlagTypeDefaultDescription
--queries-filepathrequiredPath to a JSON file with an array of match query objects.
--enrich / --no-enrichboolunsetEnable or disable enrichment of matched contacts.
--limitintnoneMaximum number of matches per query.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

The file must parse as JSON and contain a top-level array; anything else exits 2.

Terminal window
discolike contacts bulk-match --queries-file queries.json --enrich --limit 5 --wait

Poll a non-waiting run with discolike discogen status <task_id> --family contactmatch.

REST endpoint: Contact Bulk Match API. SDK: client.contacts.bulk_match().

Discover contacts grouped by company for the given filters.

discolike contacts discover [OPTIONS]
FlagTypeDefaultDescription
--icp-promptstrnoneNatural-language ICP prompt used to derive contact filters.
--senioritystrnoneFilter by seniority level (repeatable).
--negate-senioritystrnoneExclude seniority levels (repeatable).
--departmentstrnoneFilter by department (repeatable).
--negate-departmentstrnoneExclude departments (repeatable).
--titlestrnoneFilter by job title (repeatable).
--negate-titlestrnoneExclude job titles (repeatable).
--domainstrnoneFilter by company domain (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain.
--person-countrystrnoneFilter by contact country (repeatable).
--negate-person-countrystrnoneExclude contact countries (repeatable).
--filter-industrystrnoneFilter by company industry (repeatable).
--negate-filter-industrystrnoneExclude company industries (repeatable).
--filter-countrystrnoneFilter by company country (repeatable).
--negate-filter-countrystrnoneExclude company countries (repeatable).
--employee-rangestrnoneCompany employee range, e.g. 50-200.
--has-email / --no-has-emailboolunsetOnly contacts with (or without) an email address.
--jobstart-datestrnoneJob start date filter: min date or ‘min,max’ range, e.g. 2025-01-01 or 2025-01-01,2025-06-30.
--max-recordsintnoneMaximum number of contacts to return.
--offsetintnoneNumber of records to skip for pagination.
--results-by-companyintnoneMaximum contacts returned per company.
--include-search-contacts / --no-include-search-contactsboolunsetInclude or exclude contacts from contact search in the results.
--consensusintnoneConsensus threshold for discovered contacts.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--paramstrnoneExtra key=value query parameter forwarded to the SDK (repeatable).
--namestrnoneFilter by contact name (partial match supported).
--summarystrnoneFilter by profile summary text (semantic search).
--negate-summarystrnoneExclude contacts matching this summary description.
--skillsstrnoneFilter by skill (repeatable).
--person-statestrnoneFilter by contact state/region (repeatable).
--persona-idintnoneFilter by persona ID (repeatable).
--filter-statestrnoneFilter by company state/region (repeatable).
--negate-filter-statestrnoneExclude contacts at companies in this state (repeatable).
--email-validatedboolnoneOnly contacts with (or without) a validated email address.
--has-phoneboolnoneOnly contacts with (or without) a phone number.
--has-mobileboolnoneOnly contacts with (or without) a mobile phone number.
--has-linkedinboolnoneOnly contacts with (or without) a LinkedIn profile.
--min-connectionsintnoneMinimum LinkedIn connections required.
--inclusion-query-idstrnoneInclude only contacts from companies in this saved query (repeatable).
--exclusion-query-idstrnoneExclude contacts from companies in this saved query (repeatable).
--max-companiesintnoneMaximum number of enriched companies to return; cannot be combined with —max-records.
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.
Terminal window
discolike contacts discover --domain stripe.com --seniority vp \
--results-by-company 5 --include-search-contacts --consensus 2

REST endpoint: Contacts API. SDK: client.contacts.discover().

Generate contacts for target domains from an ICP description (async job). The job is reported with task_family discogen, so poll it with --family discogen.

discolike contacts generate [OPTIONS]
FlagTypeDefaultDescription
--icp-textstrrequiredICP description used to generate contacts.
--domainstrnoneTarget company domain (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain. One of --domain or --domains-file is required.
--context-modestrnoneContext mode for generation.
--integration-idstrnoneIntegration ID to use for generation.
--search-provider-idstrnoneSearch provider ID to use for generation.
--search-context-sizestrnoneSearch context size for the search provider.
--max-contacts-per-domainintnoneMaximum contacts generated per domain.
--max-company-recordsintnoneMaximum company records to process.
--find-emailsflagoffRun the email finder over named, email-less rows before the job completes; fills email and email_status. Found addresses bill under the finder’s rules.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--full-domainstrnoneDomain to send as full_domains to the generation job (repeatable).
--partial-domainstrnoneDomain to send as partial_domains to the generation job (repeatable).
Terminal window
discolike contacts generate --icp-text "Heads of RevOps" \
--domain acme.com --domain beta.com --max-contacts-per-domain 5 --find-emails --wait

Without --find-emails, email is null unless a source showed it verbatim; chain discolike email find-batch on the returned names to look addresses up afterwards.

REST endpoint: Contacts API. SDK: client.contacts.generate().

Count companies matching the given filters. Counting is the cheap way to size a query before you run discover.

discolike count [OPTIONS]

The filter set is identical to discover minus --icp-prompt, --domain, --exclude-domain, --exclusion-query-id, --max-records and --offset.

FlagTypeDefaultDescription
--phrase-matchstrnonePhrase the company website must contain (repeatable).
--negate-phrase-matchstrnoneNegate the --phrase-match filter (repeatable).
--categorystrnoneIndustry category filter (repeatable).
--negate-categorystrnoneNegate the --category filter (repeatable).
--countrystrnoneISO country code filter (repeatable).
--negate-countrystrnoneNegate the --country filter (repeatable).
--statestrnoneState or region filter (repeatable).
--negate-statestrnoneNegate the --state filter (repeatable).
--sub-industrystrnoneSub-industry filter, bare or PARENT/SUB (repeatable).
--negate-sub-industrystrnoneNegate the --sub-industry filter (repeatable).
--geostrnoneCircular area as lat,lon or lat,lon,radius, e.g. 30.27,-97.74,30mi (repeatable). Radius defaults to 50km.
--bboxstrnoneBounding box as min_lat,min_lon,max_lat,max_lon (repeatable). Longitudes may wrap the antimeridian.
--latfloatnoneLatitude of the search centre; requires --lon.
--lonfloatnoneLongitude of the search centre; requires --lat.
--radiusstrnoneRadius around --lat/--lon, e.g. 50km or 30mi. Default 50km.
--employee-rangestrnoneEmployee count range filter.
--revenue-rangestrnoneRevenue range filter.
--business-modelstrnoneBusiness model filter (repeatable).
--negate-business-modelstrnoneNegate the --business-model filter (repeatable).
--tech-stackstrnoneTechnology stack filter (repeatable).
--negate-tech-stackstrnoneNegate the --tech-stack filter (repeatable).
--min-digital-footprintintnoneMinimum digital footprint score.
--max-digital-footprintintnoneMaximum digital footprint score.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--paramstrnoneExtra API parameter as KEY=VALUE (comma-separates into a list); see the endpoint reference (repeatable).
--subdomainstrnoneLimit results to this subdomain, up to 20, each at least 3 characters (repeatable).
--negate-subdomainstrnoneExclude this subdomain, up to 20, each at least 3 characters (repeatable).
--languagestrnoneFilter by site language as an ISO 639-1 code, e.g. en, de, pb, zt (repeatable).
--negate-languagestrnoneExclude this site language (repeatable); same values as —language.
--socialstrnoneFilter by social platform presence (repeatable): facebook, instagram, linkedin, pinterest, threads, tiktok, twitter, x, yelp, youtube, googleplay, applestore, amazon, vk, bluesky, xing.
--negate-socialstrnoneExclude companies with this social profile (repeatable); same values as —social.
--start-datestrnoneMinimum company start date (YYYY-MM-DD) or range (YYYY-MM-DD,YYYY-MM-DD).
--redirectboolnoneInclude or exclude domains that redirect to another domain.
--exclude-leadgenboolnoneExclude suspected lead generation sites (off by default for count).
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.
Terminal window
discolike count --category SOFTWARE --country US
{
"count": 68900
}
Terminal window
discolike count --country DE --employee-range 50-200
{
"count": 1510010
}

A malformed --param fails before any request is made:

Terminal window
discolike count --param bogus
Usage: discolike count [OPTIONS]
Try 'discolike count --help' for help.
╭─ Error ──────────────────────────────────────────────────────────────────────╮
│ Invalid value: --param must be in KEY=VALUE form, got 'bogus' │
╰──────────────────────────────────────────────────────────────────────────────╯

REST endpoint: Count API. SDK equivalent: client.count().

Run DiscoGen research jobs and check status of or cancel any async task (see --family). SDK equivalents live on client.discogen; job handling is covered in Job.

Run a DiscoGen research query across company domains (async job).

discolike discogen run [OPTIONS]
FlagTypeDefaultDescription
--querystrrequiredResearch query to run.
--domainstrnoneCompany domain to research (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain. One of --domain or --domains-file is required.
--integration-idstrnoneIntegration ID to use for the run.
--web-search / --no-web-searchboolunsetToggle web search during research.
--context-modestrnoneContext mode; see the endpoint reference.
--include-x-search / --no-include-x-searchboolunsetToggle including X search in the research.
--typed-columns / --no-typed-columnsboolunsetLet the detector answer yes/no, fixed-set and scale columns with a TypeSafe judgment model.
--include-confidence / --no-include-confidenceboolunsetAdd a confidence column beside each typed column.
--search-provider-idstrnoneSearch provider ID to use for web search.
--search-context-sizestrnoneSearch context size; see the endpoint reference.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike discogen run --query "Recent funding rounds" \
--domain stripe.com --domain adyen.com --web-search --wait --timeout 600

REST endpoint: DiscoGen API. SDK: client.discogen.process().

Run a DiscoGen research query across personas (async job). Identical to run except that --persona-id replaces --domain.

discolike discogen run-personas [OPTIONS]
FlagTypeDefaultDescription
--querystrrequiredResearch query to run.
--persona-idintrequiredPersona ID to research (repeatable).
--integration-idstrnoneIntegration ID to use for the run.
--web-search / --no-web-searchboolunsetToggle web search during research.
--context-modestrnoneContext mode; see the endpoint reference.
--include-x-search / --no-include-x-searchboolunsetToggle including X search in the research.
--typed-columns / --no-typed-columnsboolunsetLet the detector answer yes/no, fixed-set and scale columns with a TypeSafe judgment model.
--include-confidence / --no-include-confidenceboolunsetAdd a confidence column beside each typed column.
--search-provider-idstrnoneSearch provider ID to use for web search.
--search-context-sizestrnoneSearch context size; see the endpoint reference.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike discogen run-personas --query "Career history" --persona-id 1 --persona-id 2

REST endpoint: DiscoGen API. SDK: client.discogen.process_personas().

List the models available for DiscoGen research.

discolike discogen models [OPTIONS]
FlagTypeDefaultDescription
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike discogen models
{
"models": {
"openai": [
{
"name": "o4-mini",
"supports_web_search": true
},
{
"name": "gpt-5-pro",
"supports_web_search": true
},
...
],
...
}
}

REST endpoint: DiscoGen API. SDK: client.discogen.models().

Show the status and progress of an async task. This is the polling command for every async job in the CLI, not just DiscoGen.

discolike discogen status [OPTIONS] TASK_ID
FlagTypeDefaultDescription
TASK_ID (argument)strrequiredTask ID returned when the job was started.
--familydiscogen | bulkmatch | contactmatch | segmentdiscogenTask family the task_id belongs to (bulk match jobs are ‘bulkmatch’, segment jobs ‘segment’, contact bulk-match ‘contactmatch’).
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike discogen status dg-4
Terminal window
discolike discogen status seg-1 --family segment

Any other --family value is a usage error and exits 2.

SDK: Job.status().

Cancel an async task. Output is always JSON: {"cancelled": "<task_id>"}.

discolike discogen cancel [OPTIONS] TASK_ID
FlagTypeDefaultDescription
TASK_ID (argument)strrequiredTask ID returned when the job was started.
--familydiscogen | bulkmatch | contactmatch | segmentdiscogenTask family the task_id belongs to (bulk match jobs are ‘bulkmatch’, segment jobs ‘segment’, contact bulk-match ‘contactmatch’).
Terminal window
discolike discogen cancel bm-1 --family bulkmatch

SDK: Job.cancel().

Discover companies matching your ICP and filters.

discolike discover [OPTIONS]
FlagTypeDefaultDescription
--icp-promptstrnoneNatural-language ideal customer profile description.
--domainstrnoneSeed domain for lookalike matching (repeatable).
--phrase-matchstrnonePhrase the company website must contain (repeatable).
--negate-phrase-matchstrnoneNegate the --phrase-match filter (repeatable).
--categorystrnoneIndustry category filter (repeatable).
--negate-categorystrnoneNegate the --category filter (repeatable).
--countrystrnoneISO country code filter (repeatable).
--negate-countrystrnoneNegate the --country filter (repeatable).
--statestrnoneState or region filter (repeatable).
--negate-statestrnoneNegate the --state filter (repeatable).
--sub-industrystrnoneSub-industry filter, bare or PARENT/SUB (repeatable).
--negate-sub-industrystrnoneNegate the --sub-industry filter (repeatable).
--geostrnoneCircular area as lat,lon or lat,lon,radius, e.g. 30.27,-97.74,30mi (repeatable). Radius defaults to 50km.
--bboxstrnoneBounding box as min_lat,min_lon,max_lat,max_lon (repeatable). Longitudes may wrap the antimeridian.
--latfloatnoneLatitude of the search centre; requires --lon.
--lonfloatnoneLongitude of the search centre; requires --lat.
--radiusstrnoneRadius around --lat/--lon, e.g. 50km or 30mi. Default 50km.
--employee-rangestrnoneEmployee count range filter.
--revenue-rangestrnoneRevenue range filter.
--business-modelstrnoneBusiness model filter (repeatable).
--negate-business-modelstrnoneNegate the --business-model filter (repeatable).
--tech-stackstrnoneTechnology stack filter (repeatable).
--negate-tech-stackstrnoneNegate the --tech-stack filter (repeatable).
--min-digital-footprintintnoneMinimum digital footprint score.
--max-digital-footprintintnoneMaximum digital footprint score.
--exclude-domainstrnoneDomain to exclude from results (repeatable).
--exclude-domains-filepathnoneCSV with a domain column, or one domain per line; merged with --exclude-domain (100 domains max, checked before the request).
--exclusion-query-idstrnoneSaved query ID whose results are excluded (repeatable).
--max-recordsintnoneMaximum number of companies to return.
--offsetintnoneNumber of records to skip for pagination.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--paramstrnoneExtra API parameter as KEY=VALUE (comma-separates into a list); see the endpoint reference (repeatable).
--subdomainstrnoneLimit results to this subdomain, up to 20, each at least 3 characters (repeatable).
--negate-subdomainstrnoneExclude this subdomain, up to 20, each at least 3 characters (repeatable).
--languagestrnoneFilter by site language as an ISO 639-1 code, e.g. en, de, pb, zt (repeatable).
--negate-languagestrnoneExclude this site language (repeatable); same values as —language.
--socialstrnoneFilter by social platform presence (repeatable): facebook, instagram, linkedin, pinterest, threads, tiktok, twitter, x, yelp, youtube, googleplay, applestore, amazon, vk, bluesky, xing.
--negate-socialstrnoneExclude companies with this social profile (repeatable); same values as —social.
--start-datestrnoneMinimum company start date (YYYY-MM-DD) or range (YYYY-MM-DD,YYYY-MM-DD).
--min-similarityintnoneMinimum similarity score to include (0-99).
--variancestrnoneResult diversity control: LOW, MID_LOW, MEDIUM, MID_HIGH, HIGH, UNRESTRICTED.
--consensusintnoneNumber of top results for the consensus search vector (1-20); higher reduces specificity.
--redirectboolnoneInclude or exclude domains that redirect to another domain.
--exclude-leadgenboolnoneExclude suspected lead generation sites (on by default).
--retrievalboolnoneEnable page data retrieval using the Extract API.
--enhancedboolnoneEnable AI-powered result enhancement for improved relevance.
--include-search-domainsboolnoneInclude the input domains in results (excluded by default).
--auto-icp-textboolnoneAuto-generate ICP text from the provided domain(s).
--auto-phrase-matchboolnoneAuto-generate phrase matches from ICP text.
--inclusion-query-idstrnoneSaved query ID whose domains are included (repeatable); requires the STARTER plan.
--params-filepathnoneJSON object of API parameter names (an app form copied over); --param and named flags override its values.

Repeatable flags accumulate into a list, so --country US --country CA sends both values.

Every --geo circle, every --bbox box and the --lat/--lon/--radius centre are OR’d together, up to 10 shapes per query: discolike discover --geo 30.27,-97.74,30mi --geo 52.52,13.405 searches both areas.

--param is the escape hatch for filters that have no dedicated flag. It splits on the first =, and a value containing a comma becomes a list - --param social=linkedin,youtube sends social=linkedin&social=youtube. A value with no = is a usage error (exit 2); a value the API schema rejects exits 2 before the request is sent. Named flags win over --param for the same key: --country DE --param country=US sends country=DE.

--params-file form.json loads a whole request from a JSON object keyed by API parameter names, the shape you get by copying an app form over; it sits under --param, which sits under the named flags. The file is validated against the request schema before anything is sent, so a bad enum value exits 2 with no request made.

Terminal window
discolike discover --params-file form.json --param consensus=3 --variance MID_HIGH --max-records 100
Terminal window
discolike discover --icp-prompt "B2B payments infrastructure" \
--country US --employee-range 50-200 --max-records 3
Terminal window
discolike discover --domain stripe.com --domain adyen.com \
--negate-country RU --exclude-domain stripe.com --max-records 3

REST endpoint: Discover API. SDK equivalent: client.discover().

Find work email addresses: submit single or batch find jobs, poll them, and fetch results. Only proven addresses bill; catch-all and pattern guesses are free.

Every submission is asynchronous. find and find-batch return an ID immediately; add --wait to block until the result is ready, or poll later with email job and email results. SDK equivalents live on client.email.

Email jobs use their own IDs and their own polling commands, separate from discogen status.

Submit a single email find job (async); only a proven address bills.

discolike email find [OPTIONS] FIRST_NAME LAST_NAME DOMAIN
FlagTypeDefaultDescription
FIRST_NAME (argument)strrequiredFirst name of the person.
LAST_NAME (argument)strrequiredLast name of the person.
DOMAIN (argument)strrequiredCompany domain to search, e.g. acme.com.
--known-patternstrnoneKnown email local-part pattern for this domain, e.g. first.last.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

Without --wait the command prints the job ID and the command that polls it. The payload is a single object, so it always prints as JSON regardless of --format.

Terminal window
discolike email find Patrick Collison stripe.com
{
"job_id": "98e10684-a270-4167-85a6-dc638bcf3791",
"hint": "poll with: discolike email job 98e10684-a270-4167-85a6-dc638bcf3791"
}

With --wait the command blocks and prints the enumeration result instead, writing status: <value> lines to stderr on each poll.

Terminal window
discolike email find Patrick Collison stripe.com --wait --timeout 120

Pass --known-pattern when you already know how a domain builds its addresses; it is omitted from the request entirely when you leave it off.

Terminal window
discolike email find Ada Lovelace acme.com --known-pattern first.last --wait

REST endpoint: Email Find API. SDK: client.email.find().

Submit an email find batch from a CSV file and/or inline contacts (async).

discolike email find-batch [OPTIONS]
FlagTypeDefaultDescription
--contacts-filepathnonePath to a CSV file with first_name,last_name,domain columns (max 500 contacts per batch).
--contactstrnoneInline contact as “first_name,last_name,domain” (repeatable).
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

Provide --contacts-file, one or more --contact, or both; the two sources are concatenated, file rows first. Supplying neither exits 2, and so does a total above 500 contacts or a CSV missing any of the three required columns.

Terminal window
discolike email find-batch --contacts-file people.csv \
--contact "Ada,Lovelace,acme.com" --wait --timeout 600

Without --wait you get the batch ID and the command that fetches it:

{
"batch_id": "7f6f0a4e-52f7-4f3e-9c2d-0b8d3f1c9a11",
"hint": "fetch with: discolike email results 7f6f0a4e-52f7-4f3e-9c2d-0b8d3f1c9a11"
}

With --wait the progress lines on stderr read progress: <completed>/<total> completed, <failed> failed.

REST endpoint: Email Find API. SDK: client.email.find_batch().

Fetch results for an email find or verify batch.

discolike email results [OPTIONS] BATCH_ID
FlagTypeDefaultDescription
BATCH_ID (argument)strrequiredBatch ID returned by discolike email find-batch.
--kindfind | verifyfindBatch kind: find or verify (verify batches are created by the DiscoLike app).
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

Without --wait the command fetches one snapshot and prints it even if the batch is still running, so completed and total can disagree. Any other --kind value is a usage error and exits 2.

--kind selects how each result is decoded: find reads them as enumeration results, verify as validation results. Pass the --kind that matches the batch.

Terminal window
discolike email results 7f6f0a4e-52f7-4f3e-9c2d-0b8d3f1c9a11 --wait
Terminal window
discolike email results <batch_id> --kind verify

REST endpoint: Email Find API. SDK: client.email.batch().

Poll a single email find job: print its current status, or block with --wait. The command is find-only and has no --kind flag; rehydrating a verify job needs the SDK’s client.email.job(job_id, kind="verify").

discolike email job [OPTIONS] JOB_ID
FlagTypeDefaultDescription
JOB_ID (argument)strrequiredJob ID returned by discolike email find.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

Without --wait you get the job wrapper: lifecycle status on the outside, the enumeration result nested under result:

Terminal window
discolike email job 98e10684-a270-4167-85a6-dc638bcf3791
{
"job_id": "98e10684-a270-4167-85a6-dc638bcf3791",
"status": "completed",
"result": {
"first_name": "patrick",
"last_name": "collison",
"domain": "stripe.com",
"status": "catch_all_pattern",
"result": {
"email": "patrick.collison@stripe.com",
"pattern": "first.last",
"tier": 1,
"smtp_code": 0,
"valid": false
},
"is_catch_all": true,
"mx_host": "aspmx3.googlemail.com",
"provider": "Everything Else",
"attempts": 0,
"duration_ms": 1473,
"error": null
},
"error": null
}

With --wait the wrapper is stripped and only the enumeration result is printed:

Terminal window
discolike email job 98e10684-a270-4167-85a6-dc638bcf3791 --wait --timeout 120
{
"first_name": "patrick",
"last_name": "collison",
"domain": "stripe.com",
"status": "catch_all_pattern",
"result": {
"email": "patrick.collison@stripe.com",
"pattern": "first.last",
"tier": 1,
"smtp_code": 0,
"valid": false
},
"is_catch_all": true,
"mx_host": "aspmx3.googlemail.com",
"provider": "Everything Else",
"attempts": 0,
"duration_ms": 1473,
"error": null
}

Polling is free; only the original find can bill, and only when it proves an address. The two status fields mean different things: the outer one is the job lifecycle, the inner one is the enumeration outcome. See Email Find for every value the inner status can take.

REST endpoint: Email Find API. SDK: client.email.job().

Extract page content from a URL.

discolike extract [OPTIONS] URL
FlagTypeDefaultDescription
URL (argument)strrequiredPage URL to extract content from.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--domainstrnoneBare domain to extract instead of URL (alias for https://DOMAIN, served from cache).
Terminal window
discolike extract https://stripe.com/about
{
"text": "Stripe | Financial Infrastructure to Grow Your Revenue Products Solutions Developers Resources Pricing Sign in Start now Contact sales ...",
"language": "en"
}

REST endpoint: Extract API. SDK equivalent: client.companies.extract().

Manage BYOK LLM provider integrations (OpenAI, Anthropic, custom endpoints). SDK equivalents live on client.llm_providers; the REST surface is the LLM Providers API.

List LLM provider integrations for the organization.

discolike llm-providers list [OPTIONS]
FlagTypeDefaultDescription
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike llm-providers list
{
"providers": [
{
"integration_id": "1f5e8466-fda4-4d4e-88eb-4b0886c37003",
"integration_name": "grok-4.5-latest",
"provider": "xai",
"api_key": "*****",
"model_name": "xai/grok-4.5-latest",
"base_url": null,
"supports_web_search": true,
"input_cost_per_token": 2e-06,
"output_cost_per_token": 6e-06,
"is_default": true,
"model_deprecated": false
},
...
]
}

Create an LLM provider integration. No --format flag.

discolike llm-providers create [OPTIONS]
FlagTypeDefaultDescription
--namestrrequiredUser-friendly name for the integration.
--providerstrrequiredLLM provider name: openai, anthropic, or custom. Free-form text - not validated against a list.
--api-keystrrequiredAPI key for the provider.
--model-namestrrequiredDefault model name for this integration.
--base-urlstrnoneEndpoint URL (required for the custom provider).
Terminal window
discolike llm-providers create --name OpenAI --provider openai \
--api-key sk-... --model-name gpt-4o

Get a single LLM provider integration by ID.

discolike llm-providers get [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the LLM provider integration to fetch.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike llm-providers get 1f5e8466-fda4-4d4e-88eb-4b0886c37003
{
"integration_id": "1f5e8466-fda4-4d4e-88eb-4b0886c37003",
"integration_name": "grok-4.5-latest",
"provider": "xai",
"api_key": "*****",
"model_name": "xai/grok-4.5-latest",
"base_url": null,
"supports_web_search": true,
"input_cost_per_token": 2e-06,
"output_cost_per_token": 6e-06,
"is_default": true,
"model_deprecated": false
}

Update an LLM provider integration. --name, --provider and --model-name are required on every update. Omitting --api-key keeps the stored key. No --format flag.

discolike llm-providers update [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the LLM provider integration to update.
--namestrrequiredUser-friendly name for the integration.
--providerstrrequiredLLM provider name: openai, anthropic, or custom.
--model-namestrrequiredDefault model name for this integration.
--api-keystrnoneNew API key (omit to keep the stored key).
--base-urlstrnoneEndpoint URL (required for the custom provider).
Terminal window
discolike llm-providers update 1f5e8466-fda4-4d4e-88eb-4b0886c37003 \
--name Anthropic --provider anthropic --model-name claude-sonnet-4-5

Delete an LLM provider integration (admin only). Prints {"deleted": "<integration_id>"}.

discolike llm-providers delete [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the LLM provider integration to delete.
Terminal window
discolike llm-providers delete 1f5e8466-fda4-4d4e-88eb-4b0886c37003

Set an LLM provider integration as the organization default (admin only). The default is used whenever a command omits --integration-id.

discolike llm-providers set-default [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the integration to make the organization default.
Terminal window
discolike llm-providers set-default 1f5e8466-fda4-4d4e-88eb-4b0886c37003

Test a provider configuration before saving it. Nothing is persisted. No --format flag.

discolike llm-providers test-connection [OPTIONS]
FlagTypeDefaultDescription
--namestrcli-testName to label the test configuration.
--providerstrrequiredLLM provider name: openai, anthropic, or custom.
--api-keystrrequiredAPI key for the provider.
--model-namestrrequiredModel name to test against.
--base-urlstrnoneEndpoint URL (required for the custom provider).
Terminal window
discolike llm-providers test-connection --provider openai \
--api-key sk-... --model-name gpt-4o

Match a company name to a domain, or bulk-match a CSV of names.

discolike match [OPTIONS] [NAME]
FlagTypeDefaultDescription
NAME (argument)strnoneCompany name to match to a domain. Optional, but exactly one of NAME or --file is required.
--phonestrnonePhone number to disambiguate the match.
--citystrnoneCity to disambiguate the match.
--statestrnoneState or region to disambiguate the match.
--countrystrnoneCountry to disambiguate the match.
--zip-codestrnoneZIP or postal code to disambiguate the match.
--strict / --no-strictboolunsetToggle strict matching. Omitted from the request entirely when neither form is passed.
--local-mode / --no-local-modeboolunsetToggle local matching mode. Omitted from the request entirely when neither form is passed.
--filepathnoneCSV of company names to bulk-match as an async job (instead of NAME).
--name-columnstrnameColumn in --file that holds company names.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--min-match-confidenceintnoneMinimum match_confidence (inclusive, 50-100) a match must have to be returned.
--phone-columnstrnoneColumn in —file that holds phone numbers.
--city-columnstrnoneColumn in —file that holds cities.
--state-columnstrnoneColumn in —file that holds states.
--country-columnstrnoneColumn in —file that holds country codes.
--zip-code-columnstrnoneColumn in —file that holds zip codes.

Passing both NAME and --file, or neither, is a usage error (exit 2). With NAME the call is synchronous; with --file it starts a bulkmatch job.

Terminal window
discolike match "Stripe Inc"
{
"query": {
"name": "Stripe Inc",
"country": null,
"state": null,
"city": null,
"zip": null,
"phones": null
},
"matches": [
{
"domain": "stripe.com",
"name": "Stripe",
"status": {
"status": "active",
"confidence": 0.89
},
"score": 701,
"start_date": "2011-01-04",
"end_date": null,
"address": {
"street": "354 Oyster Point Blvd",
"city": "South San Francisco",
"state": "California",
"zip": "94080",
"country": "US"
},
"phones": [
"+16504279276",
"+18889262289"
],
...
}
]
}

Disambiguate with location fields when the name is ambiguous:

Terminal window
discolike match "Acme" --city Boston --state MA --country US --strict

Bulk-match a CSV and wait for the job to finish:

Terminal window
discolike match --file names.csv --name-column company --wait --timeout 600

REST endpoints: Match API for a single name, Bulk Match API for --file. SDK equivalents: client.match.company() and client.match.bulk().

Manage saved queries and exclusion lists for reusable targeting. SDK equivalents live on client.queries; the REST surface is the Queries API.

List saved queries.

discolike queries list [OPTIONS]
FlagTypeDefaultDescription
--max-recordsintnoneMaximum number of saved queries to return.
--offsetintnoneNumber of records to skip for pagination.
--actionstrnoneFilter by query action, e.g. discover. Free-form text - not validated against a list.
--tagstrnoneFilter by tag (repeatable).
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike queries list --max-records 1 --action discover
{
"results": [
{
"query_id": "e15abe19-a8dc-41ca-8c79-38047ede6450",
"query_name": "USA law firms in United States",
"action": "discover",
"user_name": "George Rekouts",
"mtime": "2026-08-19T20:25:35.912744",
"domains": [
"legalpages.co.uk",
"myfamilyattorneys.com",
...
],
...
}
]
}

Create a named exclusion list of domains and/or persona IDs. No --format flag.

discolike queries create-exclusion-list [OPTIONS]
FlagTypeDefaultDescription
--namestrrequiredName for the new exclusion list.
--domainstrnoneDomain to exclude (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line; merged with --domain.
--persona-idintnonePersona ID to exclude (repeatable).
--tagstrnoneTag to attach to the list (repeatable).
Terminal window
discolike queries create-exclusion-list --name "Current customers" \
--domain acme.com --domain beta.com --tag crm

A page of 10,000 discover results goes in from its CSV:

Terminal window
discolike queries create-exclusion-list --name "tam-round-1" --domains-file round1.csv --tag tam

Feed the resulting query ID back into discovery with discolike discover --exclusion-query-id <id>.

Save result rows from a file as a reusable saved query. No --format flag.

discolike queries save-results [OPTIONS]
FlagTypeDefaultDescription
--inputpathrequiredPath to a .json (list of row objects) or .csv (header row) file.
--namestrrequiredName for the saved query.
--actiondiscover | segment | contacts | append | matchrequiredUnderlying action: discover, segment, contacts, append, or match.
--domain-columnstrdomainColumn holding domains.
--tagstrnoneTag to attach (repeatable).

The file suffix decides the parser: .csv (case-insensitive) is read with a CSV reader and every value stays a string; anything else is parsed as JSON. A missing file or invalid JSON is a usage error (exit 2), as is an --action outside the five choices.

Terminal window
discolike queries save-results --input rows.json --name "Q3 targets" --action discover
Terminal window
discolike queries save-results --input rows.csv --name "Q3 targets" \
--action discover --domain-column website --tag q3

Rename a saved query and/or update its tags. No --format flag.

discolike queries update [OPTIONS] QUERY_ID
FlagTypeDefaultDescription
QUERY_ID (argument)strrequiredID of the saved query to update.
--namestrnoneNew name for the saved query.
--tagstrnoneTag to set on the query (repeatable).
Terminal window
discolike queries update e15abe19-a8dc-41ca-8c79-38047ede6450 --name "Renamed" --tag hot

Delete a saved query. No options beyond the argument; prints {"deleted": "<query_id>"}.

discolike queries delete [OPTIONS] QUERY_ID
FlagTypeDefaultDescription
QUERY_ID (argument)strrequiredID of the saved query to delete.
Terminal window
discolike queries delete e15abe19-a8dc-41ca-8c79-38047ede6450

Manage BYOK web search provider integrations (Tavily, Serper, etc.). SDK equivalents live on client.search_providers; the REST surface is the Search Providers API.

List search provider integrations for the organization.

discolike search-providers list [OPTIONS]
FlagTypeDefaultDescription
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike search-providers list
{
"providers": [
{
"integration_id": "fd467f7f-11c1-4475-923a-f2c3341e41bb",
"integration_name": "Serper",
"provider": "serper",
"search_model": "serper/search",
"encrypted_api_key": null,
"api_key": "*****",
"base_url": null,
"is_default": true,
"cost_per_query": 0.001
},
...
]
}

Create a search provider integration (connectivity is validated first). No --format flag.

discolike search-providers create [OPTIONS]
FlagTypeDefaultDescription
--namestrrequiredUser-friendly name for the integration.
--providerstrrequiredSearch provider key, e.g. tavily or serper.
--search-modelstrrequiredSearch model key, e.g. tavily/search.
--api-keystrnoneProvider API key (omit for free providers).
--base-urlstrnoneCustom endpoint URL for a LiteLLM proxy.
Terminal window
discolike search-providers create --name Tavily --provider tavily \
--search-model tavily/search --api-key tvly-...

Update a search provider integration. --name, --provider and --search-model are required on every update - this is a full replace, not a patch. No --format flag.

discolike search-providers update [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the search provider integration to update.
--namestrrequiredUser-friendly name for the integration.
--providerstrrequiredSearch provider key, e.g. tavily or serper.
--search-modelstrrequiredSearch model key, e.g. tavily/search.
--api-keystrnoneNew provider API key (omit to keep the stored key).
--base-urlstrnoneCustom endpoint URL for a LiteLLM proxy.
Terminal window
discolike search-providers update fd467f7f-11c1-4475-923a-f2c3341e41bb \
--name Serper --provider serper --search-model serper/search

Delete a search provider integration (admin only). Prints {"deleted": "<integration_id>"}.

discolike search-providers delete [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the search provider integration to delete.
Terminal window
discolike search-providers delete fd467f7f-11c1-4475-923a-f2c3341e41bb

Set a search provider integration as the organization default (admin only).

discolike search-providers set-default [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the integration to make the organization default.
Terminal window
discolike search-providers set-default fd467f7f-11c1-4475-923a-f2c3341e41bb

Remove the default flag from a search provider integration (admin only).

discolike search-providers clear-default [OPTIONS] INTEGRATION_ID
FlagTypeDefaultDescription
INTEGRATION_ID (argument)strrequiredID of the integration currently set as default.
Terminal window
discolike search-providers clear-default fd467f7f-11c1-4475-923a-f2c3341e41bb

List available search models grouped by provider, with cost per query. Use this to find the exact --search-model value for create and update.

discolike search-providers models [OPTIONS]
FlagTypeDefaultDescription
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike search-providers models
{
"models": {
"apiserpent": [
{
"name": "apiserpent/search/google",
"cost_per_query": 0.0006
},
{
"name": "apiserpent/search/bing",
"cost_per_query": 0.0006
},
...
],
...
}
}

Auto-segment a list of domains (async job). The task family is segment.

discolike segment [OPTIONS]
FlagTypeDefaultDescription
--domainstrnoneDomain to segment (repeatable).
--filepathnoneCSV of domains to segment (instead of --domain).
--domain-columnstrnoneColumn in --file that holds domains.
--max-segmentsintnoneMaximum number of segments to produce. 2-20 with --domain, 2-100 with --file.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
--query-idstrnoneSaved query ID whose domains are included alongside the file/—domain ones (repeatable).

Pass exactly one of --domain or --file; both or neither is a usage error (exit 2).

Terminal window
discolike segment --domain acme.com --domain beta.com --max-segments 3

Without --wait the command prints a job handle - task_id, task_family (segment), and a hint string with the exact discolike discogen status command to poll it - and exits immediately.

Terminal window
discolike segment --file domains.csv --domain-column domain --wait --timeout 600

REST endpoint: Segment API. SDK equivalent: client.segment() for --domain, client.segment_file() for --file.

Create a DiscoLike account for a person. No login needed; they confirm by email. This is the one command that works before discolike auth login.

discolike signup [OPTIONS]
FlagTypeDefaultDescription
--emailstrrequiredThe person’s work email. Becomes the login.
--first-namestrrequired1-40 characters. Must contain a letter and no angle brackets or control characters.
--last-namestrrequiredSame rules as --first-name.
--agentstrnoneAgent or framework name to record with the signup. Defaults to discolike-cli/<version>.
--yes, -yflagoffSkip the confirmation when signing up a different email than last time.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).
Terminal window
discolike signup --email jane@acme.com --first-name Jane --last-name Doe
{
"status": "created",
"email": "jane@acme.com",
"org_domain": "acme.com",
"org_status": "created",
"next_step": "A confirmation email was sent to jane@acme.com. Log in at https://app.discolike.com. Google or Microsoft sign-in with this email also works, no password needed."
}

Relay next_step to the person: they confirm by email, log in at app.discolike.com, pick a plan, and issue an API key for discolike auth login.

The command remembers the email it signed up. Running it again with a different email asks for confirmation first, and on a non-TTY exits 1 telling you to re-run with --yes, so an agent cannot quietly create a second account.

REST endpoint: Signup API. SDK equivalent: signup(). Per-agent instructions: Agent signup guide.

Validate a list of domains against an ICP definition (async job).

discolike validate-icp [OPTIONS]
FlagTypeDefaultDescription
--icpstrrequiredICP definition text to validate the domains against.
--domainstrnoneDomain to validate (repeatable).
--domains-filepathnoneCSV with a domain column, or one domain per line (instead of --domain).
--filepathnoneOlder spelling of --domains-file.
--context-modestrnoneContext mode; see the endpoint reference.
--integration-idstrnoneIntegration ID to use for the validation.
--web-search / --no-web-searchboolunsetToggle web search during validation.
--search-provider-idstrnoneSearch provider ID to use for web search.
--waitflagoffBlock until the job finishes, streaming progress to stderr.
--timeoutfloat900.0Max seconds to wait with --wait.
--formatstrnoneOutput format: json or table (table auto-selected on a TTY; falls back to JSON for non-tabular data).

Pass exactly one of --domain or --domains-file (--file is the older spelling of the same flag); both or neither is a usage error (exit 2). The file is a CSV with a domain column, or plain text with one domain per line; domains are lower-cased, stripped of www., and de-duplicated.

Terminal window
discolike validate-icp --icp "Mid-market SaaS selling to finance teams" \
--domain acme.com --domain beta.com
Terminal window
discolike validate-icp --icp "Mid-market SaaS" --domains-file domains.txt \
--web-search --wait --timeout 600

REST endpoint: Validate API. SDK equivalent: client.validate_icp().