POST /v1/icps
| Call | POST /v1/icps |
| Price | free |
| Scope | decisions:write |
| Operation id | createIcp |
What it does
Section titled “What it does”Describe who you sell to and what you sell, in plain text plus optional filters. Every decision is made against an ICP profile, so create one first. Verdict summarizes it once (summary_status), assigns a calibration segment and sets calibrated default thresholds. Free. Scope: decisions:write.
Example request
Section titled “Example request”Copy it as curl. Set VERDICT_API_KEY first; uuidgen makes a fresh Idempotency-Key.
curl -X POST 'https://api.askverdict.io/v1/icps' \ -H "Authorization: Bearer $VERDICT_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H 'Content-Type: application/json' \ -d '{ "name": "RIAs under $1B", "description": "US registered investment advisers with under $1B in assets and fewer than 50 staff. We sell trade reconciliation software to their operations lead.", "filters": { "firm_types": [ "investment_adviser" ], "size_bands": [ "micro", "small" ], "countries": [ "US" ] }}'Example response
Section titled “Example response”201: The new profile.
{ "id": "icp_01JC3Z4Y8R9K2M5N7P1Q3S5T7V", "project_id": "prj_01JC3Z4Y8R9K2M5N7P1Q3S5T7V", "name": "RIAs under $1B", "description": "US registered investment advisers with under $1B in assets and fewer than 50 staff. We sell trade reconciliation software to their operations lead.", "filters": { "firm_types": [ "investment_adviser" ], "size_bands": [ "micro", "small" ], "countries": [ "US" ] }, "segment": { "industry_group": "asset_management", "size_band": "small" }, "summary_status": "pending", "thresholds": { "qualify_firm": { "value": 0.6, "source": "calibrated" }, "score_signal": { "value": 0.55, "source": "calibrated" }, "pick_person": { "value": 0.5, "source": "calibrated" }, "triage_reply": { "value": 0.65, "source": "calibrated" }, "right_person": { "value": 0.7, "source": "custom" }, "should_send": { "value": 0.6, "source": "calibrated" } }, "created_at": "2026-11-07T14:00:00Z", "updated_at": "2026-11-07T14:20:00Z"}Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
idempotency-key |
header | string (uuid) | yes | A UUID you generate per logical request. Required on every POST. Repeating it within 24 hours returns the stored response and bills nothing; reusing it with a different body returns 409 idempotency_conflict. |
x-verdict-version |
header | string | no | API version to use, a date. Defaults to the version current when the key was created. The current version is 2026-11-01. |
Request body
Section titled “Request body”Schema CreateIcpRequest. The profile.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Short name, for example RIAs under $1B. |
description |
string | yes | Plain-text description of who you sell to and what you sell. At most 8192 bytes of UTF-8. |
filters |
IcpFilters | no | Optional structured filters that sharpen the plain-text profile. |
filters.firm_types |
array of enum: “operating_company”, “investment_adviser”, “broker_dealer”, “investment_fund”, “nonprofit”, “public_body”, “other”, “unknown” | no | Firm types to target. |
filters.size_bands |
array of enum: “micro”, “small”, “medium”, “large”, “enterprise”, “unknown” | no | Size bands to target. |
filters.countries |
array of string | no | Headquarters countries to target. |
filters.exclude_countries |
array of string | no | Headquarters countries to exclude. |
filters.exclude_domains |
array of string | no | Firms to exclude by domain (for example existing customers). |
filters.event_types |
array of enum: “filing”, “registration”, “officer_change”, “ownership_change”, “lei_change”, “address_change”, “fund_raise”, “insider_trade”, “patent_filing”, “litigation”, “news_mention”, “repo_activity”, “hiring_aggregate” | no | Event types that signal buying intent for this ICP. |
project_id |
string | no | Project to create the profile in; defaults to the key’s project. |
Response fields (201)
Section titled “Response fields (201)”Schema Icp.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | The ICP profile id. |
project_id |
string | yes | Project the profile belongs to. |
name |
string | yes | Name. |
description |
string | yes | Plain-text description. |
filters |
IcpFilters | yes | Optional structured filters that sharpen the plain-text profile. |
filters.firm_types |
array of enum: “operating_company”, “investment_adviser”, “broker_dealer”, “investment_fund”, “nonprofit”, “public_body”, “other”, “unknown” | no | Firm types to target. |
filters.size_bands |
array of enum: “micro”, “small”, “medium”, “large”, “enterprise”, “unknown” | no | Size bands to target. |
filters.countries |
array of string | no | Headquarters countries to target. |
filters.exclude_countries |
array of string | no | Headquarters countries to exclude. |
filters.exclude_domains |
array of string | no | Firms to exclude by domain (for example existing customers). |
filters.event_types |
array of enum: “filing”, “registration”, “officer_change”, “ownership_change”, “lei_change”, “address_change”, “fund_raise”, “insider_trade”, “patent_filing”, “litigation”, “news_mention”, “repo_activity”, “hiring_aggregate” | no | Event types that signal buying intent for this ICP. |
segment |
object | yes | Calibration segment of the profile (spec 6.4). |
segment.industry_group |
string or null | yes | Industry group assigned at summarization. |
segment.size_band |
enum: “micro”, “small”, “medium”, “large”, “enterprise”, “unknown”, null | yes | Size band assigned at summarization. |
summary_status |
enum: “pending”, “ready”, “failed” | yes | Status of the one-time summarization. |
thresholds |
Thresholds | yes | Decision thresholds, one per decision. |
thresholds.qualify_firm |
object | yes | Threshold for qualify_firm. |
thresholds.qualify_firm.value |
number | yes | The threshold answer applies to p. |
thresholds.qualify_firm.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
thresholds.score_signal |
object | yes | Threshold for score_signal. |
thresholds.score_signal.value |
number | yes | The threshold answer applies to p. |
thresholds.score_signal.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
thresholds.pick_person |
object | yes | Threshold for pick_person. |
thresholds.pick_person.value |
number | yes | The threshold answer applies to p. |
thresholds.pick_person.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
thresholds.triage_reply |
object | yes | Threshold for triage_reply. |
thresholds.triage_reply.value |
number | yes | The threshold answer applies to p. |
thresholds.triage_reply.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
thresholds.right_person |
object | yes | Threshold for right_person. |
thresholds.right_person.value |
number | yes | The threshold answer applies to p. |
thresholds.right_person.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
thresholds.should_send |
object | yes | Threshold for should_send. |
thresholds.should_send.value |
number | yes | The threshold answer applies to p. |
thresholds.should_send.source |
enum: “calibrated”, “custom” | yes | Calibrated default or your own value. |
created_at |
string (date-time) | yes | When the profile was created. |
updated_at |
string (date-time) | yes | When the profile last changed. |
Errors
Section titled “Errors”Errors are RFC 9457 problem details and are never billed. Branch on type. See Errors.
| Status | Meaning |
|---|---|
400 |
Invalid request: malformed JSON, an unknown field, a failed constraint or a size limit (invalid_request). |
401 |
Missing, malformed, revoked or expired API key, or a bad webhook signature (unauthorized). |
403 |
The key lacks the scope this operation needs (forbidden_scope). |
404 |
The resource does not exist in this organization (not_found). |
409 |
The Idempotency-Key was reused with a different request, or the first request is still running (idempotency_conflict). |
429 |
Rate limited (rate_limited). Wait Retry-After seconds. |
500 |
Unexpected server error (internal). Not billed; retry with the same Idempotency-Key. |
Try it
Section titled “Try it”Open the interactive reference to send this request from the browser. The full document is at /openapi.json.