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).

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.

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": "CA",
"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).
--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).
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).
--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).
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).
--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).
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.
--domainstrrequiredTarget company domain (repeatable).
--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.
--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 contacts generate --icp-text "Heads of RevOps" \
--domain acme.com --domain beta.com --max-contacts-per-domain 5 --wait

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).
--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).
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.
--domainstrrequiredCompany domain 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.
--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.
--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).
--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).
--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).

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

--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.

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).
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).

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": "CA",
"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).
--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

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).

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).
--filepathnoneText file with one domain per line (instead of --domain).
--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 --file; both or neither is a usage error (exit 2). A --file is read as plain text, one domain per line, with blank lines skipped.

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" --file domains.txt \
--web-search --wait --timeout 600

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