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_KEY
Base URL
https://api.debreu.ai/api/v1
Content Type
application/json
Errors
Standard HTTP status codes (400, 401, 403, 404, 409)

Changelog

v2.62.02026-06-03
Changed
  • delete_record for record_type=company is 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 via create_company restores your team's records.
v2.61.02026-05-31
Added
  • create_project: tracker_type now accepts prospecting — a manual company sourcing tracker with a dedicated status funnel (new → selected → … → won/lost/parked). Per-profile workflow_account_prospecting statuses are seeded automatically.
  • get_status_definitions now lists workflow_account_prospecting as a common status_type.
v2.60.02026-05-28
Changed
  • Company lookup/query and dashboard docs now describe last_interaction_date and next_interaction_date as current-user interaction fields, not metric schema columns.
v2.59.02026-05-20
Removed
  • invest_label field removed from update_portfolio_data (create_port_co/update_port_co) and get_portfolio_data response. The field is no longer read anywhere in the product.
Changed
  • create_port_co no longer requires year — now optional.
v2.58.02026-05-19
Added
  • delete_record now accepts record_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 ingested Email records are untouched. Rejects when the campaign is in sending, generating_drafts, or scheduled status — cancel queued sends first.
v2.57.02026-05-18
Changed
  • Dashboard config docs clarify biopharma_catalyst_calendar columns, filters, lowercase phase values, milestone-date filtering, the 18-column grid, and layout/components ID matching.
v2.56.02026-05-18
Added
  • Biopharma asset tools: get_biopharma_assets, create_biopharma_asset, update_biopharma_asset, create_biopharma_indication, and update_biopharma_indication.
  • delete_record now accepts biopharma_asset and biopharma_indication.
Changed
  • Portfolio tool docs now state that portfolio data is intended for investor companies.
v2.55.02026-05-18
Changed
  • Dashboard config docs now include the biopharma_catalyst_calendar widget type, its table columns, and supported filters.
