Validate API
Validate whether a list of companies match your Ideal Customer Profile. Provide your ICP description and domains. DiscoLike generates a validation prompt and evaluates each company, returning structured fit/confidence/reasoning results.
Built on the DiscoGen pipeline. Requires an LLM provider integration, unless you run it on DiscoLike’s own native ICP-fit model.
POST https://api.discolike.com/v1/validate/icpResults are async. Poll GET /discogen/status/{task_id} for completion.
ICP Fit Validation
Section titled “ICP Fit Validation”POST /validate/icp
Section titled “POST /validate/icp”Validates domains against an ICP description. Returns a task ID immediately.
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
| icp_text | String | Yes | Your ICP description (e.g., “B2B SaaS companies in HR and payroll with 50-500 employees”). Must be non-empty |
| domains | Array | Yes | List of domains to validate (1-10,000) |
| context_mode | String | No | What data the LLM sees per domain: website (default, profile + homepage), profile (firmographics only), domain (name only) |
| integration_id | String | No | LLM provider integration UUID. Uses your default if omitted. Pass native-icp to score with DiscoLike’s own model instead of an LLM (see Native ICP-Fit Model) |
| web_search | Boolean | No | Enable web search enrichment (default: false) |
| search_provider_id | String | No | Search provider UUID for web search. Uses your default if omitted |
Response
Section titled “Response”{ "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "column_name": ["Fit", "Confidence", "Reasoning"], "status": "in_progress", "total_domains": 3}Result Schema (per domain)
Section titled “Result Schema (per domain)”When the task completes (poll via GET /discogen/status/{task_id}), each domain returns:
| Column | Values | Description |
|---|---|---|
| Fit | Yes, No | Whether the company matches the ICP |
| Confidence | high, medium, low | Assessment confidence level |
| Reasoning | String | 1-2 sentence explanation |
A native run returns a different set of columns. Read column_name from the task response rather than hardcoding either set.
Example
Section titled “Example”curl -X POST https://api.discolike.com/v1/validate/icp \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "icp_text": "B2B SaaS companies providing HR and payroll solutions with 50-500 employees", "domains": ["gusto.com", "rippling.com", "stripe.com"] }'Then poll for results:
curl https://api.discolike.com/v1/discogen/status/TASK_ID \ -H "Authorization: Bearer YOUR_API_KEY"Example completed result:
{ "task_id": "a1b2c3d4-...", "status": "completed", "results": { "gusto.com": {"Fit": "Yes", "Confidence": "high", "Reasoning": "HR and payroll platform for SMBs, directly matches ICP"}, "rippling.com": {"Fit": "Yes", "Confidence": "high", "Reasoning": "HR, payroll, and IT platform for businesses, strong ICP match"}, "stripe.com": {"Fit": "No", "Confidence": "high", "Reasoning": "Payment processing infrastructure, not HR/payroll"} }}The status response also carries estimated_cost, cost_metadata and warnings, described under Cost Metadata and Warnings. Validation runs at low search depth with two fixed queries per domain when web_search is enabled; for targeted lookups use DiscoGen with a prompt that names the source.
Native ICP-Fit Model
Section titled “Native ICP-Fit Model”Pass integration_id: "native-icp" to score every domain with DiscoLike’s own ICP-fit model, a cross-encoder served on our GPUs, instead of your LLM provider. The run needs no LLM provider integration and makes no calls on your provider key, so it reports no LLM or search spend.
The model was trained on LLM validation verdicts, so a score is what an LLM validator would most likely have said about the company, at no LLM cost. It is not more accurate than an LLM.
Differences from an LLM run:
- No web search is performed.
web_searchandsearch_provider_idare ignored. context_modeis alwayswebsite, the company profile plus homepage text the model was trained on. Passingprofileordomainhas no effect.- The columns differ, as below.
Reasoningcarries the confidence band rather than an explanation: the model returns a score, not text.
Native Result Schema (per domain)
Section titled “Native Result Schema (per domain)”| Column | Values | Description |
|---|---|---|
| ICP Fit | Yes, No | Whether the company matches the ICP. Yes when ICP Score is 0.50 or above |
| ICP Score | String | Calibrated probability that the company matches the ICP, "0.00" to "1.00", two decimals |
| Reasoning | High confidence, Medium confidence, Low confidence - ... | The confidence band, derived from how far ICP Score sits from the 0.50 cutoff: high when the score is 0.15 or below or 0.85 or above, medium between 0.15 and 0.35 or between 0.65 and 0.85, low between 0.35 and 0.65. This engine scores rather than explains, so the column carries the band instead of a rationale. A low-confidence verdict is close to a coin flip - measured at 0.598 accuracy on held-out data, against 0.943 for high - so treat it as unresolved rather than as a No |
Native Example
Section titled “Native Example”curl -X POST https://api.discolike.com/v1/validate/icp \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "icp_text": "B2B SaaS companies providing HR and payroll solutions with 50-500 employees", "domains": ["gusto.com", "stripe.com"], "integration_id": "native-icp" }'{ "task_id": "a1b2c3d4-...", "status": "completed", "results": { "gusto.com": {"ICP Fit": "Yes", "ICP Score": "0.91", "Reasoning": "High confidence"}, "stripe.com": {"ICP Fit": "No", "ICP Score": "0.08", "Reasoning": "High confidence"} }}Errors
Section titled “Errors”| Status | Meaning |
|---|---|
| 400 | The validation prompt generated from your icp_text does not list its criteria under Mandatory:, Reject if: and Nice-to-have:. The native model only answers ICP validation prompts; rephrase the ICP text or pick an LLM integration for it |
| 503 | Native ICP-fit validation is not available on this server right now. Retry shortly or pass an LLM integration_id |