discolike-cli
Official CLI for the DiscoLike API — the discolike command from your terminal. Built on the discolike SDK.
Installation
pip install discolike-cli
Or run it without installing:
uvx --from discolike-cli discolike --help
Requires Python 3.11+. Installing this package gives you the discolike command.
Authentication
discolike auth login
Opens your browser to log in (add --no-browser to print the URL instead, --port to pin the loopback port when forwarding over SSH). To use an API key instead, pass --api-key KEY or --method api_key to be prompted; create a key at app.discolike.com/account/management/keys. You can also set DISCOLIKE_API_KEY in the environment instead.
Quickstart
discolike discover --icp-prompt "managed IT services for SMBs" --country US --max-records 25
discolike match "Stripe Inc" --city "San Francisco"
discolike match --file companies.csv --name-column company_name --wait
discolike count --phrase-match "book a demo" --country US
discolike company data stripe.com
discolike extract https://stripe.com/enterprise
Top-level commands: discover, count, match, extract, validate-icp, append, segment — plus auth, bulk, company, contacts, discogen, prospecting, queries, account, search-providers, and llm-providers command groups.
Volume pulls
discolike bulk walks past the 10,000-per-search ceiling and pulls contacts for a whole domain list into one CSV, with checkpoint and resume:
discolike bulk companies --params-file form.json --max-companies 50000 --run-name agencies --out companies.csv
discolike bulk estimate --domains-file companies.csv --per-company 10 # free size check
discolike bulk contacts --domains-file companies.csv --per-company 10 --summary "growth marketing" --out contacts.csv
companies saves each page as an exclusion list (<run-name>-round-N) and excludes it from the next page; rerunning with the same --out resumes from the CSV. contacts slices the domain list at 10000 / per-company domains per call and records finished slices in <out>.checkpoint. Both keep one call in flight under --rate-limit (default 10/min, the Pro rate on /discover and /contacts), retry on 429/5xx, and print a JSON summary at the end. Filters come from --params-file, --param and the common flags; the paging fields are managed for you.
Managed prospecting
discolike prospecting start --brief "Find 100 US logistics companies and 3 operations directors each" --idempotency-key logistics-1
discolike prospecting start --brief "Find lookalikes of our customers and their CTOs" --customers-file customers.csv --idempotency-key seeded-1
discolike prospecting wait RUN_ID
# Review the proposed plan; change its engines or size if needed (returns a new plan_version):
discolike prospecting plan RUN_ID --plan-version 1 --contact-integration-id LLM_ID --search-provider-id SEARCH_ID
# Then approve the exact version you saw:
discolike prospecting approve RUN_ID --plan-version 2
discolike prospecting list --limit 20
discolike prospecting message RUN_ID --text "Make it 250 companies" --idempotency-key logistics-edit-1
discolike prospecting status RUN_ID --events-after 12 --messages-after 8 --limit 100
discolike prospecting cancel RUN_ID
wait returns on proposed, needs_input, completed, failed, or cancelled. A timeout stops polling only. Inspect status and stop reason; completion does not guarantee full coverage. Message replies arrive through status --messages-after; follow next_message_seq and reply_pending. A "segment these" request keeps reply_pending true until the segments message is posted, which can take more than an hour. If grouping stops without an outcome, the flag clears on its own after about 90 minutes.
plan changes a proposed plan before approval and sends only the flags you pass: --contact-integration-id, --validation-integration-id and --search-provider-id take option ids from the plan message's contact_engine, company_check_engine and search_provider (--search-provider-id none skips web research), and --target-companies, --contacts-per-company, --deliverable, --goal, --max-spend-usd and --max-provider-spend-usd (0 removes a limit) resize or re-scope it. When your organization has several AI or search providers and none is the default, the plan shows that engine with selected: null and approve returns 409 until plan picks one. The run comes back re-estimated at a new plan_version; approve that one.
start and approve default to pausing at checkpoints, like the web chat: a pilot check on large lists (pilot), a search drifting off target (tail_quality), candidates running out short of the target (short), the target being met (target_reached), another round of companies when the ones checked yield too few contacts (top_up), and, on wave runs, the researched contacts found before their emails are looked up (contacts_review, asked with --auto too; contacts already in DiscoLike's database get their lookups during research, which approving the plan starts; picking "Find emails" by number sends the question's seq, which the API needs to accept it). Pass --auto to never pause (except at a top_up round that would pass a spending limit); a poor pilot is then sharpened once and the run continues with a notice, stopping with pilot_failed only if the re-pilot fit is still under 20%. If sharpening itself fails, the run continues on the original criteria. On a terminal, wait shows the question, any sample companies and numbered replies at a checkpoint, sends your pick or your own text, and keeps waiting. Without a terminal, or with --no-input, it prints the run on stdout, a needs_input envelope (message, stop_reason, suggested_replies, sample) on stderr, and exits 7; answer with prospecting message --text "<reply>" (add --question-seq with the question's seq to answer only that question) and run wait again.
Omit --target-companies and --contacts-per-company to infer counts from the brief (fallback 1,000 and 3; up to 10 contacts per company). Explicit values override the text. --deliverable accounts returns the checked companies only, with no people; --goal companies takes --target-companies matching companies and works only those instead of adding rounds until the contact target is met. Both default to leads. --max-candidates and --max-actions are automatic when omitted or 0; their maxima are 100,000 and 10,000. Targets allow up to 10,000 companies, status pages up to 500 rows, and lists up to 50 runs. Work caps do not cap provider charges.
Conventions
- Results print as JSON to stdout; errors print as JSON (
error,message,status_code) to stderr. - Pass
--format tablefor a human-readable table — used automatically when stdout is a TTY. - Volume inputs come from files:
--domains-file companies.csv(adomaincolumn, or one domain per line) onqueries create-exclusion-list,contacts discover|search|count|generate,discogen runandvalidate-icp;--params-file form.json(a JSON object of API parameter names, e.g. an app form) ondiscover,countandcontacts discover|search|count;--exclude-domains-fileondiscover. Precedence: file <--param< flags. - Async endpoints (
match --file,discogen run,discogen run-personas,segment,validate-icp) take--waitto block until the job finishes. Without it, you get atask_idback to poll withdiscolike discogen status <task_id> --family <family>.appendis synchronous — it returns enriched rows directly (or writes CSV bytes to--output).
Exit codes
| Exit code | Meaning |
|---|---|
| 0 | Success |
| 1 | Server error or unexpected failure |
| 2 | Validation error |
| 3 | Authentication or plan-access error |
| 4 | Rate limited |
| 5 | Network error |
| 6 | Not found |
| 7 | Needs input: prospecting wait reached a checkpoint with no terminal to ask (or --no-input) |
Links
- API documentation: docs.discolike.com
- Source: github.com/Discolike/discolike-python
License
Metadata
Release files for discolike-cli 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| discolike_cli-0.6.0.tar.gz | 75.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| discolike_cli-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 131.6 kB
Release files / discolike_cli-0.6.0.tar.gz
| Download URL | discolike_cli-0.6.0.tar.gz |
|---|---|
| Size | 75.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b1778b35dbf163de6fcf1b82f37316c361f352aa61560442ebf41916b5ec077b
|
|
BLAKE2b-256 checksum How to use checksums |
bddd9e8ef59fa1e70ec5e4cb13355eeb710ae74e768f40b9edfe9b6aedc9464f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency logRelease files / discolike_cli-0.6.0-py3-none-any.whl
| Download URL | discolike_cli-0.6.0-py3-none-any.whl |
|---|---|
| Size | 55.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
00c2c8c4c430f792df569007b37e530ae875889555022f3c23ad5fab588f7c0e
|
|
BLAKE2b-256 checksum How to use checksums |
2a02f31a5e5d92e74e16772c42cd67409d875b6cfa0a111acc5d35dfc6c1159a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency log