API Specification
Complete reference for the Debreu MCP Server API. All endpoints require authentication via API key and return JSON responses.
Authentication
All API requests require an API key passed in the Authorization header. Generate an API key from your Debreu settings page.
Authorization: Bearer YOUR_API_KEYhttps://api.debreu.ai/api/v1application/jsonChangelog
delete_recordforrecord_type=companyis now team-scoped — it removes the company from your team only (unlinks your team's pipeline links, metrics, contacts, email/file/calendar associations, workflows, view memberships, tasks, generations, theme tags, and the team's port_co overlay). The company record and all global / other-team data are preserved; it is no longer a global delete. Re-adding the company viacreate_companyrestores your team's records.
create_project:tracker_typenow acceptsprospecting— a manual company sourcing tracker with a dedicated status funnel (new → selected → … → won/lost/parked). Per-profileworkflow_account_prospectingstatuses are seeded automatically.get_status_definitionsnow listsworkflow_account_prospectingas a commonstatus_type.
- Company lookup/query and dashboard docs now describe
last_interaction_dateandnext_interaction_dateas current-user interaction fields, not metric schema columns.
invest_labelfield removed fromupdate_portfolio_data(create_port_co/update_port_co) andget_portfolio_dataresponse. The field is no longer read anywhere in the product.
create_port_cono longer requiresyear— now optional.
delete_recordnow acceptsrecord_type=email_campaign. Soft-deletes the campaign and its rows; for non-sent rows that have a pushed Gmail/Outlook draft, the draft is best-effort removed from the user's mailbox. Sent messages and ingestedEmailrecords are untouched. Rejects when the campaign is insending,generating_drafts, orscheduledstatus — cancel queued sends first.
- Dashboard config docs clarify
biopharma_catalyst_calendarcolumns, filters, lowercase phase values, milestone-date filtering, the 18-column grid, and layout/components ID matching.
- Biopharma asset tools:
get_biopharma_assets,create_biopharma_asset,update_biopharma_asset,create_biopharma_indication, andupdate_biopharma_indication. delete_recordnow acceptsbiopharma_assetandbiopharma_indication.
- Portfolio tool docs now state that portfolio data is intended for investor companies.
- Dashboard config docs now include the
biopharma_catalyst_calendarwidget type, its table columns, and supported filters.
- Email Templates endpoints:
list_email_templates,get_email_template(with optionalinclude_history),create_email_template,update_email_template. Templates support whitelisted handlebars ({{first_name}},{{last_name}},{{title}},{{email}},{{company_name}},{{company_domain}},{{sender_first_name}}) that resolve per-recipient at draft generation. PATCH creates a new version row; the prior version is preserved in the history chain. - Email Campaigns endpoints:
list_email_campaigns,get_email_campaign,create_email_campaign,schedule_email_campaign.create_email_campaignis atomic — it writes the campaign row, per-recipient rows, AND triggers the Cloud Run draft-generation job in a single call (rolling back the whole thing on any failure). Supports fresh campaigns (flatrecipientslist with oneprimaryper company) and follow-ups (follow_upspec withsame_thread/new_threadreply modes and optionalparent_row_ids).schedule_email_campaignsupports a single base time + optional stagger OR a per-rowschedulesoverride list.
delete_recordacceptsrecord_type=email_template— archives the template by UUID (matches the app's archive behavior).
timezonefield on people: optional IANA timezone identifier (e.g."America/New_York") auto-extracted from the sender's email signature when an address is present. Returned bylookup_personandget_people, accepted bycreate_personandupdate_person. Existing rows returnnulluntil the next inbound email refreshes them.
pending_fromvalues changed (breaking) tobanker,coverage_client,counterparty,third_party. Existing rows backfilled (us → banker,client → coverage_client). The field is now also populated by AI task extraction (in addition to manual user updates).
- File-share tools:
share_file_with_user,share_file_with_users(bulk),list_file_shares,revoke_file_share. Owners grant explicit content access to other users; recipients get full owner-equivalent access (download, extracted text, parsed content).revoke_file_shareonly removesgranted_via=explicitrows —email_recipientandproject_membershares are derived from email/project state.
task_typevalues changed (breaking) tostated,inferred,user_created. Previous values (our_commitment,counterparty_pending,proactive_opportunity,internal_action) are no longer accepted.create_taskdefaultstask_typetouser_created; AI parsing emitsstatedorinferred.
pending_party_rolefield removed fromcreate_taskandupdate_task.
- Task model: renamed
company_idtoclient_company_idincreate_task,update_task, andget_taskstool schemas. Theget_taskscompany_idquery param is preserved for backward compat (maps toclient_company_id). get_tasksdescription now referencesclient_company,subject_company, andtask_typein response fields.
- New task fields in
create_taskandupdate_task:subject_company_id,subject_company_name,relationship_source_id,relationship_source_name,task_type(enum:our_commitment,counterparty_pending,proactive_opportunity,internal_action),deal_hint,pending_party_role. All optional;task_typedefaults tointernal_action.
query_emails and query_calendars MCP tool descriptions now state server-side list queries and that total is the full match count; this spec page mirrors that for the email and calendar endpoints.
query_files: optional tag (exact match), aligned with query_emails / query_calendars.
query_emails, query_calendars, query_files: list endpoints use full SQL filtering; total is the count of all matching records (not a fixed cap). Spec documents query_files date range as filter on upload time (created_at).
target_landscaperemoved fromcreate_projectandupdate_project. Acquisition Targets / Buyer Universe trackers no longer accept GICS landscape combinations via MCP.
create_project:tracker_typeenum now includesinvestor_outreach. The API already accepted this value; the MCP tool schema omitted it.
update_project.account_operationsnow supports per-tracker-company deal fields. Foracquisition_targets/buyer_universetrackers:tevandfees($M). Forinvestor_outreachtrackers:is_lead,indicated_amount($M),allocated_amount($M),price_limit,investor_type,order_type. Fields only apply on the matching tracker type. Invalidinvestor_type/order_typevalues are rejected by the API with an error listing the valid values.get_project: tracker company entries now include the matching per-company deal fields foracquisition_targets/buyer_universe(tev,fees) andinvestor_outreach(is_lead,indicated_amount,allocated_amount,price_limit,investor_type,order_type).
get_portfolio_data: new read tool for portfolio-company data. Pass exactly one ofcompany_uuidorfund_uuid. Company mode returnsport_cos(where the company is sponsor),parent_portfolios(where it is itself a port_co), and itsfunds. Fund mode returns fund details, sponsor company, and port_cos. Every port_co row includesrelationship_uuid(pass todelete_recordwithrecord_type=port_co_relationshipto unlink), sharedrelationship_data, and per-viewerteam_data(team_lead,priority).update_portfolio_data: new single-tool writer.action∈create_port_co/update_port_co/create_fund/update_fund.create_port_corequires sponsor + port_co companies to already exist.update_port_coacceptsfund_uuid: nullto detach.delete_record:record_typenow acceptsport_co_relationshipandfund. Soft-deletes the row; the port_co variant refuses non-port_co relationship_types with 400.
update_project: newworking_group_operations(add/update/remove members withuser_type"user"/"person",user_id,category"team"/"client"/"advisors", and optionalis_team_lead) andkey_date_operations(add/update/remove timeline milestones withtitle,start_date,end_date). Each op returns a per-entry result (added/updated/removed/already_exists/error).get_project: response now includesworking_group(roster entries withuuid,user_type,user_id,name,category,is_team_lead) andkey_dates(timeline entries withuuid,title,start_date,end_date).
- Metric state value responses no longer include
created_at/updated_at. All timestamp semantics are carried by the neweffective_atfield — the real-world observation time (defaults to now(), but backdated when the row is derived from a past-dated email or file). Affectslookup_company(wheremetrics[].updated_atis nowmetrics[].effective_at), any endpoint that serializes a metric state value, and thequery_metric_historyresponse (the per-rowdatetimefield is unchanged in name but is now sourced fromeffective_at). - Historical / listing queries for metric state values are ordered by
effective_at DESC(tiebreak oncreated_at DESC) so backdated observations land in their real-world chronological position.
upload_file: new optionalfile_dateparam (ISO 8601). Effective date of the file's content — use this to backdate a file that represents a past document. AI parsing usesfile_dateas the reference date for task extraction and metric observations (so backdated files land in the right position in company history). Defaults to now().
- Project
deal_typeenum renamed:"financing"→"capital_markets"acrossquery_projects,create_project,update_project(and ext variants). Existing project rows are backfilled.
create_project/update_project: optionalissuer_company_idforcapital_marketsdeals (stored on the project; validated against your workspace).- New
Investor Outreachworkflow type. Tracker rows (view_to_companies) accept optional ECM fields:is_lead,indicated_amount,allocated_amount,price_limit,investor_type,order_type. Profile-seededworkflow_account_investor_outreachstatuses:targeted → contacted → nda_signed → model_shared → meeting_held → ioi_received → allocated → declined → dropped.
upload_file: new optionalcalendar_idparam. Associates the uploaded file with a calendar event (UUID fromquery_calendars). Mirrors the existingcompany_idbehavior.
query_emails,query_calendars,query_files, andget_tasks: new optionalproject_idparam. Filters results to records linked to the given project (viaemail_to_projects/calendar_to_projects/file_to_projectsjunctions, and the directtasks.project_idFK). When bothcompany_idandproject_idare provided,project_idtakes precedence.
create_projectandupdate_project: optionaltev,fees($M), andbuyer_company_id/seller_company_id/target_company_idin toolinputSchema; backend ext handlers persist them on the project row.update_projectacceptsnullfor those fields to clear.
query_projectsandget_project: deal economics and parties are documented as fields stored on the project (addtarget_company_id/target_name); removedfinancials_tracker_scopeand tracker-hydration wording.primary_view_company_idsremains the pitched list from tracker primary views.- Dashboard projects widget:
update_dashboard_configdocs includetarget_name; TEV/fees and party columns read from the project row. get_tasksspec: expanded taskprojectincludes the same stored deal fields (nofinancials_tracker_scope).
- Dashboard widget type
meeting_prep(requirescompany_idin widget config). MCP tool docs and REST spec updated.
- UI copy: company "briefing" surfaced as meeting prep; My Day / My Week tool descriptions use "summary". MCP spec groups renamed to Summaries & meeting prep.
- Dashboard client-side date windows: documented optional
date_filter_field(single column per row; funds overlap sentinel__fund_period_overlap__).get_dashboard_config/update_dashboard_configtool descriptions updated.
get_dashboard_configdocs: the same widget date range settings apply to projects, people, companies, portfolio, and funds (client-side row filtering), in addition to tasks, calendar, and emails.
- Dashboard widget date range: documented
date_relative_unit(days|months),months_ago/months_ahead, and wider day windows. Project and people widget column lists inupdate_dashboard_configdocs includestart_date,end_date,primary_view_company_ids, first interaction dates, andcreated_at.
update_companynow accepts ametricsarray of{metric_name, value}pairs to set arbitrary metric values on a company. Removed individual profile field params (website, description, city, state, country, ticker, tags) — usemetricswith the corresponding metric names instead (e.g.company_city,company_ticker). Callget_metric_schemafor valid metric names.- For Acquisition Targets / Buyer Universe project hydration, the mandate-side buyer/seller uses the tracker workflow
client_idwhen set, otherwise the projectclient_id.
- New
list_dashboardstool: list all dashboards owned by the user, optionally filtered by type ('home', 'custom'). - New
create_dashboardtool: create a new dashboard (defaults to type 'custom') with name and optional layout/components. - New
delete_dashboardtool: delete a user-level dashboard by UUID.
get_dashboard_confignow supportsuuidparameter to fetch a specific dashboard by UUID. Description updated to document both 'home' and 'custom' dashboard types.
query_projectsandget_projecttool docs updated for stored project deal fields (superseded by 2.35.0 wording).- Dashboard projects widget column catalog includes
team_lead_name,tev,fees,buyer_name, andseller_nameinupdate_dashboard_configdocumentation.
- Dashboard
single_statis supported on thefundswidget (withcompany_id); numeric fieldsamountandportcoCount. Project-leveltev/feesare no longer used for widgets.
- New
portfolioandfundsdashboard widget types. Both requirecompany_id(sponsor company UUID) in config. Support table and stats display modes. - Portfolio columns: companyBName, priority, teamLead, leadSponsor, ltmInteractions, fundName, status, year, stakeType.
- Funds columns: name, startDate, endDate, amount, portcoCount.
- New
single_statdisplay_typefor dashboard widgets — aggregates one numeric field across the filtered set into a single value. Setagg_function(sum/avg/min/max/count) andagg_field(numeric column key; omitted forcount). - Currently supported on the
fundswidget (withcompany_id). Numeric fields:amount,portcoCount.
delete_recordsupportsemail,calendar, andfile(soft delete with cascades, user-scoped).
- Merged
pipelinewidget intocompanieswidget. Usecompanieswithpipeline_companies: truein config instead.
pipelinefrom valid component types in dashboard config tools.
- Backend validation for dashboard layout: no overlapping widgets, non-negative positions, sizes >= 1, and
x + wmust not exceed the configured grid column count.
get_dashboard_configdescription now documents thatdays_ago=0, days_ahead=0means "today only" in relative date mode.
- New
get_dashboard_configtool to retrieve the user's effective dashboard configuration (user override → profile fallback). Supports filtering by dashboard type (currently onlyhome). - New
update_dashboard_configtool to update a user-level dashboard config. Supports updating name, layout (react-grid-layout positions), and components (widget types, configs, filters).
- New
upload_filetool for uploading files to Debreu. Accepts a localfile_path(MCP server reads the file) or inlinecontent_base64. Supports optionaltitle,description,content_type, andcompany_id.
get_projectnow returns interview and supplemental fields for people_list tracker entries:role_sought,gpa, and per-round interview details (interviewer_N,interview_N_date,interview_N_comments,interview_N_scorefor rounds 1-3).update_projectaccount_operationsfor people_list trackers now documentsrole_sought,gpa, and interview fields in the input schema.
create_personandupdate_personnow supportalma_mater,previous_company, andlocationfields.lookup_personresponse now includes the new enrichment fields.
people_listtracker type was rejected by backend validation despite being in the MCP enum.
account_operationsinupdate_projectnow supportsperson_idfor people_list trackers.initial_person_idsparameter increate_projectfor seeding people into people_list trackers.get_projectnow returnspeoplearray (with account_status) for people_list trackers.
account_operationsitems: useperson_idfor people_list trackers,company_idfor all others.
- Renamed project
tagstokeywordsincreate_projectandupdate_projecttools. Keywords now also match against entity tags on items.
- Outreach tracker dates (
outreach_start_date,outreach_end_date) are now independently optional. New matching emails/calendars are auto-linked going forward. - People List tracker now supports multiple tags via
sync_tags(comma-separated). Tag changes on people are reflected automatically. people_listadded totracker_typeenum.sync_tagsparameter added to create/update project.- Companies/people manually removed by the user will not be re-added by auto-sync.
buyer_typeincreate_projectandupdate_projectnow uses enum (strategic,financial_sponsor) instead of free-text.target_landscapeincreate_projectandupdate_projectchanged from free-text string to structured array of GICS taxonomy objects.
set_entity_tagstool — set/replace tags on any entity (email, calendar, file, person). Idempotent.tagfilter parameter onquery_emailsandquery_calendars— filter by entity tag (e.g. "outreach", "recruiting").tagsfield in responses forquery_emails,get_email,query_calendars,get_calendar,lookup_person, andget_people.
get_teamtool — returns team members (uuid, name, email, is_current_user) for discovering validassignee_idvalues.report_issuetool — create a text-only issue report tied to the current user.pending_fromparameter oncreate_taskandupdate_task.get_tasksresponse now includesassignee,project, andpersonobjects.get_projecttask items now includeassigneeandperson.
create_taskandupdate_taskdescriptions referenceget_teamfor assignee lookup.- Removed
workflow_idfromcreate_taskandupdate_taskschemas (workflow is managed via project).
- Replaced "workflow" terminology with "tracker" in tool descriptions for query_projects, get_project, and update_project.
- lookup_person and get_people responses now include
relationshipdata: interaction dates and per-team-member relationship scores.
- get_tasks response replaces raw
source_typestring with a richsourceobject that resolves to the originating email, file, or calendar (includes type, uuid, name, url). Event-sourced tasks include thereferencesnippet.
offsetpagination parameter for all list-returning tools: query_companies, get_tasks, get_sentiments, query_emails, query_calendars, query_files, query_projects.showingfield in get_tasks and get_sentiments responses.
- get_tasks and get_sentiments now report accurate
totalcounts (total matching results, not just the returned page size). - Deterministic ordering for all paginated handlers: default sort by name for query_companies, re-sort after merge for get_sentiments, explicit created_at sort for query_projects.
- Project
descriptionfield in create_project, update_project, and get_project responses. - Tracker config management in update_project:
tracker_name,tracker_description,outreach_start_date,outreach_end_date,target_landscape,buyer_type. - Type-specific validation for tracker config fields.
tracker_descriptionparameter in create_project.- Tracker metadata in get_project response.
descriptionfield in query_projects results.
- create_project now defaults
tracker_typetocompany_list— a tracker is always created. - query_projects response renamed
workflowkey totracker. - Priority enum in update_project corrected to
["low", "med", "high"].
- create_project tool with full tracker auto-creation support.
- Tracker types: acquisition_targets, buyer_universe, outreach, company_list.
- AI generation triggered automatically for acquisition_targets/buyer_universe.
initial_company_idsparameter to seed companies into a new tracker.
account_operationsin update_project to add, update, or remove companies from tracker.- Generated companies (AI suggestions) in get_project response.
- Security: removed dead code paths, added task authorization, sanitized error responses.
- get_status_definitions tool to query valid status values.
- create_status_definition and update_status_definition tools.
- Removed hardcoded status enums in favor of dynamic get_status_definitions lookup.
- query_projects, get_project, create_project, update_project tools.
- query_comments, create_comment, update_comment tools.
- delete_record unified delete tool.
- Expanded to 31 tools covering companies, metrics, people, tasks, emails, calendars, files, sentiments, and summaries/meeting prep.
- Email, calendar, and file query/retrieval tools.
- get_sentiments, get_my_day, get_my_week, get_meeting_prep tools.
- CRUD tools for tasks, metric schemas, companies, and people.
- Initial MCP server for npx distribution.
- lookup_company, query_companies, get_metric_schema, query_metric_history tools.
- lookup_person, get_people, get_tasks tools.
- API key authentication.
Companies
List Companies
/ext/companiesList companies for the authenticated user's team. Supports metric-based and current-user interaction date filtering, sorting, and pagination.
Parameters
| Name | Type | Description |
|---|---|---|
| skip | integer | Pagination offset (default 0). |
| limit | integer | Page size, 1-200 (default 50). |
| search | string | Search companies by name. |
| filters | string (JSON) | JSON array of filter objects with metric_name, operator (contains, equals, not_equals, gt, lt, gte, lte, exists, not_exists), and value. Supports metric names plus last_interaction_date and next_interaction_date. Multiple filters use AND logic. |
| return_metrics | string (JSON) | JSON array of metric names or current-user interaction date fields to include in results. |
| sort_by | string | Metric name, current-user interaction date field, or "name" for alphabetical. |
| sort_order | string | "asc" or "desc" (default "asc"). |
Example Response
{
"items": [
{
"uuid": "...",
"name": "Acme Corp",
"website": "acme.com",
"metrics": {
"revenue": "$1.2B"
}
}
],
"total": 42,
"skip": 0,
"limit": 50
}Get Company
/ext/companies/:uuidGet a single company by UUID with optional related data.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Company UUID (path parameter). |
| include | string | Comma-separated extras: summary, interactions, metrics. |
Example Request
{
"uuid": "550e8400-...",
"include": "summary,metrics"
}Example Response
{
"uuid": "...",
"name": "Acme Corp",
"website": "acme.com",
"description": "A leading widget manufacturer",
"city": "New York",
"state": "NY",
"country": "USA",
"ticker": "ACME",
"tags": "tech,saas",
"metrics": {
"revenue": "$1.2B",
"employees": "5000"
}
}Create Company
/ext/companiesCreate a new company. If a company with the same website already exists, it is linked to the user and returned with a message. Triggers background enrichment.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Company name. |
| website | string | Company website (e.g. acme.com). |
| description | string | Company description. |
| city | string | Headquarters city. |
| state | string | US state 2-letter code (e.g. NY). |
| country | string | ISO 3166-1 alpha-3 code (e.g. USA). |
| ticker | string | Stock ticker symbol. |
| tags | string | Comma-separated tags. |
Example Request
{
"name": "Acme Corp",
"website": "acme.com",
"city": "New York",
"state": "NY",
"country": "USA"
}Example Response
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Acme Corp",
"website": "acme.com",
"city": "New York",
"state": "NY",
"country": "USA",
"created_at": "2026-04-01T12:00:00Z"
}Update Company
/ext/companies/:uuidUpdate a company name and/or set metric values. Use the metrics array to set any metric value on the company. Call GET /ext/metric-schemas to discover valid metric names.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Company UUID (path parameter). |
| name | string | Company name. |
| metrics | array | Array of {metric_name, value} pairs to set on the company. Duplicate metric_names are rejected. |
Example Request
{
"name": "Acme Corp",
"metrics": [
{
"metric_name": "company_city",
"value": "New York"
},
{
"metric_name": "annual_revenue",
"value": "$500M"
}
]
}Example Response
{
"uuid": "...",
"name": "Acme Corp",
"website": "acme.com",
"description": "Updated description",
"tags": "tech,saas,enterprise"
}Lookup Company
/ext/tools/lookup-companyLook up a company by name, UUID, or website URL. Returns profile, latest metric values, and current-user interaction dates. Name lookup tries exact match, then aliases, then fuzzy match.
Parameters
| Name | Type | Description |
|---|---|---|
| identifier | string | Company name, website domain, or UUID. |
| identifier_type | string | One of: uuid, name, website. |
Example Request
{
"identifier": "Acme",
"identifier_type": "name"
}Example Response
{
"uuid": "550e8400-...",
"name": "Acme Corp",
"website": "acme.com",
"description": "Enterprise SaaS platform",
"city": "San Francisco",
"state": "CA",
"country": "USA",
"metrics": {
"revenue": "$1.2B",
"employees": "5,000",
"sector": "Technology"
}
}Query Companies
/ext/tools/query-companiesFilter companies by metric values or current-user interaction date fields. Operators: string fields use contains/equals/not_equals; number fields use gt/lt/gte/lte/equals (values like "$1.5B" are auto-parsed). Multiple filters use AND logic. Returns up to 50 companies.
Parameters
| Name | Type | Description |
|---|---|---|
| filters | array | Array of {metric_name, operator, value} filter objects. metric_name may also be last_interaction_date or next_interaction_date. |
| return_metrics | array | Additional metric names or interaction date fields to include in results. |
| sort_by | string | Metric name, interaction date field, or "name" for alphabetical sorting. |
| sort_order | string | "asc" or "desc" (default "asc"). |
| limit | integer | Max companies to return (default 20, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"filters": [
{
"metric_name": "revenue",
"operator": "gt",
"value": "$500M"
}
],
"sort_by": "revenue",
"sort_order": "desc",
"limit": 10
}Example Response
{
"companies": [
{
"uuid": "550e8400-...",
"name": "Acme Corp",
"metrics": {
"revenue": "$1.2B",
"employees": "5,000"
}
},
{
"uuid": "660f9500-...",
"name": "Globex Inc",
"metrics": {
"revenue": "$800M",
"employees": "3,200"
}
}
],
"total": 2
}People
List People
/ext/peopleList people (contacts) for the authenticated user's team.
Parameters
| Name | Type | Description |
|---|---|---|
| skip | integer | Pagination offset (default 0). |
| limit | integer | Page size, 1-200 (default 50). |
| search | string | Search by name. |
| company_id | string | Filter to people at a specific company UUID. |
Example Request
{
"search": "Jane",
"limit": 10
}Example Response
{
"items": [
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"company_name": "Acme Corp",
"role": "CFO"
}
],
"skip": 0,
"limit": 50
}Get Person
/ext/people/:uuidGet a person by UUID with relationship scores and interaction dates.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Person UUID (path parameter). |
| include | string | Comma-separated extras; supports "summary". |
Example Request
{
"uuid": "550e8400-...",
"include": "summary"
}Example Response
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"company_name": "Acme Corp",
"role": "CFO",
"relationship_scores": [
{
"user_name": "You",
"score": 85,
"is_current_user": true
}
]
}Create Person
/ext/peopleCreate a new person (contact). Email must be unique if provided.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Person name. |
| company_id | string | UUID of the associated company. |
| string | Email address (must be unique). | |
| phone | string | Phone number. |
| role | string | Job title or role. |
| timezone | string | IANA timezone (e.g. "America/New_York"). Auto-populated from email signatures when available. |
Example Request
{
"name": "Jane Smith",
"company_id": "550e8400-...",
"email": "[email protected]",
"role": "CFO"
}Example Response
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"company_name": "Acme Corp",
"role": "CFO",
"timezone": "America/New_York"
}Update Person
/ext/people/:uuidUpdate a person. Only provided fields are changed. Email must remain unique.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Person UUID (path parameter). |
| name | string | Person name. |
| company_id | string | Company UUID. |
| string | Email address. | |
| phone | string | Phone number. |
| role | string | Job title or role. |
| timezone | string | IANA timezone (e.g. "America/New_York"). |
Example Request
{
"role": "CEO"
}Example Response
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"role": "CEO",
"timezone": "America/New_York"
}Lookup Person
/ext/tools/lookup-personLook up a person by name, email, or UUID. Returns profile, company, and relationship data (interaction dates, team relationship scores). Name uses substring matching; multiple matches return a candidates list.
Parameters
| Name | Type | Description |
|---|---|---|
| identifier | string | Person name, email, or UUID. |
| identifier_type | string | One of: uuid, name, email. |
Example Request
{
"identifier": "[email protected]",
"identifier_type": "email"
}Example Response
{
"person": {
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"role": "CFO",
"phone": "+1-555-0123",
"timezone": "America/New_York",
"company_name": "Acme Corp",
"company_id": "550e8400-...",
"relationship": {
"last_email_date": "2026-03-28",
"last_meeting_date": "2026-03-25",
"relationship_scores": [
{
"user_name": "John Doe",
"score": 8.5,
"is_current_user": true
}
]
}
}
}Get People
/ext/tools/get-peopleGet all contacts at a specific company with relationship data (interaction dates, team relationship scores).
Parameters
| Name | Type | Description |
|---|---|---|
| company_id | string | Company UUID. |
Example Request
{
"company_id": "550e8400-..."
}Example Response
{
"people": [
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"role": "CFO",
"relationship": {
"last_email_date": "2026-03-28",
"last_meeting_date": "2026-03-25",
"relationship_scores": [
{
"user_name": "John Doe",
"score": 8.5,
"is_current_user": true
}
]
}
},
{
"uuid": "...",
"name": "Bob Johnson",
"email": "[email protected]",
"role": "CTO",
"relationship": {
"last_email_date": "2026-03-20",
"relationship_scores": [
{
"user_name": "John Doe",
"score": 3.2,
"is_current_user": true
}
]
}
}
]
}Projects
Create Project
/ext/projectsCreate a new project (deal). A tracker is automatically created (defaults to company_list if tracker_type not specified). Keywords are used for matching related emails, files, and calendar events.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Project name. |
| keywords | string | Comma-separated keywords for content matching. |
| description | string | Project description. |
| client_id | string | Client company UUID. |
| owner_id | string | Owner pipeline user UUID. Defaults to authenticated user. |
| status | string | Project status (default "new"). Use get_status_definitions to discover valid values. |
| deal_type | string | One of: general, buy_side, sell_side, capital_markets (default "general"). |
| priority | string | One of: low, med, high (default "med"). |
| start_date | string | Start date (YYYY-MM-DD). |
| end_date | string | End date (YYYY-MM-DD). |
Example Request
{
"name": "Acme Acquisition",
"description": "Buy-side mandate for Acme Corp",
"keywords": "acme,acquisition",
"deal_type": "buy_side",
"client_id": "..."
}Example Response
{
"uuid": "...",
"name": "Acme Acquisition",
"description": "Buy-side mandate for Acme Corp",
"keywords": "acme,acquisition",
"deal_type": "buy_side",
"status": "new",
"priority": "med",
"client_name": "Acme Corp",
"owner_name": "John Doe"
}Update Project
/ext/projects/:uuidUpdate a project. Changing keywords, start_date, or end_date triggers re-sync of linked content.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Project UUID (path parameter). |
| name | string | Project name. |
| description | string | Project description. |
| keywords | string | Comma-separated keywords. |
| client_id | string | Client company UUID. |
| owner_id | string | Owner pipeline user UUID. |
| status | string | Project status. |
| deal_type | string | general, buy_side, sell_side, or capital_markets. |
| priority | string | low, med, or high. |
| start_date | string | Start date (YYYY-MM-DD). |
| end_date | string | End date (YYYY-MM-DD). |
Example Request
{
"status": "active_discussion",
"priority": "high",
"description": "Updated scope"
}Example Response
{
"uuid": "...",
"name": "Acme Acquisition",
"status": "active_discussion",
"priority": "high",
"description": "Updated scope"
}Query Projects
/ext/tools/query-projectsSearch projects (deals) with filtering by client, deal type, status, and date range. Each project may include tev and fees ($M), buyer_company_id, buyer_name, seller_company_id, seller_name, target_company_id, target_name (stored on the project), plus primary_view_company_ids (companies on Acquisition Targets / Buyer Universe primary views).
Parameters
| Name | Type | Description |
|---|---|---|
| client_id | string | Filter to projects for this client company UUID. |
| deal_type | string | One of: general, buy_side, sell_side, capital_markets. |
| status | string | Filter by project status. |
| date_start | string | Earliest creation date (YYYY-MM-DD). |
| date_end | string | Latest creation date (YYYY-MM-DD). |
| limit | integer | Max results (default 20, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"deal_type": "buy_side",
"status": "active_discussion"
}Example Response
{
"projects": [
{
"uuid": "...",
"name": "Acme Acquisition",
"deal_type": "buy_side",
"status": "active_discussion",
"client": {
"uuid": "...",
"name": "Mandate Co",
"url": "/companies/..."
},
"tracker": {
"name": "AT",
"type": "acquisition_targets"
},
"tev": 120.5,
"fees": 4,
"buyer_company_id": "...",
"buyer_name": "Mandate Co",
"seller_company_id": "...",
"seller_name": "Seller Co",
"target_company_id": "...",
"target_name": "Target Inc"
}
],
"total": 1
}Get Project
/ext/tools/get-projectGet full project details by UUID including tasks, tracker accounts (companies or people depending on tracker type), working group roster, key dates, and AI-generated suggestions. Top-level fields may include tev, fees, buyer/seller/target company ids and names, and primary_view_company_ids (same semantics as query_projects). working_group entries: {uuid, user_type, user_id, name, category, is_team_lead}. key_dates entries: {uuid, title, start_date, end_date}. For people_list trackers, each person includes role_sought, gpa, and interview details (interviewer, date, comments, score) for up to 3 rounds.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Project UUID. |
Example Request
{
"uuid": "550e8400-..."
}Example Response
{
"uuid": "...",
"name": "Acme Acquisition",
"deal_type": "buy_side",
"status": "active_discussion",
"client": {
"uuid": "...",
"name": "Mandate Co",
"url": "/companies/..."
},
"tev": 120.5,
"fees": 4,
"buyer_company_id": "...",
"buyer_name": "Mandate Co",
"seller_company_id": "...",
"seller_name": "Seller Co",
"target_company_id": "...",
"target_name": "Target Inc",
"team_lead_name": "Jane Banker",
"working_group": [
{
"uuid": "...",
"user_type": "user",
"user_id": "...",
"name": "Jane Banker",
"category": "team",
"is_team_lead": true
},
{
"uuid": "...",
"user_type": "person",
"user_id": "...",
"name": "Sam Counsel",
"category": "advisors",
"is_team_lead": false
}
],
"key_dates": [
{
"uuid": "...",
"title": "Phase 1",
"start_date": "2026-04-01",
"end_date": "2026-04-15"
}
],
"tasks": [
{
"description": "Send CIM to targets",
"status": "open",
"due_date": "2026-04-10"
}
],
"workflows": [
{
"uuid": "...",
"name": "AT",
"type": "acquisition_targets",
"companies": [
{
"uuid": "...",
"name": "Globex Inc",
"website": "globex.com",
"account_status": "outreach_sent",
"next_steps": "Follow up on CIM",
"url": "/companies/..."
}
]
}
]
}Create Project (Tool)
/ext/tools/create-projectCreate a new project with a tracker. A tracker is automatically created (defaults to company_list if tracker_type not specified). acquisition_targets/buyer_universe require client_id and trigger AI generation. outreach syncs email activity. investor_outreach creates the Investor Outreach (ECM) tracker.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Project name. |
| description | string | Project description. |
| keywords | string | Comma-separated keywords. |
| client_id | string | Client company UUID. |
| owner_id | string | Owner pipeline user UUID. |
| deal_type | string | general, buy_side, sell_side, or capital_markets. |
| status | string | Project status (default "new"). |
| priority | string | low, med, or high. |
| start_date | string | YYYY-MM-DD. |
| end_date | string | YYYY-MM-DD. |
| tracker_type | string | Type of tracker (default "company_list"). One of: acquisition_targets, buyer_universe, outreach, investor_outreach, company_list, people_list, prospecting. |
| tracker_description | string | Tracker description. Used as context for AI generation and account status analysis. |
| buyer_type | string | For acquisition_targets/buyer_universe: "strategic" or "financial_sponsor". |
| outreach_start_date | string | For outreach tracker: optional start date filter (YYYY-MM-DD). Omit for no lower bound. |
| outreach_end_date | string | For outreach tracker: optional end date filter (YYYY-MM-DD). Omit for no upper bound. |
| sync_tags | string | For people_list tracker: comma-separated tags for auto-syncing tagged people. |
| initial_company_ids | array | Company UUIDs to seed into the tracker. |
| initial_person_ids | array | For people_list tracker: person UUIDs to seed into the tracker. |
Example Request
{
"name": "Acme Acquisition",
"description": "Buy-side mandate for Acme",
"deal_type": "buy_side",
"client_id": "...",
"tracker_type": "acquisition_targets",
"buyer_type": "strategic"
}Example Response
{
"uuid": "...",
"name": "Acme Acquisition",
"deal_type": "buy_side",
"status": "new",
"tracker": {
"uuid": "...",
"type": "acquisition_targets",
"generated_status": "pending"
}
}Update Project (Tool)
/ext/tools/update-projectUpdate project fields (name, description, keywords, status, etc.), tracker fields (tracker_name, tracker_description, dates, buyer_type for acquisition_targets/buyer_universe), tracker accounts, the working group roster, and key dates. Use account_operations for tracker entries (person_id for people_list; company_id otherwise). Use working_group_operations to add/update/remove roster members (supports is_team_lead). Use key_date_operations to add/update/remove timeline milestones.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Project UUID. |
| name | string | Project name. |
| description | string | Project description. |
| keywords | string | Comma-separated keywords. |
| client_id | string | Client company UUID. |
| owner_id | string | Owner pipeline user UUID. |
| deal_type | string | general, buy_side, sell_side, or capital_markets. |
| status | string | Project status. |
| priority | string | low, med, or high. |
| start_date | string | YYYY-MM-DD. |
| end_date | string | YYYY-MM-DD. |
| tracker_name | string | Tracker name. |
| tracker_description | string | Tracker description. Used as context for AI generation and account status analysis. |
| outreach_start_date | string | For outreach tracker: optional start date filter (YYYY-MM-DD). |
| outreach_end_date | string | For outreach tracker: optional end date filter (YYYY-MM-DD). |
| sync_tags | string | For people_list tracker: comma-separated tags for auto-syncing tagged people. |
| buyer_type | string | For acquisition_targets/buyer_universe: "strategic" or "financial_sponsor". |
| account_operations | array | Array of operations. For people_list trackers: {action, person_id, account_status?, role_sought?, gpa?, interviewer_1?, interview_1_date?, interview_1_comments?, interview_1_score?, ...rounds 2-3}. For other trackers: {action, company_id, account_status?, next_steps?, sentiment?}. For acquisition_targets / buyer_universe trackers, also accepts per-company tev? / fees? ($M, null clears). For investor_outreach trackers, also accepts is_lead?, indicated_amount? ($M), allocated_amount? ($M), price_limit?, investor_type?, order_type? (null clears). Invalid investor_type / order_type values are rejected and the error response lists the valid values. Actions: add, update, remove. |
| working_group_operations | array | Array of operations on the working group roster. add: {action:"add", user_type:"user"|"person", user_id, category:"team"|"client"|"advisors", is_team_lead?}. update/remove: {action, uuid, ...fields}. is_team_lead=true surfaces the member as team_lead_name on project responses. |
| key_date_operations | array | Array of operations on the project timeline. add: {action:"add", title, start_date, end_date}. update/remove: {action, uuid, ...fields}. Dates are YYYY-MM-DD; end_date must be on or after start_date. |
Example Request
{
"uuid": "...",
"status": "mandated",
"tracker_description": "Strategic acquirers in the SaaS space",
"account_operations": [
{
"action": "add",
"company_id": "...",
"account_status": "outreach_sent"
},
{
"action": "update",
"company_id": "...",
"next_steps": "Schedule follow-up call"
}
],
"working_group_operations": [
{
"action": "add",
"user_type": "user",
"user_id": "...",
"category": "team",
"is_team_lead": true
},
{
"action": "remove",
"uuid": "..."
}
],
"key_date_operations": [
{
"action": "add",
"title": "Bid Due",
"start_date": "2026-05-01",
"end_date": "2026-05-01"
}
]
}Example Response
{
"uuid": "...",
"name": "Acme Acquisition",
"status": "mandated",
"working_group_operations": [
{
"status": "added",
"action": "add",
"uuid": "...",
"user_id": "..."
},
{
"status": "removed",
"action": "remove",
"uuid": "..."
}
],
"key_date_operations": [
{
"status": "added",
"action": "add",
"uuid": "...",
"title": "Bid Due"
}
]
}Team
Get Team
/ext/tools/get-teamGet team members with UUID, name, email, and is_current_user flag. Use to discover valid assignee_id values for tasks.
Example Request
{}Example Response
{
"members": [
{
"uuid": "...",
"name": "John Doe",
"email": "[email protected]",
"is_current_user": true
},
{
"uuid": "...",
"name": "Jane Smith",
"email": "[email protected]",
"is_current_user": false
}
],
"total": 2
}Tasks
Create Task
/ext/tasksCreate a new task (action item / follow-up). Assignee defaults to the current user; call get_team for team member UUIDs.
Parameters
| Name | Type | Description |
|---|---|---|
| description | string | Task description. |
| status | string | Task status (default "open"). Use get_status_definitions for valid values. |
| client_company_id | string | Client company UUID. |
| subject_company_id | string | Subject company UUID (what the task is about). |
| subject_company_name | string | Subject company name (when no UUID is available). |
| person_id | string | Person UUID or raw name string. |
| project_id | string | Project UUID. |
| assignee_id | string | Assignee pipeline user UUID. Defaults to current user. Call get_team for valid UUIDs. |
| due_date | string | Due date (YYYY-MM-DD). |
| pending_from | string | Who the task is pending on: 'banker', 'coverage_client', 'counterparty', or 'third_party'. |
| task_type | string | How the task entered the system: 'stated', 'inferred', or 'user_created' (default). |
| deal_hint | string | Optional deal/project hint for context. |
| relationship_source_id | string | UUID of the source relationship. |
| relationship_source_name | string | Name/label of the source relationship. |
| source_type | string | Source type: email, file, calendar, user, or event (default "user"). |
Example Request
{
"description": "Follow up with Jane on Q2 numbers",
"due_date": "2026-04-15",
"client_company_id": "..."
}Example Response
{
"uuid": "...",
"description": "Follow up with Jane on Q2 numbers",
"status": "open",
"due_date": "2026-04-15",
"assignee_id": "...",
"pending_from": null
}Update Task
/ext/tasks/:uuidUpdate a task. Only provided fields are changed. Assignee cannot be cleared.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Task UUID (path parameter). |
| description | string | Task description. |
| status | string | Task status. |
| client_company_id | string | Client company UUID. |
| subject_company_id | string | Subject company UUID (what the task is about). |
| subject_company_name | string | Subject company name (when no UUID is available). |
| person_id | string | Person UUID or raw name. |
| assignee_id | string | Assignee pipeline user UUID. Call get_team for valid UUIDs. |
| due_date | string | Due date (YYYY-MM-DD). |
| pending_from | string | Who the task is pending on: 'banker', 'coverage_client', 'counterparty', or 'third_party'. Set to null to clear. |
| task_type | string | How the task entered the system: 'stated', 'inferred', or 'user_created'. |
| deal_hint | string | Optional deal/project hint for context. |
| relationship_source_id | string | UUID of the source relationship. |
| relationship_source_name | string | Name/label of the source relationship. |
| project_id | string | Project UUID. |
Example Request
{
"status": "done"
}Example Response
{
"uuid": "...",
"description": "Follow up with Jane on Q2 numbers",
"status": "done"
}Get Tasks
/ext/tools/get-tasksQuery tasks with filtering by company, due date range, status, and keyword search. Returns up to 50 tasks. When a task has a linked project, the expanded project object may include team_lead_name plus tev, fees, buyer/seller/target company ids and names (stored on the project).
Parameters
| Name | Type | Description |
|---|---|---|
| company_id | string | Filter to tasks for this client company UUID (maps to client_company_id). |
| project_id | string | Filter to tasks on this project UUID. Takes precedence over company_id. |
| due_date_start | string | Earliest due date (YYYY-MM-DD). |
| due_date_end | string | Latest due date (YYYY-MM-DD). |
| status | string | Filter by task status. |
| search | string | Substring search in task description. |
| limit | integer | Max tasks (default 30, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"status": "open",
"due_date_end": "2026-04-15"
}Example Response
{
"tasks": [
{
"uuid": "...",
"description": "Follow up with Jane on Q2 numbers",
"status": "open",
"due_date": "2026-04-10",
"pending_from": "banker",
"assignee": {
"uuid": "...",
"name": "John Doe"
},
"company": {
"uuid": "...",
"name": "Acme Corp",
"url": "/companies/..."
},
"person": {
"uuid": "...",
"name": "Jane Doe",
"url": "/people/..."
},
"project": {
"uuid": "...",
"name": "Acme Acquisition",
"url": "/projects/..."
},
"source": {
"type": "email",
"uuid": "...",
"name": "Re: Q2 Review",
"url": "/emails/..."
}
},
{
"uuid": "...",
"description": "Send CIM to Globex",
"status": "open",
"due_date": "2026-04-12",
"pending_from": "counterparty",
"assignee": {
"uuid": "...",
"name": "Jane Smith"
},
"company": {
"uuid": "...",
"name": "Globex Inc",
"url": "/companies/..."
},
"person": null,
"project": null,
"source": {
"type": "file",
"uuid": "...",
"name": "Meeting Notes.pdf",
"url": "/files/..."
}
}
],
"total": 2,
"showing": 2
}Comments
List Comments
/ext/commentsFetch comments for a specific record.
Parameters
| Name | Type | Description |
|---|---|---|
| data_model | string | Record type: company, person, task, project, metric_schema, or status_definition. |
| record_id | string | UUID of the record. |
| skip | integer | Pagination offset (default 0). |
| limit | integer | Page size (default 200). |
Example Request
{
"data_model": "company",
"record_id": "550e8400-..."
}Example Response
[
{
"uuid": "...",
"content": "Great meeting today",
"source_name": "John Doe",
"created_at": "2026-04-01T12:00:00Z"
}
]Create Comment
/ext/commentsAdd a comment to a record. Content must be non-empty.
Parameters
| Name | Type | Description |
|---|---|---|
| data_model | string | Record type (e.g. company, person, project, task). |
| record_id | string | UUID of the record to comment on. |
| content | string | Comment text. |
Example Request
{
"data_model": "company",
"record_id": "550e8400-...",
"content": "Great meeting today"
}Example Response
{
"uuid": "...",
"content": "Great meeting today",
"source_name": "John Doe",
"created_at": "2026-04-01T12:00:00Z"
}Update Comment
/ext/comments/:uuidUpdate a comment's content. Only the original author can edit.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Comment UUID (path parameter). |
| content | string | Updated comment text. |
Example Request
{
"content": "Updated: Great meeting today, follow up Friday"
}Example Response
{
"uuid": "...",
"content": "Updated: Great meeting today, follow up Friday"
}Metric Schemas
Create Metric Schema
/ext/metric-schemasCreate a new metric definition. Name is normalized to lowercase with underscores. Must be unique per team.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Metric name (auto-normalized to lowercase_underscores). |
| type | string | Value type (e.g. text, money_millions, rate, integer). |
| description | string | What this metric measures. |
| category | string | Grouping category. |
| display_name | string | Human-readable name. Auto-generated from name if omitted. |
| examples | string | Example values to guide AI extraction. |
| should_parse | boolean | Whether AI should auto-extract this metric (default true). |
Example Request
{
"name": "annual_revenue",
"type": "money_millions",
"category": "Financials",
"description": "Annual revenue in millions"
}Example Response
{
"uuid": "...",
"name": "annual_revenue",
"display_name": "Annual Revenue",
"type": "money_millions",
"category": "Financials"
}Update Metric Schema
/ext/metric-schemas/:uuidUpdate a metric schema. Name cannot be changed. System metrics cannot be modified.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | MetricSchema UUID (path parameter). |
| description | string | What this metric measures. |
| type | string | Value type. |
| category | string | Grouping category. |
| display_name | string | Human-readable name. |
| examples | string | Example values. |
| should_parse | boolean | Whether AI should auto-extract this metric. |
Example Request
{
"description": "Updated description",
"should_parse": false
}Example Response
{
"uuid": "...",
"name": "annual_revenue",
"description": "Updated description",
"should_parse": false
}Query Metric History
/ext/tools/query-metric-historyFind companies where a numeric metric changed significantly over a date range. Returns up to 25 companies sorted by largest absolute change.
Parameters
| Name | Type | Description |
|---|---|---|
| metric_name | string | Exact metric name (must be numeric type). |
| date_from | string | Start of date range (YYYY-MM-DD). |
| date_to | string | End of date range (YYYY-MM-DD). |
| change_operator | string | One of: gt, lt, gte, lte. |
| change_value | string | Threshold (e.g. "$50M", "10", "-5"). |
| change_type | string | "absolute" (default) or "percent". |
| filters | array | Optional company universe filters (same format as query_companies). |
| limit | integer | Max companies (default 25, max 25). |
Example Request
{
"metric_name": "revenue",
"date_from": "2025-01-01",
"date_to": "2026-01-01",
"change_operator": "gt",
"change_value": "$100M"
}Example Response
{
"companies": [
{
"uuid": "550e8400-...",
"name": "Acme Corp",
"change": "$200M",
"first_value": "$1.0B",
"last_value": "$1.2B",
"history": [
{
"date": "2025-01-15",
"value": "$1.0B"
},
{
"date": "2025-12-01",
"value": "$1.2B"
}
]
}
],
"total": 1
}Get Metric Schema
/ext/tools/get-metric-schemaGet available metric definitions for the user's team. Returns metric names, display names, types, categories, and descriptions.
Parameters
| Name | Type | Description |
|---|---|---|
| category | string | Filter to a specific category. |
| type | string | Filter by metric value type. |
Example Request
{
"category": "Financials"
}Example Response
{
"metrics": [
{
"name": "revenue",
"display_name": "Revenue",
"type": "money_millions",
"category": "Financials"
},
{
"name": "ebitda",
"display_name": "EBITDA",
"type": "money_millions",
"category": "Financials"
}
],
"categories": [
"Financials",
"Operational",
"Market"
]
}Status Definitions
Create Status Definition
/ext/status-definitionsCreate a new status definition for a status type. Value is normalized and must be unique per team/type.
Parameters
| Name | Type | Description |
|---|---|---|
| status_type | string | Status category (e.g. task, project, workflow_account_outreach). |
| value | string | Machine-readable value (e.g. in_progress). |
| display_name | string | Human-readable label (e.g. In Progress). |
| description | string | Description of this status. |
| phase | string | Phase grouping (e.g. active, closed). |
| is_terminal | boolean | Whether this status represents an end state (default false). |
| sort_order | number | Display order (lower = first). |
Example Request
{
"status_type": "task",
"value": "in_review",
"display_name": "In Review",
"phase": "active"
}Example Response
{
"uuid": "...",
"status_type": "task",
"value": "in_review",
"display_name": "In Review",
"phase": "active",
"is_terminal": false
}Update Status Definition
/ext/status-definitions/:uuidUpdate a status definition. If value changes, all entities using the old value are migrated.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | StatusDefinition UUID (path parameter). |
| value | string | New status value (triggers entity migration). |
| display_name | string | Human-readable label. |
| description | string | Description. |
| phase | string | Phase grouping. |
| is_terminal | boolean | Whether this is an end state. |
| sort_order | number | Display order. |
Example Request
{
"display_name": "Under Review",
"description": "Task is being reviewed by the team"
}Example Response
{
"uuid": "...",
"value": "in_review",
"display_name": "Under Review",
"description": "Task is being reviewed by the team"
}Get Status Definitions
/ext/tools/get-status-definitionsGet the allowed status values for a status type. Common types: task, project, workflow_account_outreach, workflow_account_acquisition_targets, workflow_account_buyer_universe, workflow_account_company_list, workflow_account_people_list, workflow_account_prospecting.
Parameters
| Name | Type | Description |
|---|---|---|
| status_type | string | The status category to look up (e.g. task, project). |
Example Request
{
"status_type": "task"
}Example Response
{
"statuses": [
{
"value": "open",
"display_name": "Open",
"phase": "active",
"is_terminal": false
},
{
"value": "done",
"display_name": "Done",
"phase": "closed",
"is_terminal": true
}
]
}Email Templates
List Email Templates
/ext/email-templatesList the team's live (non-archived, latest-version) email templates. Templates support whitelisted handlebars ({{first_name}}, {{last_name}}, {{title}}, {{email}}, {{company_name}}, {{company_domain}}, {{sender_first_name}}) that resolve per-recipient at draft generation.
Parameters
| Name | Type | Description |
|---|---|---|
| folder | string | Optional folder filter (case-sensitive). |
Example Response
{
"templates": [
{
"uuid": "...",
"name": "Spring intro",
"folder": "outbound",
"subject": "Hello {{first_name}}",
"body": "Body for {{company_name}}",
"version": 1,
"is_latest": true,
"is_archived": false
}
]
}Get Email Template
/ext/email-templates/:uuidFetch one template. Pass include_history=true to also return the version chain (newest first) under the `history` key — useful for showing how a template has evolved.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Template UUID (path parameter). |
| include_history | boolean | If true, include `history` (newest first). Default false. |
Example Response
{
"uuid": "...",
"name": "Spring intro",
"subject": "Hello {{first_name}}",
"body": "...",
"version": 2,
"is_latest": true,
"history": null
}Create Email Template
/ext/email-templatesCreate a new template. Subject and body support whitelisted handlebars (see list_email_templates). Use the returned uuid as template_id when creating a campaign.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Template name (1-255 chars). |
| subject | string | Subject line — may include handlebars. |
| body | string | Body content — may include handlebars. |
| folder | string | Optional folder label (free text). |
Example Request
{
"name": "Spring intro",
"subject": "Hello {{first_name}}",
"body": "Body for {{company_name}}"
}Example Response
{
"uuid": "...",
"name": "Spring intro",
"version": 1,
"is_latest": true
}Update Email Template
/ext/email-templates/:uuidPatch a template. Only provided fields change. Creates a new version row — the prior row stays in the history chain. Only the latest, non-archived version is editable. Returns the new latest version.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Template UUID (must be the latest version). |
| name | string | New name. |
| folder | string | New folder. |
| subject | string | New subject. |
| body | string | New body. |
Example Request
{
"subject": "Hello {{first_name}} — updated"
}Example Response
{
"uuid": "...",
"version": 2,
"is_latest": true,
"parent_template_id": "..."
}Email Campaigns
List Email Campaigns
/ext/campaignsList the team's email campaigns (newest first). Statuses: draft, generating_drafts, drafts_ready, partial_failed, scheduled, sending, sent, cancelled.
Parameters
| Name | Type | Description |
|---|---|---|
| project_id | string | Optional project filter. |
| status | string | Optional status filter. |
| limit | integer | Max rows (default 100). |
Example Response
{
"campaigns": [
{
"uuid": "...",
"name": "Spring outbound",
"status": "drafts_ready",
"row_count": 12
}
]
}Get Email Campaign
/ext/campaigns/:uuidFetch a campaign with its per-recipient rows. Each row carries its own `uuid` — use it for per-row schedule overrides via schedule_email_campaign.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Campaign UUID (path parameter). |
Example Response
{
"uuid": "...",
"name": "Spring outbound",
"status": "drafts_ready",
"row_count": 2,
"rows": [
{
"uuid": "row-1",
"primary_person_id": "...",
"company_id": "...",
"draft_status": "completed",
"delivery_status": "draft",
"schedule_time": null
}
],
"reply_count": 0
}Create Email Campaign
/ext/campaignsAtomically create a campaign: writes the campaign row, per-recipient rows, AND triggers the Cloud Run job that generates drafts. Rolls back on any failure (including the trigger). Provide exactly one of `recipients` (fresh campaign) or `follow_up` (follow-up campaign). After this returns, the campaign begins async draft generation — poll get_email_campaign until status="drafts_ready" before calling schedule_email_campaign.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Campaign name. |
| template_id | string | UUID of an email template (see list_email_templates). |
| recipients | array | Fresh-campaign mode. Flat list of {company_id, person_id, role}. role: "primary" | "to" | "cc" | "bcc". For each company, exactly one entry must have role="primary". |
| follow_up | object | Follow-up mode. {parent_campaign_id, reply_mode: "new_thread"|"same_thread", parent_row_ids?: string[]}. Without parent_row_ids, every parent row with delivery_status="sent" is followed up on. |
Example Request
{
"name": "Spring outbound",
"template_id": "...",
"recipients": [
{
"company_id": "...",
"person_id": "...",
"role": "primary"
},
{
"company_id": "...",
"person_id": "...",
"role": "cc"
}
]
}Example Response
{
"uuid": "...",
"name": "Spring outbound",
"status": "generating_drafts",
"row_count": 1,
"rows": [
{
"uuid": "row-1",
"primary_person_id": "...",
"company_id": "...",
"draft_status": "initialized"
}
]
}Schedule Email Campaign
/ext/campaigns/:uuid/scheduleSchedule a campaign's send via Cloud Tasks. Campaign must be in drafts_ready, partial_failed, scheduled, or sent (idempotent). Two modes (per-row wins): (1) Single base time + optional stagger — pass send_at_iso (ISO 8601 UTC) and optional interval_minutes_between. (2) Per-row override — pass schedules=[{campaign_email_id, send_at_iso}]; campaign_email_id values come from get_email_campaign(...).rows[*].uuid. Times must be within 30 days from now.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Campaign UUID (path parameter). |
| send_at_iso | string | ISO 8601 UTC base time. Required when `schedules` is omitted. |
| interval_minutes_between | integer | Optional stagger between rows in minutes (default 0). |
| schedules | array | Per-row override; wins over send_at_iso. Each item: {campaign_email_id, send_at_iso}. |
Example Request
{
"send_at_iso": "2026-05-18T15:00:00Z",
"interval_minutes_between": 5
}Example Response
{
"uuid": "...",
"status": "scheduled",
"row_count": 2
}Records
Delete Record
/ext/records/:record_type/:uuidDelete a record by type and UUID. Performs soft delete (email_template: archives the row; email_campaign: cascades to rows and best-effort removes pushed Gmail/Outlook drafts for non-sent rows — sent messages untouched, rejects in-flight states sending/generating_drafts/scheduled). For company, this is team-scoped: it removes the company from the caller's team only (unlinks the team's pipeline links, metrics, contacts, email/file/calendar associations, workflows, view memberships, tasks, etc.). The company record and all global / other-team data are preserved — not a global delete; re-adding the company restores the team's records. Supported types: company, person, task, metric_schema, project, comment, status_definition, email, calendar, file, port_co_relationship, fund, email_template, biopharma_asset, biopharma_indication, email_campaign.
Parameters
| Name | Type | Description |
|---|---|---|
| record_type | string | One of: company, person, task, metric_schema, project, comment, status_definition, email, calendar, file, port_co_relationship, fund, email_template, biopharma_asset, biopharma_indication, email_campaign. |
| uuid | string | Record UUID. |
Example Request
{
"record_type": "company",
"uuid": "550e8400-..."
}Example Response
{
"success": true,
"record_type": "company",
"uuid": "550e8400-..."
}Dashboard
Get Dashboard Config
/ext/dashboard-configs/effectiveGet a dashboard config — by effective type ("home"/"custom") or by UUID. Dashboard types: "home" (main home page) and "custom" (user-created dashboards on /dashboards page).
Parameters
| Name | Type | Description |
|---|---|---|
| type | string | Dashboard type: "home" (default) or "custom". Ignored when uuid is provided. |
| uuid | string | UUID of a specific dashboard. When provided, fetches by UUID instead of the effective config. |
Example Request
{
"type": "home"
}Example Response
{
"uuid": "8c537aac-...",
"type": "home",
"name": "Home Dashboard",
"is_profile_level": false,
"layout": "[{\"i\":\"tasks\",\"x\":0,\"y\":0,\"w\":6,\"h\":5,\"minW\":4,\"minH\":3}]",
"components": "[{\"id\":\"tasks\",\"type\":\"tasks\",\"name\":\"Tasks\",\"config\":{\"limit\":10,\"display_type\":\"cards\"}}]"
}List Dashboards
/ext/dashboard-configs/listList all dashboards owned by the current user. Optionally filter by type ("home", "custom").
Parameters
| Name | Type | Description |
|---|---|---|
| type | string | Filter by type: "home", "custom", or omit for all. |
Example Request
{
"type": "custom"
}Example Response
[
{
"uuid": "aaa-...",
"type": "custom",
"name": "Sales Board",
"layout": "[]",
"components": "[]"
},
{
"uuid": "bbb-...",
"type": "custom",
"name": "Pipeline View",
"layout": "[]",
"components": "[]"
}
]Create Dashboard
/ext/dashboard-configs/Create a new dashboard. Defaults to type "custom". Layout and components default to empty arrays if omitted.
Parameters
| Name | Type | Description |
|---|---|---|
| name | string | Dashboard name. |
| type | string | Dashboard type (default: "custom"). |
| layout | string | JSON string of layout array. Defaults to "[]". |
| components | string | JSON string of components array. Defaults to "[]". |
Example Request
{
"name": "Pipeline Tracker",
"type": "custom"
}Example Response
{
"uuid": "ccc-...",
"type": "custom",
"name": "Pipeline Tracker",
"layout": "[]",
"components": "[]"
}Delete Dashboard
/ext/dashboard-configs/:uuidDelete a user-level dashboard by UUID. Profile-level configs cannot be deleted.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | UUID of the dashboard to delete. |
Example Request
{
"uuid": "ccc-..."
}Example Response
{
"ok": true
}Update Dashboard Config
/ext/dashboard-configs/:uuidUpdate a user-level dashboard configuration. Only the config owner can update. Layout item IDs must match component IDs. Layout items must not overlap, positions must be non-negative, sizes >= 1, and x + w must not exceed grid columns (18). When adding widgets, send layout and components together so IDs match. Valid widget types include meeting_prep (AI meeting prep for one company; requires company_id in config, backed by company_talking_points generations) and biopharma_catalyst_calendar (table-only team-visible company/asset/indication catalyst milestones; columns: company_name, asset_name, asset_target, asset_moa, asset_is_lead, indication_name, phase, milestone, milestone_date, peak_sales, indication_is_lead, top_comps, asset_comps; filters: milestone_date, phase, lead, peak_sales; phase values: preclinical, phase 1, phase 2, pivotal, filed, approved; use a milestone_date filter for date ranges). Valid display_type values: table, cards, stats, single_stat. single_stat aggregates one numeric field via agg_function (sum/avg/min/max/count) + agg_field; currently supported on the funds widget (requires company_id; numeric fields: amount, portcoCount). Widget date range (date_mode, date_relative_unit, days vs months, date_start/date_end): tasks/calendar/emails use server query bounds; projects/people/companies/portfolio/funds filter client-side using date_filter_field (one date column per row; funds default __fund_period_overlap__ for span overlap).
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Dashboard config UUID from get_dashboard_config. |
| name | string | Dashboard display name. |
| layout | string | JSON string of react-grid-layout items array. |
| components | string | JSON string of dashboard components array. |
Example Request
{
"uuid": "8c537aac-...",
"name": "My Dashboard",
"layout": "[{\"i\":\"tasks\",\"x\":0,\"y\":0,\"w\":12,\"h\":6,\"minW\":4,\"minH\":3}]",
"components": "[{\"id\":\"tasks\",\"type\":\"tasks\",\"name\":\"Tasks\",\"config\":{\"limit\":20,\"display_type\":\"table\"}}]"
}Example Response
{
"uuid": "8c537aac-...",
"type": "home",
"name": "My Dashboard",
"is_profile_level": false,
"layout": "[{\"i\":\"tasks\",\"x\":0,\"y\":0,\"w\":12,\"h\":6,\"minW\":4,\"minH\":3}]",
"components": "[{\"id\":\"tasks\",\"type\":\"tasks\",\"name\":\"Tasks\",\"config\":{\"limit\":20,\"display_type\":\"table\"}}]"
}Issue Reports
Report Issue
/ext/tools/report-issueReport an issue or bug. Creates an issue report tied to the current user. No screenshot required.
Parameters
| Name | Type | Description |
|---|---|---|
| description | string | Details about the issue. |
| page_url | string | URL or page name where the issue was observed. |
Example Request
{
"description": "Search results are not returning expected companies",
"page_url": "/companies"
}Example Response
{
"uuid": "...",
"description": "Search results are not returning expected companies",
"page_url": "/companies",
"status": "open",
"created_at": "2026-04-02T12:00:00"
}Sentiments
Get Sentiments
/ext/tools/get-sentimentsQuery sentiment signals extracted from emails, files, and calendar events. Each has actor, target, action_value, score, and confidence.
Parameters
| Name | Type | Description |
|---|---|---|
| actor_company_id | string | Sentiments FROM this company UUID. |
| target_company_id | string | Sentiments ABOUT this company UUID. |
| theme | string | Filter by theme (substring match). |
| limit | integer | Max results (default 30, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"target_company_id": "550e8400-...",
"limit": 10
}Example Response
{
"sentiments": [
{
"actor_company": "Globex Inc",
"target_company": "Acme Corp",
"action_value": "expressed interest in acquisition",
"score": 0.85,
"confidence": 0.9,
"source_type": "email",
"date": "2026-03-28"
}
]
}Emails
Query Emails
/ext/tools/query-emailsSearch emails by keyword, date range, company, project, person, and tag. Use "me" for the current user. Use get_email with a result UUID to get full content. `total` is the full match count for the filters (use `limit` / `offset` to page).
Parameters
| Name | Type | Description |
|---|---|---|
| search | string | Keyword search across subject and body. |
| date_start | string | Earliest email date (YYYY-MM-DD). |
| date_end | string | Latest email date (YYYY-MM-DD). |
| company_id | string | Filter to emails linked to this company. |
| project_id | string | Filter to emails linked to this project UUID. Takes precedence over company_id. |
| person | string | Person name, email, or UUID. Use "me" for current user. |
| person_role | string | "sender" or "receiver". |
| tag | string | Filter to emails with this tag (e.g. "outreach", "recruiting"). |
| limit | integer | Max results (default 20, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"search": "quarterly review",
"person": "me",
"person_role": "sender"
}Example Response
{
"emails": [
{
"uuid": "...",
"subject": "Q1 Quarterly Review - Acme Corp",
"sender": "[email protected]",
"date": "2026-03-15",
"tags": [
"outreach"
],
"snippet": "Attached is the quarterly review for..."
}
],
"total": 1
}Get Email
/ext/tools/get-emailGet full email content by UUID.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Email UUID. |
Example Request
{
"uuid": "550e8400-..."
}Example Response
{
"uuid": "...",
"subject": "Q1 Quarterly Review",
"sender": "[email protected]",
"receivers": [
"[email protected]"
],
"date": "2026-03-15",
"body": "Hi Jane, attached is the quarterly review...",
"attachments": [
{
"name": "Q1_Review.pdf",
"size": "2.4MB"
}
]
}Calendars
Query Calendars
/ext/tools/query-calendarsSearch calendar events by date range, company, project, person, tag, and text search. Use "me" for the current user. `total` is the full match count for the filters (use `limit` / `offset` to page).
Parameters
| Name | Type | Description |
|---|---|---|
| date_start | string | Earliest event date (YYYY-MM-DD). |
| date_end | string | Latest event date (YYYY-MM-DD). |
| company_id | string | Filter to events linked to this company. |
| project_id | string | Filter to events linked to this project UUID. Takes precedence over company_id. |
| person | string | Attendee/organizer name, email, or UUID. Use "me" for current user. |
| search | string | Substring search in title/description/attendees. |
| tag | string | Filter to events with this tag (e.g. "outreach", "recruiting"). |
| limit | integer | Max results (default 20, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"person": "me",
"date_start": "2026-04-01",
"date_end": "2026-04-07"
}Example Response
{
"events": [
{
"uuid": "...",
"title": "Acme Corp - Management Presentation",
"date": "2026-04-03",
"start_time": "10:00 AM",
"end_time": "11:00 AM",
"tags": [
"outreach"
],
"attendees": [
"[email protected]",
"[email protected]"
]
}
],
"total": 1
}Get Calendar Event
/ext/tools/get-calendarGet full calendar event details by UUID.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | Calendar event UUID. |
Example Request
{
"uuid": "550e8400-..."
}Example Response
{
"uuid": "...",
"title": "Acme Corp - Management Presentation",
"date": "2026-04-03",
"start_time": "10:00 AM",
"end_time": "11:00 AM",
"location": "Zoom",
"attendees": [
"[email protected]",
"[email protected]",
"[email protected]"
],
"description": "Q2 planning discussion"
}Files
Query Files
/ext/tools/query-filesSearch uploaded files and email attachments. `total` in the response is the full match count for the filters (use `limit` / `offset` to page). `date_start` / `date_end` filter by upload time (created_at), not `file_date`.
Parameters
| Name | Type | Description |
|---|---|---|
| date_start | string | Start of range (YYYY-MM-DD), inclusive; filters by file upload time (created_at). |
| date_end | string | End of range (YYYY-MM-DD), inclusive; filters by file upload time (created_at). |
| company_id | string | Filter to files linked to this company. |
| project_id | string | Filter to files linked to this project UUID. Takes precedence over company_id. |
| search | string | Substring search in title/description/content. |
| tag | string | Filter to files with this exact tag (e.g. "outreach", "recruiting"). |
| limit | integer | Max results (default 20, max 50). |
| offset | integer | Number of results to skip for pagination (default 0). |
Example Request
{
"search": "pitch deck",
"company_id": "550e8400-..."
}Example Response
{
"files": [
{
"uuid": "...",
"title": "Acme Corp - Pitch Deck Q1 2026.pdf",
"date": "2026-03-10",
"size": "4.2MB",
"source": "email_attachment"
}
],
"total": 1
}Get File
/ext/tools/get-fileGet full file content by UUID.
Parameters
| Name | Type | Description |
|---|---|---|
| uuid | string | File UUID. |
Example Request
{
"uuid": "550e8400-..."
}Example Response
{
"uuid": "...",
"title": "Acme Corp - Pitch Deck Q1 2026.pdf",
"date": "2026-03-10",
"size": "4.2MB",
"source": "email_attachment",
"content": "Acme Corp is a leading enterprise SaaS platform..."
}Upload File
/ext/filesUpload a file via base64-encoded content. The MCP tool accepts either a local file_path (server reads the file) or inline content_base64. This endpoint receives the base64 payload from the MCP server.
Parameters
| Name | Type | Description |
|---|---|---|
| content_base64 | string | Base64-encoded file content. |
| filename | string | Original filename with extension (e.g. report.pdf). |
| title | string | Display title (defaults to filename). |
| description | string | File description. |
| content_type | string | MIME type (inferred from extension if omitted). |
| company_id | string | UUID of a company to associate the file with. |
| calendar_id | string | UUID of a calendar event to associate the file with. |
| file_date | string (ISO 8601) | Effective date of the file's content. Use for backdated uploads — AI parsing uses this as the reference date for task extraction and metric observations. Defaults to now(). |
Example Request
{
"content_base64": "SGVsbG8gV29ybGQ=",
"filename": "hello.txt",
"title": "Hello World"
}Example Response
{
"uuid": "...",
"title": "Hello World",
"original_filename": "hello.txt",
"mime_type": "text/plain",
"file_size_bytes": 11,
"source_type": "upload"
}Summaries & meeting prep
Get My Day
/ext/tools/get-my-dayGet the user's daily summary: today's agenda, key meetings, action items, and priorities.
Example Request
{}Example Response
{
"agenda": [
{
"time": "10:00 AM",
"title": "Acme Corp - Management Presentation"
},
{
"time": "2:00 PM",
"title": "Internal Deal Review"
}
],
"action_items": [
"Follow up with Jane on Q2 numbers",
"Send CIM to Globex"
],
"priorities": [
"Close Acme LOI by Friday"
]
}Get My Week
/ext/tools/get-my-weekGet the user's weekly summary: the week ahead including meetings, deal updates, and deadlines.
Example Request
{}Example Response
{
"meetings": [
{
"date": "2026-04-01",
"title": "Acme Corp - Management Presentation"
},
{
"date": "2026-04-03",
"title": "Globex Diligence Call"
}
],
"deal_updates": [
{
"project": "Acme Acquisition",
"status": "LOI sent"
}
],
"deadlines": [
"Acme LOI response due Friday"
]
}Get Meeting Prep
/ext/tools/get-meeting-prepGet AI-generated meeting prep for a company: background, recent activity, key metrics, and talking points.
Parameters
| Name | Type | Description |
|---|---|---|
| company_id | string | Company UUID. |
Example Request
{
"company_id": "550e8400-..."
}Example Response
{
"company": "Acme Corp",
"background": "Enterprise SaaS platform founded in 2010...",
"key_metrics": {
"revenue": "$1.2B",
"growth": "25% YoY"
},
"recent_activity": [
"Email from Jane Smith on Mar 28 re: Q2 planning",
"Meeting on Mar 15 - Q1 review"
],
"talking_points": [
"Discuss Q2 revenue targets",
"Follow up on expansion plans"
]
}Portfolio
Get Portfolio Data
/ext/tools/get-portfolio-dataRead portfolio-company data for investor companies, keyed by a company or a fund. Pass exactly one of company_uuid or fund_uuid. Company mode returns port_cos (where the company is the sponsor), parent_portfolios (where the company is itself a port_co), and funds owned by the company. Fund mode returns fund details, the sponsor company, and the port_cos in the fund. Every port_co row includes relationship_uuid (pass to the delete endpoint with record_type=port_co_relationship to unlink), shared relationship_data (status, year, stake_type, stake_* evidence, lead_sponsor_contact hydrated to a person dict), and team_data (per-viewer team_lead and priority).
Parameters
| Name | Type | Description |
|---|---|---|
| company_uuid | string | Company UUID (sponsor or port_co). Exactly one of company_uuid or fund_uuid. |
| fund_uuid | string | Fund UUID. Exactly one of company_uuid or fund_uuid. |
Example Request
{
"company_uuid": "550e8400-..."
}Example Response
{
"mode": "company",
"company": {
"uuid": "...",
"name": "Sponsor LP"
},
"port_cos": [
{
"relationship_uuid": "...",
"company": {
"uuid": "...",
"name": "PortCo Alpha"
},
"fund": {
"uuid": "...",
"name": "Fund I"
},
"relationship_data": {
"status": "active",
"year": 2024,
"stake_type": "minority"
},
"team_data": {
"priority": "P1",
"team_lead": {
"uuid": "...",
"name": "Jane Banker"
}
},
"ltm_interactions_count": 3
}
],
"parent_portfolios": [],
"funds": [
{
"uuid": "...",
"name": "Fund I",
"start_date": "2024-01-01",
"end_date": null,
"amount": "100000000",
"portco_count": 1
}
]
}Update Portfolio Data
/ext/tools/update-portfolio-dataSingle write endpoint for portfolio data, intended for investor companies. Choose an action: create_port_co, update_port_co, create_fund, update_fund. create_port_co requires both companies to already exist (use create_company first). update_port_co takes a relationship_uuid; pass fund_uuid=null to detach from a fund. To delete a port_co relationship or fund, call the delete endpoint with record_type "port_co_relationship" or "fund".
Parameters
| Name | Type | Description |
|---|---|---|
| action | string | One of create_port_co, update_port_co, create_fund, update_fund. |
| sponsor_company_uuid | string | Sponsor company UUID (create_port_co, create_fund). |
| port_co_company_uuid | string | Port_co company UUID (create_port_co). Must already exist. |
| relationship_uuid | string | Port_co relationship UUID (update_port_co). |
| fund_uuid | string | Fund UUID (update_fund/update_port_co) or fund to link (create_port_co). |
| name | string | Fund name (create_fund, update_fund). |
| start_date | string | Fund start date ISO YYYY-MM-DD. |
| end_date | string | Fund end date ISO YYYY-MM-DD. |
| amount | string | Fund amount as a number string. |
| status | string | Port_co investment status (e.g. active, exited). |
| year | integer | Port_co investment year. |
| stake_type | string | Port_co stake type (e.g. minority, majority). |
| stake_confidence | number | 0-1 confidence score. |
| stake_evidence_title | string | Source title supporting the stake classification. |
| stake_evidence_url | string | Source URL supporting the stake classification. |
| lead_sponsor_contact | string | Person UUID (at sponsor) leading the investment. |
| team_lead | string | Pipeline user UUID owning the port_co relationship for this team. |
| priority | string | Team-scoped priority tag. |
Example Request
{
"action": "create_port_co",
"sponsor_company_uuid": "...",
"port_co_company_uuid": "...",
"fund_uuid": "...",
"status": "active",
"year": 2024,
"stake_type": "minority",
"team_lead": "...",
"priority": "P1"
}Example Response
{
"action": "create_port_co",
"relationship_uuid": "...",
"relationship_data": {
"status": "active",
"year": 2024,
"stake_type": "minority",
"priority": "P1",
"team_lead": {
"uuid": "...",
"name": "Jane Banker"
}
},
"fund": {
"uuid": "...",
"name": "Fund I"
}
}Biopharma Assets
Get Biopharma Assets
/ext/tools/get-biopharma-assetsRead biopharma assets and nested indications for companies whose industry metric is biotechnology or pharmaceuticals. Pass exactly one of company_uuid or asset_uuid.
Parameters
| Name | Type | Description |
|---|---|---|
| company_uuid | string | Company UUID. Exactly one of company_uuid or asset_uuid. |
| asset_uuid | string | Biopharma asset UUID. Exactly one of company_uuid or asset_uuid. |
Example Request
{
"company_uuid": "550e8400-..."
}Example Response
{
"mode": "company",
"company": {
"uuid": "...",
"name": "Biotech Co"
},
"assets": [
{
"uuid": "...",
"company_id": "...",
"name": "DB-101",
"target": "CD19",
"moa": "CAR-T",
"is_lead": true,
"indications": [
{
"uuid": "...",
"name": "DLBCL",
"phase": "phase 2",
"milestone": "Phase 2 data",
"milestone_date": "2026-09-30",
"peak_sales": 1200,
"is_lead": true
}
]
}
]
}Create Biopharma Asset
/ext/tools/create-biopharma-assetCreate a biopharma asset for a biotechnology or pharmaceuticals company.
Parameters
| Name | Type | Description |
|---|---|---|
| company_uuid | string | Company UUID. |
| name | string | Asset name. |
| target | string | Optional target. |
| moa | string | Optional mechanism of action. |
| is_lead | boolean | Whether this is a lead asset. |
Example Request
{
"company_uuid": "550e8400-...",
"name": "DB-101",
"target": "CD19",
"moa": "CAR-T",
"is_lead": true
}Example Response
{
"asset": {
"uuid": "...",
"name": "DB-101",
"target": "CD19",
"moa": "CAR-T",
"is_lead": true,
"indications": []
}
}Update Biopharma Asset
/ext/tools/update-biopharma-assetUpdate a biopharma asset by UUID. Only provided fields change; pass null for nullable fields to clear them.
Parameters
| Name | Type | Description |
|---|---|---|
| asset_uuid | string | Biopharma asset UUID. |
| name | string | Asset name. |
| target | string | Optional target; null clears. |
| moa | string | Optional mechanism of action; null clears. |
| is_lead | boolean | Whether this is a lead asset; null clears. |
Example Request
{
"asset_uuid": "...",
"moa": "Bispecific antibody"
}Example Response
{
"asset": {
"uuid": "...",
"name": "DB-101",
"moa": "Bispecific antibody",
"indications": []
}
}Create Biopharma Indication
/ext/tools/create-biopharma-indicationCreate an indication under a biopharma asset. Phase values: preclinical, phase 1, phase 2, pivotal, filed, approved. peak_sales is in $M.
Parameters
| Name | Type | Description |
|---|---|---|
| asset_uuid | string | Biopharma asset UUID. |
| name | string | Indication name. |
| phase | string | Optional phase. |
| milestone | string | Optional milestone text. |
| milestone_date | string | Optional date, YYYY-MM-DD. |
| peak_sales | number | Optional peak sales in $M. |
| is_lead | boolean | Whether this is a lead indication. |
Example Request
{
"asset_uuid": "...",
"name": "DLBCL",
"phase": "phase 2",
"peak_sales": 1200,
"is_lead": true
}Example Response
{
"indication": {
"uuid": "...",
"name": "DLBCL",
"phase": "phase 2",
"peak_sales": 1200,
"is_lead": true
}
}Update Biopharma Indication
/ext/tools/update-biopharma-indicationUpdate a biopharma indication by UUID. Only provided fields change; pass null for nullable fields to clear them.
Parameters
| Name | Type | Description |
|---|---|---|
| indication_uuid | string | Biopharma indication UUID. |
| name | string | Indication name. |
| phase | string | Optional phase; null clears. |
| milestone | string | Optional milestone text; null clears. |
| milestone_date | string | Optional date, YYYY-MM-DD; null clears. |
| peak_sales | number | Optional peak sales in $M; null clears. |
| is_lead | boolean | Whether this is a lead indication; null clears. |
Example Request
{
"indication_uuid": "...",
"milestone": "Pivotal start",
"phase": "pivotal"
}Example Response
{
"indication": {
"uuid": "...",
"name": "DLBCL",
"phase": "pivotal",
"milestone": "Pivotal start"
}
}