This guide covers breaking changes, renamed tools, and migration steps for upgrading from v1 to v2 of the Watt API.
Migration Checklist
Address these changes in priority order:
| Priority | Change | Action |
|---|---|---|
| 1 | Endpoint change | Update from /v1/mcp to /v2/mcp |
| 2 | Tool renaming | Update all tool names in your integration |
| 3 | Terminology changes | Update field references: person → entity, cluster → trait |
| 4 | Parameter changes | Update input parameters to match new schemas |
| 5 | Output changes | Update response parsing for new field names |
| 6 | New tools | Adopt new tools for improved workflows |
Endpoint
V2 uses a single versioned endpoint:
| Version | Endpoint |
|---|---|
| V1 | /v1/mcp |
| V2 | /v2/mcp |
Authentication methods (OAuth, API key) remain the same. Only the path changes. Note that V2 does not have a separate /m2m endpoint — the /v2/mcp endpoint accepts both OAuth and API key authentication.
Tool Renaming
Every core tool has been renamed in V2:
| V1 Tool | V2 Tool | Purpose |
|---|---|---|
resolve_identities | entity_resolve | Identity resolution |
get_person | entity_enrich | Profile enrichment |
find_persons | entity_find | Audience discovery |
list_clusters | trait:// resource | Browse traits by domain (via MCP resources) |
get_cluster | trait_get | Trait analytics |
search_clusters | trait_search | Semantic trait search |
generate_url_for_upload | generate_upload_url | Presigned upload URL |
generate_download_url | generate_download_url | Presigned download URL |
submit_feedback | submit_feedback | Feedback submission (unchanged) |
Terminology Changes
V2 uses entity/trait terminology consistently:
| V1 Term | V2 Term | Description |
|---|---|---|
person | entity | An individual or business record |
person_id | entity_id | Unique identifier for a record |
cluster | trait | A behavioral or demographic attribute |
cluster_id | trait_id | Numeric trait identifier |
cluster_hash | trait_hash | Stable string trait identifier |
cluster_name | trait_name | Human-readable trait name |
multi_identifiers | identifiers | Multi-criterion identifier array |
entity_type Parameter
V2 tools require an entity_type parameter ("person" or "business") on most tools. V1 tools implicitly operated on persons only.
// V1
{ "person_ids": ["12345", "12346"] }
// V2
{ "entity_type": "person", "entity_ids": ["12345", "12346"] }Parameter Changes
entity_resolve (was resolve_identities)
| Change | V1 | V2 |
|---|---|---|
| Identifier array | multi_identifiers | identifiers |
| Output contact types | N/A | identifier_types (default: ["email"]) |
| Entity type | Implicit (person) | entity_type required |
// V1
{
"multi_identifiers": [
{ "id_type": "email", "hash_type": "plaintext", "values": ["jane@acme.com"] }
]
}
// V2
{
"entity_type": "person",
"identifiers": [
{ "id_type": "email", "hash_type": "plaintext", "values": ["jane@acme.com"] }
],
"identifier_types": ["email", "phone"]
}CSV column mapping for resolution (lookup_columns)
Both entity_resolve and resolve_and_enrich_rows accept a CSV via csv_resource_uri. To tell the resolver which columns hold which identifier types, V2 uses a unified lookup_columns object. Earlier V2 betas exposed flat email_columns / phone_columns / address_columns / name_columns / linkedin_columns parameters; those are now rejected with a per-key error naming the lookup_columns.<key> replacement. Update existing callers to the nested shape:
// Earlier V2 beta — now rejected
{
"email_columns": ["email"],
"phone_columns": ["phone"],
"address_columns": ["address1", "city", "state", "zip"]
}
// V2
{
"lookup_columns": {
"email": { "names": ["email"] },
"phone": { "names": ["phone"] },
"address": { "names": ["address1", "city", "state", "zip"] }
}
}lookup_columns also adds two identifier types not previously available:
linkedin— resolves viasocial:linkedin(full URLs or bare slugs).domain— resolves businesses viawebsite(bare domains or full URLs).
See Conventions → CSV Column Mapping for the full schema, multi-column address joining rules, and the address_parse_low_yield warning.
entity_enrich (was get_person)
| Change | V1 | V2 |
|---|---|---|
| ID parameter | person_ids | entity_ids |
| Entity type | Implicit | entity_type required |
| CSV input | N/A | csv_resource_uri + entity_id_column |
// V1
{ "person_ids": ["12345"], "domains": ["demographic", "interest"] }
// V2
{
"entity_type": "person",
"entity_ids": ["12345"],
"domains": ["demographic", "interest"]
}entity_find (was find_persons)
| Change | V1 | V2 |
|---|---|---|
| Criteria | expression with cluster IDs/hashes | expression with trait IDs/hashes |
| Export identifiers | export_identifiers | identifier_type or identifier_types |
| Location unit | radius_km | radius + unit (km or miles) |
| Entity type | Implicit | entity_type required |
// V1
{
"expression": "cluster_hash:abc123 AND cluster_hash:def456",
"location": { "latitude": 37.77, "longitude": -122.42, "radius_km": 5 },
"export_identifiers": ["email", "phone"]
}
// V2
{
"entity_type": "person",
"expression": "abc123 AND def456",
"location": { "latitude": 37.77, "longitude": -122.42, "radius": 5, "unit": "km" },
"identifier_types": ["email", "phone"]
}Note: V2 expressions use trait hashes directly without the cluster_hash: prefix.
trait browsing (was list_clusters)
list_clusters is replaced by trait:// MCP resources. Use resources_read with trait://person or trait://business URIs, with optional ?domain= and ?limit= query parameters.
trait_get (was get_cluster)
| Change | V1 | V2 |
|---|---|---|
| ID parameter | cluster_id or cluster_hash | trait_id, trait_hash, or trait_name + domain |
| Analytics | Always full | analytics_depth (summary or full) |
| Entity type | Implicit | entity_type required |
Output Changes
Field Renaming
All output fields follow the new terminology:
| V1 Output Field | V2 Output Field |
|---|---|
person_id | entity_id |
cluster_id | trait_id |
cluster_hash | trait_hash |
cluster_name | trait_name |
cluster_value | trait_value |
cluster_domain | domain |
persons / results | entities / sample |
Workflow ID
V2 always returns workflow_id and tool_trace_id in every response. Pass workflow_id between related calls for session tracking.
New Tools
V2 introduces several tools with no V1 equivalent:
entity_relations
Find related entities using directional source → target queries (e.g., find employers of a person, or employees of a business).
{
"source_entity_type": "person",
"source_entity_ids": ["12345"],
"relationship": "employs",
"target_entity_type": "business"
}See entity_relations.
resolve_and_enrich_rows
Streaming CSV pipeline that combines identity resolution and enrichment in a single operation. Replaces the manual resolve_identities → get_person pattern for CSV workflows.
{
"entity_type": "person",
"csv_resource_uri": "workflow://550e8400-e29b-41d4-a716-446655440000/uploads/customers.csv",
"lookup_columns": { "email": { "names": ["email"] } },
"domains": ["demographic", "interest"],
"workflow_id": "550e8400-e29b-41d4-a716-446655440000"
}geocode_location
Convert location descriptions to coordinates for use with location filters.
{
"location": "San Francisco, CA"
}See geocode_location.
Watt SDK
V2 introduces the @wattdata/sdk package for building agentic workflows. Built on Vercel's AI SDK v6, the SDK connects to Watt's MCP tools — you provide API keys, and the agent handles tool discovery, orchestration, and multi-step reasoning.
See the SDK Integration guide for full documentation.
ICP Analysis Workflow Changes
The V1 analyze_customers tool has been decomposed into two composable steps in V2:
V1 (single tool):
analyze_customers (upload CSV → resolve → enrich → group → analyze)V2 (composable pipeline):
entity_resolve → group_entities_by_trait → calculate_trait_lift → entity_findThis gives you more control over each step and allows reusing intermediate results. See the ICP Analysis guide for the full V2 workflow.
Testing Your Migration
- Update endpoint URLs from
/v1/mcpto/v2/mcp - Rename all tool calls per the tool renaming table
- Add
entity_typeto all tool calls - Update identifier parameters (
multi_identifiers→identifiers,person_ids→entity_ids) - Update expression syntax (remove
cluster_hash:prefix, use trait hashes directly) - Update output parsing for renamed fields (
person_id→entity_id, etc.) - Test export workflows — format options are the same (
csv,json,jsonl) - Verify location filters — now use
radius+unitinstead ofradius_km
Getting Help
If you encounter issues during migration:
- Review the MCP Tool Reference for updated schemas
- Check error messages for specific validation details
- Use
submit_feedbackto report data quality issues - Contact support for integration assistance