v2.54.02026-05-17
Added
  • Email Templates endpoints: list_email_templates, get_email_template (with optional include_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_campaign is 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 (flat recipients list with one primary per company) and follow-ups (follow_up spec with same_thread/new_thread reply modes and optional parent_row_ids). schedule_email_campaign supports a single base time + optional stagger OR a per-row schedules override list.
Changed
  • delete_record accepts record_type=email_template — archives the template by UUID (matches the app's archive behavior).
v2.53.02026-05-13
Added
  • timezone field 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 by lookup_person and get_people, accepted by create_person and update_person. Existing rows return null until the next inbound email refreshes them.
v2.52.02026-05-03
Changed
  • pending_from values changed (breaking) to banker, 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).
v2.51.02026-05-01
Added
  • 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_share only removes granted_via=explicit rows — email_recipient and project_member shares are derived from email/project state.
v2.50.02026-04-30
Changed
  • task_type values changed (breaking) to stated, inferred, user_created. Previous values (our_commitment, counterparty_pending, proactive_opportunity, internal_action) are no longer accepted. create_task defaults task_type to user_created; AI parsing emits stated or inferred.
Removed
  • pending_party_role field removed from create_task and update_task.
v2.49.02026-04-27
Changed
  • Task model: renamed company_id to client_company_id in create_task, update_task, and get_tasks tool schemas. The get_tasks company_id query param is preserved for backward compat (maps to client_company_id).
  • get_tasks description now references client_company, subject_company, and task_type in response fields.
Added
  • New task fields in create_task and update_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_type defaults to internal_action.
v2.48.02026-04-25
Changed

    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.

v2.47.02026-04-25
Added

    query_files: optional tag (exact match), aligned with query_emails / query_calendars.

Changed

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

v2.46.02026-04-20
Removed
  • target_landscape removed from create_project and update_project. Acquisition Targets / Buyer Universe trackers no longer accept GICS landscape combinations via MCP.
v2.45.02026-04-20
Fixed
  • create_project: tracker_type enum now includes investor_outreach. The API already accepted this value; the MCP tool schema omitted it.
v2.44.02026-04-17
Added
  • update_project.account_operations now supports per-tracker-company deal fields. For acquisition_targets / buyer_universe trackers: tev and fees ($M). For investor_outreach trackers: is_lead, indicated_amount ($M), allocated_amount ($M), price_limit, investor_type, order_type. Fields only apply on the matching tracker type. Invalid investor_type / order_type values 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 for acquisition_targets / buyer_universe (tev, fees) and investor_outreach (is_lead, indicated_amount, allocated_amount, price_limit, investor_type, order_type).
v2.43.02026-04-17
Added
  • get_portfolio_data: new read tool for portfolio-company data. Pass exactly one of company_uuid or fund_uuid. Company mode returns port_cos (where the company is sponsor), parent_portfolios (where it is itself a port_co), and its funds. Fund mode returns fund details, sponsor company, and port_cos. Every port_co row includes relationship_uuid (pass to delete_record with record_type=port_co_relationship to unlink), shared relationship_data, and per-viewer team_data (team_lead, priority).
  • update_portfolio_data: new single-tool writer. actioncreate_port_co / update_port_co / create_fund / update_fund. create_port_co requires sponsor + port_co companies to already exist. update_port_co accepts fund_uuid: null to detach.
  • delete_record: record_type now accepts port_co_relationship and fund. Soft-deletes the row; the port_co variant refuses non-port_co relationship_types with 400.
v2.42.02026-04-17
Added
  • update_project: new working_group_operations (add/update/remove members with user_type "user"/"person", user_id, category "team"/"client"/"advisors", and optional is_team_lead) and key_date_operations (add/update/remove timeline milestones with title, start_date, end_date). Each op returns a per-entry result (added / updated / removed / already_exists / error).
  • get_project: response now includes working_group (roster entries with uuid, user_type, user_id, name, category, is_team_lead) and key_dates (timeline entries with uuid, title, start_date, end_date).
v2.41.02026-04-17
Changed (breaking response shape)
  • Metric state value responses no longer include created_at / updated_at. All timestamp semantics are carried by the new effective_at field — the real-world observation time (defaults to now(), but backdated when the row is derived from a past-dated email or file). Affects lookup_company (where metrics[].updated_at is now metrics[].effective_at), any endpoint that serializes a metric state value, and the query_metric_history response (the per-row datetime field is unchanged in name but is now sourced from effective_at).
  • Historical / listing queries for metric state values are ordered by effective_at DESC (tiebreak on created_at DESC) so backdated observations land in their real-world chronological position.
v2.40.02026-04-17
Added
  • upload_file: new optional file_date param (ISO 8601). Effective date of the file's content — use this to backdate a file that represents a past document. AI parsing uses file_date as the reference date for task extraction and metric observations (so backdated files land in the right position in company history). Defaults to now().
v2.39.02026-04-17
Changed
  • Project deal_type enum renamed: "financing""capital_markets" across query_projects, create_project, update_project (and ext variants). Existing project rows are backfilled.
Added
  • create_project / update_project: optional issuer_company_id for capital_markets deals (stored on the project; validated against your workspace).
  • New Investor Outreach workflow type. Tracker rows (view_to_companies) accept optional ECM fields: is_lead, indicated_amount, allocated_amount, price_limit, investor_type, order_type. Profile-seeded workflow_account_investor_outreach statuses: targeted → contacted → nda_signed → model_shared → meeting_held → ioi_received → allocated → declined → dropped.
v2.38.02026-04-17
Added
  • upload_file: new optional calendar_id param. Associates the uploaded file with a calendar event (UUID from query_calendars). Mirrors the existing company_id behavior.
v2.37.02026-04-17
Added
  • query_emails, query_calendars, query_files, and get_tasks: new optional project_id param. Filters results to records linked to the given project (via email_to_projects / calendar_to_projects / file_to_projects junctions, and the direct tasks.project_id FK). When both company_id and project_id are provided, project_id takes precedence.
v2.36.02026-04-17
Added
  • create_project and update_project: optional tev, fees ($M), and buyer_company_id / seller_company_id / target_company_id in tool inputSchema; backend ext handlers persist them on the project row. update_project accepts null for those fields to clear.
v2.35.02026-04-17
Changed
  • query_projects and get_project: deal economics and parties are documented as fields stored on the project (add target_company_id / target_name); removed financials_tracker_scope and tracker-hydration wording. primary_view_company_ids remains the pitched list from tracker primary views.
  • Dashboard projects widget: update_dashboard_config docs include target_name; TEV/fees and party columns read from the project row.
  • get_tasks spec: expanded task project includes the same stored deal fields (no financials_tracker_scope).
v2.34.02026-04-16
Added
  • Dashboard widget type meeting_prep (requires company_id in widget config). MCP tool docs and REST spec updated.
Changed
  • UI copy: company "briefing" surfaced as meeting prep; My Day / My Week tool descriptions use "summary". MCP spec groups renamed to Summaries & meeting prep.
v2.33.02026-04-16
Changed
  • 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_config tool descriptions updated.
v2.32.02026-04-16
Changed
  • get_dashboard_config docs: 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.
v2.31.02026-04-16
Changed
  • Dashboard widget date range: documented date_relative_unit (days | months), months_ago / months_ahead, and wider day windows. Project and people widget column lists in update_dashboard_config docs include start_date, end_date, primary_view_company_ids, first interaction dates, and created_at.
v2.30.02026-04-16
Changed
  • update_company now accepts a metrics array 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) — use metrics with the corresponding metric names instead (e.g. company_city, company_ticker). Call get_metric_schema for valid metric names.
  • For Acquisition Targets / Buyer Universe project hydration, the mandate-side buyer/seller uses the tracker workflow client_id when set, otherwise the project client_id.
v2.29.02026-04-15
Added
  • New list_dashboards tool: list all dashboards owned by the user, optionally filtered by type ('home', 'custom').
  • New create_dashboard tool: create a new dashboard (defaults to type 'custom') with name and optional layout/components.
  • New delete_dashboard tool: delete a user-level dashboard by UUID.
Changed
  • get_dashboard_config now supports uuid parameter to fetch a specific dashboard by UUID. Description updated to document both 'home' and 'custom' dashboard types.
v2.28.02026-04-16
Changed
  • query_projects and get_project tool 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, and seller_name in update_dashboard_config documentation.
v2.27.02026-04-15
Changed
  • Dashboard single_stat is supported on the funds widget (with company_id); numeric fields amount and portcoCount. Project-level tev/fees are no longer used for widgets.
v2.26.02026-04-15
Added
  • New portfolio and funds dashboard widget types. Both require company_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.
v2.25.02026-04-15
Added
  • New single_stat display_type for dashboard widgets — aggregates one numeric field across the filtered set into a single value. Set agg_function (sum/avg/min/max/count) and agg_field (numeric column key; omitted for count).
  • Currently supported on the funds widget (with company_id). Numeric fields: amount, portcoCount.
v2.24.02026-04-09
Added
  • delete_record supports email, calendar, and file (soft delete with cascades, user-scoped).
