Skip to content

POST /v1/icps

Call POST /v1/icps
Price free
Scope decisions:write
Operation id createIcp

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.

Copy it as curl. Set VERDICT_API_KEY first; uuidgen makes a fresh Idempotency-Key.

Request
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"
]
}
}'

201: The new profile.

201 response
{
"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"
}
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.

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.

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

Open the interactive reference to send this request from the browser. The full document is at /openapi.json.