v2.22.02026-04-07
Changed
  • Merged pipeline widget into companies widget. Use companies with pipeline_companies: true in config instead.
Removed
  • pipeline from valid component types in dashboard config tools.
v2.21.02026-04-06
Added
  • Backend validation for dashboard layout: no overlapping widgets, non-negative positions, sizes >= 1, and x + w must not exceed the configured grid column count.
v2.20.12026-04-06
Changed
  • get_dashboard_config description now documents that days_ago=0, days_ahead=0 means "today only" in relative date mode.
v2.20.02026-04-06
Added
  • New get_dashboard_config tool to retrieve the user's effective dashboard configuration (user override → profile fallback). Supports filtering by dashboard type (currently only home).
  • New update_dashboard_config tool to update a user-level dashboard config. Supports updating name, layout (react-grid-layout positions), and components (widget types, configs, filters).
v2.19.02026-04-03
Added
  • New upload_file tool for uploading files to Debreu. Accepts a local file_path (MCP server reads the file) or inline content_base64. Supports optional title, description, content_type, and company_id.
v2.18.02026-04-02
Added
  • get_project now 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_score for rounds 1-3).
  • update_project account_operations for people_list trackers now documents role_sought, gpa, and interview fields in the input schema.
v2.17.02026-04-02
Added
  • create_person and update_person now support alma_mater, previous_company, and location fields.
  • lookup_person response now includes the new enrichment fields.
v2.16.02026-04-02
Fixed
  • people_list tracker type was rejected by backend validation despite being in the MCP enum.
Added
  • account_operations in update_project now supports person_id for people_list trackers.
  • initial_person_ids parameter in create_project for seeding people into people_list trackers.
  • get_project now returns people array (with account_status) for people_list trackers.
Changed
  • account_operations items: use person_id for people_list trackers, company_id for all others.
v2.15.02026-04-02
Changed
  • Renamed project tags to keywords in create_project and update_project tools. Keywords now also match against entity tags on items.
v2.14.02026-04-02
Changed
  • 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_list added to tracker_type enum. sync_tags parameter added to create/update project.
  • Companies/people manually removed by the user will not be re-added by auto-sync.
v2.13.02026-04-02
Fixed
  • buyer_type in create_project and update_project now uses enum (strategic, financial_sponsor) instead of free-text.
  • target_landscape in create_project and update_project changed from free-text string to structured array of GICS taxonomy objects.
v2.12.02026-04-02
Added
  • set_entity_tags tool — set/replace tags on any entity (email, calendar, file, person). Idempotent.
  • tag filter parameter on query_emails and query_calendars — filter by entity tag (e.g. "outreach", "recruiting").
  • tags field in responses for query_emails, get_email, query_calendars, get_calendar, lookup_person, and get_people.
v2.11.02026-04-02
Added
  • get_team tool — returns team members (uuid, name, email, is_current_user) for discovering valid assignee_id values.
  • report_issue tool — create a text-only issue report tied to the current user.
  • pending_from parameter on create_task and update_task.
  • get_tasks response now includes assignee, project, and person objects.
  • get_project task items now include assignee and person.
Changed
  • create_task and update_task descriptions reference get_team for assignee lookup.
  • Removed workflow_id from create_task and update_task schemas (workflow is managed via project).
v2.9.02026-04-01
Changed
  • Replaced "workflow" terminology with "tracker" in tool descriptions for query_projects, get_project, and update_project.
v2.8.02026-04-01
Changed
  • lookup_person and get_people responses now include relationship data: interaction dates and per-team-member relationship scores.
v2.7.02026-04-01
Changed
  • get_tasks response replaces raw source_type string with a rich source object that resolves to the originating email, file, or calendar (includes type, uuid, name, url). Event-sourced tasks include the reference snippet.
v2.6.02026-04-01
Added
  • offset pagination parameter for all list-returning tools: query_companies, get_tasks, get_sentiments, query_emails, query_calendars, query_files, query_projects.
  • showing field in get_tasks and get_sentiments responses.
Changed
  • get_tasks and get_sentiments now report accurate total counts (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.
v2.5.02026-04-01
Added
  • Project description field 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_description parameter in create_project.
  • Tracker metadata in get_project response.
  • description field in query_projects results.
Changed
  • create_project now defaults tracker_type to company_list — a tracker is always created.
  • query_projects response renamed workflow key to tracker.
  • Priority enum in update_project corrected to ["low", "med", "high"].
v2.4.02026-04-01
Added
  • 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_ids parameter to seed companies into a new tracker.
v2.3.02026-04-01
Added
  • account_operations in update_project to add, update, or remove companies from tracker.
  • Generated companies (AI suggestions) in get_project response.
Fixed
  • Security: removed dead code paths, added task authorization, sanitized error responses.
v2.2.02026-04-01
Added
  • get_status_definitions tool to query valid status values.
  • create_status_definition and update_status_definition tools.
Changed
  • Removed hardcoded status enums in favor of dynamic get_status_definitions lookup.
v2.1.02026-04-01
Added
  • query_projects, get_project, create_project, update_project tools.
  • query_comments, create_comment, update_comment tools.
  • delete_record unified delete tool.
v2.0.02026-04-01
Added
  • 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.
v1.0.02026-03-31
Added
  • 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

GET

List Companies

/ext/companies

List companies for the authenticated user's team. Supports metric-based and current-user interaction date filtering, sorting, and pagination.

Parameters

NameTypeDescription
skipintegerPagination offset (default 0).
limitintegerPage size, 1-200 (default 50).
searchstringSearch companies by name.
filtersstring (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_metricsstring (JSON)JSON array of metric names or current-user interaction date fields to include in results.
sort_bystringMetric name, current-user interaction date field, or "name" for alphabetical.
sort_orderstring"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

Get Company

/ext/companies/:uuid

Get a single company by UUID with optional related data.

Parameters

NameTypeDescription
uuidstringCompany UUID (path parameter).
includestringComma-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"
  }
}
POST

Create Company

/ext/companies

Create 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

NameTypeDescription
namestringCompany name.
websitestringCompany website (e.g. acme.com).
descriptionstringCompany description.
citystringHeadquarters city.
statestringUS state 2-letter code (e.g. NY).
countrystringISO 3166-1 alpha-3 code (e.g. USA).
tickerstringStock ticker symbol.
tagsstringComma-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"
}
PUT

Update Company

/ext/companies/:uuid

Update 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

NameTypeDescription
uuidstringCompany UUID (path parameter).
namestringCompany name.
metricsarrayArray 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"
}
POST

Lookup Company

/ext/tools/lookup-company

Look 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

NameTypeDescription
identifierstringCompany name, website domain, or UUID.
identifier_typestringOne 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"
  }
}
POST

Query Companies

/ext/tools/query-companies

Filter 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

NameTypeDescription
filtersarrayArray of {metric_name, operator, value} filter objects. metric_name may also be last_interaction_date or next_interaction_date.
return_metricsarrayAdditional metric names or interaction date fields to include in results.
sort_bystringMetric name, interaction date field, or "name" for alphabetical sorting.
sort_orderstring"asc" or "desc" (default "asc").
limitintegerMax companies to return (default 20, max 50).
offsetintegerNumber 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

GET

List People

/ext/people

List people (contacts) for the authenticated user's team.

Parameters

NameTypeDescription
skipintegerPagination offset (default 0).
limitintegerPage size, 1-200 (default 50).
searchstringSearch by name.
company_idstringFilter 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

Get Person

/ext/people/:uuid

Get a person by UUID with relationship scores and interaction dates.

Parameters

NameTypeDescription
uuidstringPerson UUID (path parameter).
includestringComma-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
    }
  ]
}
POST

Create Person

/ext/people

Create a new person (contact). Email must be unique if provided.

Parameters

NameTypeDescription
namestringPerson name.
company_idstringUUID of the associated company.
emailstringEmail address (must be unique).
phonestringPhone number.
rolestringJob title or role.
timezonestringIANA 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"
}
PUT

Update Person

/ext/people/:uuid

Update a person. Only provided fields are changed. Email must remain unique.

Parameters

NameTypeDescription
uuidstringPerson UUID (path parameter).
namestringPerson name.
company_idstringCompany UUID.
emailstringEmail address.
phonestringPhone number.
rolestringJob title or role.
timezonestringIANA 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"
}
POST

Lookup Person

/ext/tools/lookup-person

Look 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

NameTypeDescription
identifierstringPerson name, email, or UUID.
identifier_typestringOne 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
        }
      ]
    }
  }
}
POST

Get People

/ext/tools/get-people

Get all contacts at a specific company with relationship data (interaction dates, team relationship scores).

Parameters

NameTypeDescription
company_idstringCompany 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

POST

Create Project

/ext/projects

Create 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

NameTypeDescription
namestringProject name.
keywordsstringComma-separated keywords for content matching.
descriptionstringProject description.
client_idstringClient company UUID.
owner_idstringOwner pipeline user UUID. Defaults to authenticated user.
statusstringProject status (default "new"). Use get_status_definitions to discover valid values.
deal_typestringOne of: general, buy_side, sell_side, capital_markets (default "general").
prioritystringOne of: low, med, high (default "med").
start_datestringStart date (YYYY-MM-DD).
end_datestringEnd 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"
}
PUT

Update Project

/ext/projects/:uuid

Update a project. Changing keywords, start_date, or end_date triggers re-sync of linked content.

Parameters

NameTypeDescription
uuidstringProject UUID (path parameter).
namestringProject name.
descriptionstringProject description.
keywordsstringComma-separated keywords.
client_idstringClient company UUID.
owner_idstringOwner pipeline user UUID.
statusstringProject status.
deal_typestringgeneral, buy_side, sell_side, or capital_markets.
prioritystringlow, med, or high.
start_datestringStart date (YYYY-MM-DD).
end_datestringEnd 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"
}
POST

Query Projects

/ext/tools/query-projects

Search 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

NameTypeDescription
client_idstringFilter to projects for this client company UUID.
deal_typestringOne of: general, buy_side, sell_side, capital_markets.
statusstringFilter by project status.
date_startstringEarliest creation date (YYYY-MM-DD).
date_endstringLatest creation date (YYYY-MM-DD).
limitintegerMax results (default 20, max 50).
offsetintegerNumber 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
}
POST

Get Project

/ext/tools/get-project

Get 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

NameTypeDescription
uuidstringProject 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/..."
        }
      ]
    }
  ]
}
POST

Create Project (Tool)

/ext/tools/create-project

Create 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

NameTypeDescription
namestringProject name.
descriptionstringProject description.
keywordsstringComma-separated keywords.
client_idstringClient company UUID.
owner_idstringOwner pipeline user UUID.
deal_typestringgeneral, buy_side, sell_side, or capital_markets.
statusstringProject status (default "new").
prioritystringlow, med, or high.
start_datestringYYYY-MM-DD.
end_datestringYYYY-MM-DD.
tracker_typestringType of tracker (default "company_list"). One of: acquisition_targets, buyer_universe, outreach, investor_outreach, company_list, people_list, prospecting.
tracker_descriptionstringTracker description. Used as context for AI generation and account status analysis.
buyer_typestringFor acquisition_targets/buyer_universe: "strategic" or "financial_sponsor".
outreach_start_datestringFor outreach tracker: optional start date filter (YYYY-MM-DD). Omit for no lower bound.
outreach_end_datestringFor outreach tracker: optional end date filter (YYYY-MM-DD). Omit for no upper bound.
sync_tagsstringFor people_list tracker: comma-separated tags for auto-syncing tagged people.
initial_company_idsarrayCompany UUIDs to seed into the tracker.
initial_person_idsarrayFor 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"
  }
}
POST

Update Project (Tool)

/ext/tools/update-project

Update 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

NameTypeDescription
uuidstringProject UUID.
namestringProject name.
descriptionstringProject description.
keywordsstringComma-separated keywords.
client_idstringClient company UUID.
owner_idstringOwner pipeline user UUID.
deal_typestringgeneral, buy_side, sell_side, or capital_markets.
statusstringProject status.
prioritystringlow, med, or high.
start_datestringYYYY-MM-DD.
end_datestringYYYY-MM-DD.
tracker_namestringTracker name.
tracker_descriptionstringTracker description. Used as context for AI generation and account status analysis.
outreach_start_datestringFor outreach tracker: optional start date filter (YYYY-MM-DD).
outreach_end_datestringFor outreach tracker: optional end date filter (YYYY-MM-DD).
sync_tagsstringFor people_list tracker: comma-separated tags for auto-syncing tagged people.
buyer_typestringFor acquisition_targets/buyer_universe: "strategic" or "financial_sponsor".
account_operationsarrayArray 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_operationsarrayArray 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_operationsarrayArray 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

POST

Get Team

/ext/tools/get-team

Get 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

POST

Create Task

/ext/tasks

Create a new task (action item / follow-up). Assignee defaults to the current user; call get_team for team member UUIDs.

Parameters

NameTypeDescription
descriptionstringTask description.
statusstringTask status (default "open"). Use get_status_definitions for valid values.
client_company_idstringClient company UUID.
subject_company_idstringSubject company UUID (what the task is about).
subject_company_namestringSubject company name (when no UUID is available).
person_idstringPerson UUID or raw name string.
project_idstringProject UUID.
assignee_idstringAssignee pipeline user UUID. Defaults to current user. Call get_team for valid UUIDs.
due_datestringDue date (YYYY-MM-DD).
pending_fromstringWho the task is pending on: 'banker', 'coverage_client', 'counterparty', or 'third_party'.
task_typestringHow the task entered the system: 'stated', 'inferred', or 'user_created' (default).
deal_hintstringOptional deal/project hint for context.
relationship_source_idstringUUID of the source relationship.
relationship_source_namestringName/label of the source relationship.
source_typestringSource 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
}
PUT

Update Task

/ext/tasks/:uuid

Update a task. Only provided fields are changed. Assignee cannot be cleared.

Parameters

NameTypeDescription
uuidstringTask UUID (path parameter).
descriptionstringTask description.
statusstringTask status.
client_company_idstringClient company UUID.
subject_company_idstringSubject company UUID (what the task is about).
subject_company_namestringSubject company name (when no UUID is available).
person_idstringPerson UUID or raw name.
assignee_idstringAssignee pipeline user UUID. Call get_team for valid UUIDs.
due_datestringDue date (YYYY-MM-DD).
pending_fromstringWho the task is pending on: 'banker', 'coverage_client', 'counterparty', or 'third_party'. Set to null to clear.
task_typestringHow the task entered the system: 'stated', 'inferred', or 'user_created'.
deal_hintstringOptional deal/project hint for context.
relationship_source_idstringUUID of the source relationship.
relationship_source_namestringName/label of the source relationship.
project_idstringProject UUID.

Example Request

{
  "status": "done"
}

Example Response

{
  "uuid": "...",
  "description": "Follow up with Jane on Q2 numbers",
  "status": "done"
}
POST

Get Tasks

/ext/tools/get-tasks

Query 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

NameTypeDescription
company_idstringFilter to tasks for this client company UUID (maps to client_company_id).
project_idstringFilter to tasks on this project UUID. Takes precedence over company_id.
due_date_startstringEarliest due date (YYYY-MM-DD).
due_date_endstringLatest due date (YYYY-MM-DD).
statusstringFilter by task status.
searchstringSubstring search in task description.
limitintegerMax tasks (default 30, max 50).
offsetintegerNumber 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

GET

List Comments

/ext/comments

Fetch comments for a specific record.

Parameters

NameTypeDescription
data_modelstringRecord type: company, person, task, project, metric_schema, or status_definition.
record_idstringUUID of the record.
skipintegerPagination offset (default 0).
limitintegerPage 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"
  }
]
POST

Create Comment

/ext/comments

Add a comment to a record. Content must be non-empty.

Parameters

NameTypeDescription
data_modelstringRecord type (e.g. company, person, project, task).
record_idstringUUID of the record to comment on.
contentstringComment 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"
}
PUT

Update Comment

/ext/comments/:uuid

Update a comment's content. Only the original author can edit.

Parameters

NameTypeDescription
uuidstringComment UUID (path parameter).
contentstringUpdated 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

POST

Create Metric Schema

/ext/metric-schemas

Create a new metric definition. Name is normalized to lowercase with underscores. Must be unique per team.

Parameters

NameTypeDescription
namestringMetric name (auto-normalized to lowercase_underscores).
typestringValue type (e.g. text, money_millions, rate, integer).
descriptionstringWhat this metric measures.
categorystringGrouping category.
display_namestringHuman-readable name. Auto-generated from name if omitted.
examplesstringExample values to guide AI extraction.
should_parsebooleanWhether 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"
}
PUT

Update Metric Schema

/ext/metric-schemas/:uuid

Update a metric schema. Name cannot be changed. System metrics cannot be modified.

Parameters

NameTypeDescription
uuidstringMetricSchema UUID (path parameter).
descriptionstringWhat this metric measures.
typestringValue type.
categorystringGrouping category.
display_namestringHuman-readable name.
examplesstringExample values.
should_parsebooleanWhether 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
}
POST

Query Metric History

/ext/tools/query-metric-history

Find companies where a numeric metric changed significantly over a date range. Returns up to 25 companies sorted by largest absolute change.

Parameters

NameTypeDescription
metric_namestringExact metric name (must be numeric type).
date_fromstringStart of date range (YYYY-MM-DD).
date_tostringEnd of date range (YYYY-MM-DD).
change_operatorstringOne of: gt, lt, gte, lte.
change_valuestringThreshold (e.g. "$50M", "10", "-5").
change_typestring"absolute" (default) or "percent".
filtersarrayOptional company universe filters (same format as query_companies).
limitintegerMax 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
}
POST

Get Metric Schema

/ext/tools/get-metric-schema

Get available metric definitions for the user's team. Returns metric names, display names, types, categories, and descriptions.

Parameters

NameTypeDescription
categorystringFilter to a specific category.
typestringFilter 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

POST

Create Status Definition

/ext/status-definitions

Create a new status definition for a status type. Value is normalized and must be unique per team/type.

Parameters

NameTypeDescription
status_typestringStatus category (e.g. task, project, workflow_account_outreach).
valuestringMachine-readable value (e.g. in_progress).
display_namestringHuman-readable label (e.g. In Progress).
descriptionstringDescription of this status.
phasestringPhase grouping (e.g. active, closed).
is_terminalbooleanWhether this status represents an end state (default false).
sort_ordernumberDisplay 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
}
PUT

Update Status Definition

/ext/status-definitions/:uuid

Update a status definition. If value changes, all entities using the old value are migrated.

Parameters

NameTypeDescription
uuidstringStatusDefinition UUID (path parameter).
valuestringNew status value (triggers entity migration).
display_namestringHuman-readable label.
descriptionstringDescription.
phasestringPhase grouping.
is_terminalbooleanWhether this is an end state.
sort_ordernumberDisplay 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"
}
POST

Get Status Definitions

/ext/tools/get-status-definitions

Get 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

NameTypeDescription
status_typestringThe 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

GET

List Email Templates

/ext/email-templates

List 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

NameTypeDescription
folderstringOptional 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

Get Email Template

/ext/email-templates/:uuid

Fetch 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

NameTypeDescription
uuidstringTemplate UUID (path parameter).
include_historybooleanIf 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
}
POST

Create Email Template

/ext/email-templates

Create 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

NameTypeDescription
namestringTemplate name (1-255 chars).
subjectstringSubject line — may include handlebars.
bodystringBody content — may include handlebars.
folderstringOptional 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
}
PATCH

Update Email Template

/ext/email-templates/:uuid

Patch 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

NameTypeDescription
uuidstringTemplate UUID (must be the latest version).
namestringNew name.
folderstringNew folder.
subjectstringNew subject.
bodystringNew body.

Example Request

{
  "subject": "Hello {{first_name}} — updated"
}

Example Response

{
  "uuid": "...",
  "version": 2,
  "is_latest": true,
  "parent_template_id": "..."
}

Email Campaigns

GET

List Email Campaigns

/ext/campaigns

List the team's email campaigns (newest first). Statuses: draft, generating_drafts, drafts_ready, partial_failed, scheduled, sending, sent, cancelled.

Parameters

NameTypeDescription
project_idstringOptional project filter.
statusstringOptional status filter.
limitintegerMax rows (default 100).

Example Response

{
  "campaigns": [
    {
      "uuid": "...",
      "name": "Spring outbound",
      "status": "drafts_ready",
      "row_count": 12
    }
  ]
}
GET

Get Email Campaign

/ext/campaigns/:uuid

Fetch 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

NameTypeDescription
uuidstringCampaign 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
}
POST

Create Email Campaign

/ext/campaigns

Atomically 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

NameTypeDescription
namestringCampaign name.
template_idstringUUID of an email template (see list_email_templates).
recipientsarrayFresh-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_upobjectFollow-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"
    }
  ]
}
POST

Schedule Email Campaign

/ext/campaigns/:uuid/schedule

Schedule 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

NameTypeDescription
uuidstringCampaign UUID (path parameter).
send_at_isostringISO 8601 UTC base time. Required when `schedules` is omitted.
interval_minutes_betweenintegerOptional stagger between rows in minutes (default 0).
schedulesarrayPer-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

Delete Record

/ext/records/:record_type/:uuid

Delete 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

NameTypeDescription
record_typestringOne 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.
uuidstringRecord UUID.

Example Request

{
  "record_type": "company",
  "uuid": "550e8400-..."
}

Example Response

{
  "success": true,
  "record_type": "company",
  "uuid": "550e8400-..."
}

Dashboard

GET

Get Dashboard Config

/ext/dashboard-configs/effective

Get 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

NameTypeDescription
typestringDashboard type: "home" (default) or "custom". Ignored when uuid is provided.
uuidstringUUID 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\"}}]"
}
GET

List Dashboards

/ext/dashboard-configs/list

List all dashboards owned by the current user. Optionally filter by type ("home", "custom").

Parameters

NameTypeDescription
typestringFilter 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": "[]"
  }
]
POST

Create Dashboard

/ext/dashboard-configs/

Create a new dashboard. Defaults to type "custom". Layout and components default to empty arrays if omitted.

Parameters

NameTypeDescription
namestringDashboard name.
typestringDashboard type (default: "custom").
layoutstringJSON string of layout array. Defaults to "[]".
componentsstringJSON 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

Delete Dashboard

/ext/dashboard-configs/:uuid

Delete a user-level dashboard by UUID. Profile-level configs cannot be deleted.

Parameters

NameTypeDescription
uuidstringUUID of the dashboard to delete.

Example Request

{
  "uuid": "ccc-..."
}

Example Response

{
  "ok": true
}
PUT

Update Dashboard Config

/ext/dashboard-configs/:uuid

Update 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

NameTypeDescription
uuidstringDashboard config UUID from get_dashboard_config.
namestringDashboard display name.
layoutstringJSON string of react-grid-layout items array.
componentsstringJSON 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

POST

Report Issue

/ext/tools/report-issue

Report an issue or bug. Creates an issue report tied to the current user. No screenshot required.

Parameters

NameTypeDescription
descriptionstringDetails about the issue.
page_urlstringURL 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

POST

Get Sentiments

/ext/tools/get-sentiments

Query sentiment signals extracted from emails, files, and calendar events. Each has actor, target, action_value, score, and confidence.

Parameters

NameTypeDescription
actor_company_idstringSentiments FROM this company UUID.
target_company_idstringSentiments ABOUT this company UUID.
themestringFilter by theme (substring match).
limitintegerMax results (default 30, max 50).
offsetintegerNumber 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

POST

Query Emails

/ext/tools/query-emails

Search 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

NameTypeDescription
searchstringKeyword search across subject and body.
date_startstringEarliest email date (YYYY-MM-DD).
date_endstringLatest email date (YYYY-MM-DD).
company_idstringFilter to emails linked to this company.
project_idstringFilter to emails linked to this project UUID. Takes precedence over company_id.
personstringPerson name, email, or UUID. Use "me" for current user.
person_rolestring"sender" or "receiver".
tagstringFilter to emails with this tag (e.g. "outreach", "recruiting").
limitintegerMax results (default 20, max 50).
offsetintegerNumber 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
}
POST

Get Email

/ext/tools/get-email

Get full email content by UUID.

Parameters

NameTypeDescription
uuidstringEmail 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

POST

Query Calendars

/ext/tools/query-calendars

Search 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

NameTypeDescription
date_startstringEarliest event date (YYYY-MM-DD).
date_endstringLatest event date (YYYY-MM-DD).
company_idstringFilter to events linked to this company.
project_idstringFilter to events linked to this project UUID. Takes precedence over company_id.
personstringAttendee/organizer name, email, or UUID. Use "me" for current user.
searchstringSubstring search in title/description/attendees.
tagstringFilter to events with this tag (e.g. "outreach", "recruiting").
limitintegerMax results (default 20, max 50).
offsetintegerNumber 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
}
POST

Get Calendar Event

/ext/tools/get-calendar

Get full calendar event details by UUID.

Parameters

NameTypeDescription
uuidstringCalendar 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

POST

Query Files

/ext/tools/query-files

Search 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

NameTypeDescription
date_startstringStart of range (YYYY-MM-DD), inclusive; filters by file upload time (created_at).
date_endstringEnd of range (YYYY-MM-DD), inclusive; filters by file upload time (created_at).
company_idstringFilter to files linked to this company.
project_idstringFilter to files linked to this project UUID. Takes precedence over company_id.
searchstringSubstring search in title/description/content.
tagstringFilter to files with this exact tag (e.g. "outreach", "recruiting").
limitintegerMax results (default 20, max 50).
offsetintegerNumber 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
}
POST

Get File

/ext/tools/get-file

Get full file content by UUID.

Parameters

NameTypeDescription
uuidstringFile 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..."
}
POST

Upload File

/ext/files

Upload 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

NameTypeDescription
content_base64stringBase64-encoded file content.
filenamestringOriginal filename with extension (e.g. report.pdf).
titlestringDisplay title (defaults to filename).
descriptionstringFile description.
content_typestringMIME type (inferred from extension if omitted).
company_idstringUUID of a company to associate the file with.
calendar_idstringUUID of a calendar event to associate the file with.
file_datestring (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"
}
POST

Share File With User

/ext/files/{file_uuid}/shares

Grant explicit access to a single teammate for a file you own. Recipient gets full owner-equivalent access (download, extracted text, parsed content).

Parameters

NameTypeDescription
file_uuidstringFile UUID (path param). Must be uploaded by the calling user.
pipeline_user_idstringRecipient pipeline_user UUID.

Example Request

{
  "pipeline_user_id": "550e8400-..."
}

Example Response

{
  "uuid": "share-...",
  "file_uuid": "file-...",
  "pipeline_user_id": "user-...",
  "created_by": "owner-...",
  "granted_via": "explicit",
  "source_uuid": null,
  "pipeline_user_name": "Jane Smith",
  "created_by_name": "John Doe"
}
POST

Share File With Users (Bulk)

/ext/files/{file_uuid}/shares/bulk

Grant explicit access to multiple teammates in one call. Same semantics as single-recipient share.

Parameters

NameTypeDescription
file_uuidstringFile UUID (path param).
pipeline_user_idsstring[]Array of recipient pipeline_user UUIDs.

Example Request

{
  "pipeline_user_ids": [
    "550e8400-...",
    "660f9500-..."
  ]
}

Example Response

[
  {
    "uuid": "share-1",
    "granted_via": "explicit",
    "pipeline_user_name": "Jane"
  },
  {
    "uuid": "share-2",
    "granted_via": "explicit",
    "pipeline_user_name": "Bob"
  }
]
GET

List File Shares

/ext/files/{file_uuid}/shares

List all active share rows on a file. Owner-only. Returns both granted_via=explicit (manually granted) and granted_via=email_recipient (auto-created when an email attachment is co-ingested).

Parameters

NameTypeDescription
file_uuidstringFile UUID (path param).

Example Request

{}

Example Response

[
  {
    "uuid": "share-1",
    "granted_via": "explicit",
    "pipeline_user_name": "Jane"
  },
  {
    "uuid": "share-2",
    "granted_via": "email_recipient",
    "pipeline_user_name": "Bob"
  }
]
DELETE

Revoke File Share

/ext/files/{file_uuid}/shares/{share_uuid}

Revoke an explicit share. Email-recipient and project-member shares cannot be revoked manually — they are derived from email recipients and project membership; revoking returns 400.

Parameters

NameTypeDescription
file_uuidstringFile UUID (path param).
share_uuidstringShare row UUID (from List File Shares).

Example Request

{}

Example Response

{
  "uuid": "share-1",
  "is_deleted": true,
  "granted_via": "explicit"
}

Summaries & meeting prep

POST

Get My Day

/ext/tools/get-my-day

Get 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"
  ]
}
POST

Get My Week

/ext/tools/get-my-week

Get 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"
  ]
}
POST

Get Meeting Prep

/ext/tools/get-meeting-prep

Get AI-generated meeting prep for a company: background, recent activity, key metrics, and talking points.

Parameters

NameTypeDescription
company_idstringCompany 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

POST

Get Portfolio Data

/ext/tools/get-portfolio-data

Read 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

NameTypeDescription
company_uuidstringCompany UUID (sponsor or port_co). Exactly one of company_uuid or fund_uuid.
fund_uuidstringFund 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
    }
  ]
}
POST

Update Portfolio Data

/ext/tools/update-portfolio-data

Single 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

NameTypeDescription
actionstringOne of create_port_co, update_port_co, create_fund, update_fund.
sponsor_company_uuidstringSponsor company UUID (create_port_co, create_fund).
port_co_company_uuidstringPort_co company UUID (create_port_co). Must already exist.
relationship_uuidstringPort_co relationship UUID (update_port_co).
fund_uuidstringFund UUID (update_fund/update_port_co) or fund to link (create_port_co).
namestringFund name (create_fund, update_fund).
start_datestringFund start date ISO YYYY-MM-DD.
end_datestringFund end date ISO YYYY-MM-DD.
amountstringFund amount as a number string.
statusstringPort_co investment status (e.g. active, exited).
yearintegerPort_co investment year.
stake_typestringPort_co stake type (e.g. minority, majority).
stake_confidencenumber0-1 confidence score.
stake_evidence_titlestringSource title supporting the stake classification.
stake_evidence_urlstringSource URL supporting the stake classification.
lead_sponsor_contactstringPerson UUID (at sponsor) leading the investment.
team_leadstringPipeline user UUID owning the port_co relationship for this team.
prioritystringTeam-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

POST

Get Biopharma Assets

/ext/tools/get-biopharma-assets

Read biopharma assets and nested indications for companies whose industry metric is biotechnology or pharmaceuticals. Pass exactly one of company_uuid or asset_uuid.

Parameters

NameTypeDescription
company_uuidstringCompany UUID. Exactly one of company_uuid or asset_uuid.
asset_uuidstringBiopharma 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
        }
      ]
    }
  ]
}
POST

Create Biopharma Asset

/ext/tools/create-biopharma-asset

Create a biopharma asset for a biotechnology or pharmaceuticals company.

Parameters

NameTypeDescription
company_uuidstringCompany UUID.
namestringAsset name.
targetstringOptional target.
moastringOptional mechanism of action.
is_leadbooleanWhether 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": []
  }
}
POST

Update Biopharma Asset

/ext/tools/update-biopharma-asset

Update a biopharma asset by UUID. Only provided fields change; pass null for nullable fields to clear them.

Parameters

NameTypeDescription
asset_uuidstringBiopharma asset UUID.
namestringAsset name.
targetstringOptional target; null clears.
moastringOptional mechanism of action; null clears.
is_leadbooleanWhether 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": []
  }
}
POST

Create Biopharma Indication

/ext/tools/create-biopharma-indication

Create an indication under a biopharma asset. Phase values: preclinical, phase 1, phase 2, pivotal, filed, approved. peak_sales is in $M.

Parameters

NameTypeDescription
asset_uuidstringBiopharma asset UUID.
namestringIndication name.
phasestringOptional phase.
milestonestringOptional milestone text.
milestone_datestringOptional date, YYYY-MM-DD.
peak_salesnumberOptional peak sales in $M.
is_leadbooleanWhether 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
  }
}
POST

Update Biopharma Indication

/ext/tools/update-biopharma-indication

Update a biopharma indication by UUID. Only provided fields change; pass null for nullable fields to clear them.

Parameters

NameTypeDescription
indication_uuidstringBiopharma indication UUID.
namestringIndication name.
phasestringOptional phase; null clears.
milestonestringOptional milestone text; null clears.
milestone_datestringOptional date, YYYY-MM-DD; null clears.
peak_salesnumberOptional peak sales in $M; null clears.
is_leadbooleanWhether 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"
  }
}