API Documentation

Download OpenAPI spec (YAML)

Machine-readable OpenAPI 3.0 spec — for agents, integrations, and code generators.

Decile Hub API v1 v1

The Decile Hub API and Decile Hub Browser Extension use API tokens, which you can view/generate here if you are logged into Hub, or see above. Once you have an API token, pass it in the Authorization header of each request. If you have questions, ask in Decile Base and somebody from the dev team will get back to you shortly.

Authentication 1

GET /api/v1/whoami Identify the authenticated token

Returns metadata about the authenticated API token, the user it belongs to, the account it is scoped to, the token-level permissions, and (for regular user tokens) the user's account_user role flags and accessible pipeline IDs. Useful for agents and integrations to introspect their own capabilities before making other calls. Legacy API tokens are rejected with a 403.

Responses

Status Description Schema
200

token identified

401

Unauthorized — token missing, invalid, or expired

403

Forbidden — legacy API tokens are not supported

ErrorResponse

Admin 1

GET /api/v1/admin/accounts List accounts the calling admin can access

Admin-only. Returns the Decile Hub accounts the calling admin user can reach — accounts that have opted in to decile-admin access plus any account the admin is directly a member of. Results are sorted by name and capped at 100 rows; pass search to filter by name or subdomain when the admin has access to many accounts. Non-admin tokens receive 403. Requires X-Account-Id header set to any account this admin can access; the response then enumerates the full set including that seed account.

Parameters

Name In Type Required Description
search query string

Optional case-insensitive substring filter on account name or subdomain.

Responses

Status Description Schema
200

accounts returned

array<object>
401

Unauthorized — token missing, invalid, expired, or X-Account-Id header missing/unauthorized

403

Forbidden — endpoint requires an admin API token

ErrorResponse

Accounts 1

GET /api/v1/accounts Retrieves the current account

Returns the current account's basic information

Responses

Status Description Schema
200

account found

401

Unauthorized

AccountUsers 1

GET /api/v1/account_users List the AccountUsers (team members) on the current account

Returns the AccountUsers belonging to the authenticated token's account.
Use to discover the assigned_id value for PATCH /api/v1/pipeline_prospects and
PATCH /api/v1/pipeline_prospects/{id} (the prospect-owner field).

Pagination is zero-indexed; page size is 100.

Parameters

Name In Type Required Description
page query integer

Zero-indexed page number (default 0)

Responses

Status Description Schema
200

Account users

object
401

Unauthorized

ActivityEntries 2

GET /api/v1/activity_entries List activity feed entries for the current account

Returns the activity feed for the current account, newest first. Filter by
subject (entity), event type, actor, or date range.

Pagination is keyset — pass pagination.next_page_token from a response back
as page_token= to fetch the next page.

Parameters

Name In Type Required Description
subject_type query string

Filter to entries whose subject is this top-level entity class. Pair with subject_id.

subject_id query integer

Subject record id; pair with subject_type.

include_associated query boolean

When subject_type=Organization, also include entries for its People. Defaults false.

event query string

Curated event filter. Mutually exclusive with entryable_type — sending both returns 400.

entryable_type query string

Lower-level entryable class filter (e.g. Log::ActivityEntries::Note). Mutually exclusive with event.

user_id query string

Actor user id. Pass the literal automation to match entries from system/automated events.

created_after query string

ISO 8601 date or datetime; only entries created on or after this point.

created_before query string

ISO 8601 date or datetime; only entries created on or before this point.

order_direction query string

Sort direction on (created_at, id). Defaults desc.

page_token query string

Opaque keyset cursor returned by a previous call as pagination.next_page_token.

per_page query integer

Page size. Capped at 100; defaults to 25.

include query string

Comma-separated nested embeds. Currently supports entryable (returns
minimal {type, action} only).

fields query string

Comma-separated top-level fields to return. Always returns at least id. Unknown fields are ignored.

Responses

Status Description Schema
200

paginated list of activity entries

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

GET /api/v1/activity_entries/{id} Get a single activity entry with its full entryable body

Returns one activity entry plus the full per-type entryable body —
audit change diffs, full email bodies and recipients, note bodies,
AML/KYC status, chat summaries, and so on. The list endpoint omits this detail.

Parameters

Name In Type Required Description
id path integer required

Activity entry id.

Responses

Status Description Schema
200

the activity entry with its entryable body

ActivityEntryDetail
401

Unauthorized

403

Forbidden

404

Not found

ErrorResponse

Entities 4

GET /api/v1/entities List firm-admin entities

Returns a paginated list of the firm-admin entities (funds, SPVs,
holdings, management companies, general partnerships) under the
authenticated token's account. Identity-only payload — fund-specific
configuration (cutover dates, GP carry %, logo URL) is returned by
GET /api/v1/entities/{id} instead.

Pagination is 1-indexed (page 1 is the first page). per_page is
capped at 100; values <= 0 fall back to the default of 50.

Parameters

Name In Type Required Description
type query array<string>

Filter by entity kind. Repeatable — send the param multiple times
for multiple kinds (?type=fund&type=spv). Unknown values return a 400
invalid_parameter error rather than being silently ignored.

fund maps to AccountOrganizationFund rows whose
fund_details.fund_type is fund or start_fund. spv maps to
fund_details.fund_type=spv. holding maps to
fund_details.fund_type=fund_of_funds.

active query string

Active vs hidden entity filter. true (default) returns
active (non-hidden) entities (hidden_from_left_nav=false);
false returns only hidden entities; all returns both.

page query integer

1-indexed page number (default 1).

per_page query integer

Page size. Capped at 100; defaults to 50 when omitted or <= 0.

Responses

Status Description Schema
200

paginated list of entities

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

POST /api/v1/entities Create a firm-admin entity

Creates a new AccountOrganization plus a fresh Organization and (for
fund kinds) a FundDetail under the authenticated account.

Onboarding side effects are suppressed for API-created entities —
no LP closing pipeline is generated, no AccountOrganizationUser is
attached for the account owner, and no Accelerator client_product
touch fires. Callers that want the full onboarding workflow should
continue to use the firm-admin UI.

POST is not idempotent. To retry safely, GET /api/v1/entities and
check whether the desired entity already exists before retrying.

Requires a caller who is a full_access_account_admin? of the target account.

Request body required

Content-Type Schema
application/json EntityCreateRequest

Responses

Status Description Schema
201

Created

EntityShowResponse
401

Unauthorized

403

Forbidden (caller is not full_access_account_admin)

ErrorResponse
422

Validation failure

ErrorResponse
GET /api/v1/entities/{id} Show one firm-admin entity

Returns identity + a details block for one entity. The details
block always includes currency, currency_symbol, fiscal_year_end,
entity_name, logo_url, is_active, and kind. When the entity is a fund
(kind=fund, spv, or holding) the details block additionally
includes gp_carry, new_management_fee_system_cutover_date, and
new_carry_system_cutover_date. For non-fund entities those keys are
omitted entirely.

Pass ?include=calculations to embed a calculations block of
fund-level dashboard values. ?window=now (default) returns
as-of-today values and includes capital_activity.invested plus
fees.reserved_for_fees; ?window=lifetime returns forecast values
and omits those two fields entirely. calculations is only supported
on fund-kind entities (kind=fund, spv, or holding); requesting
it on a non-fund entity returns 404. Numeric values serialize as
2-decimal-place decimal strings (currency) or 4-decimal-place
decimal strings (ratios such as performance.net_irr); investor
counts are integers.

Returns 404 (not 403) when the id refers to an entity in a different
account.

Parameters

Name In Type Required Description
id path integer required

Entity id (plain integer).

include query string

Comma-separated list of optional nested resources to embed. Only
calculations is currently supported. Unknown values are
silently ignored. When omitted, the calculations block is not
present in the response.

window query string

Calculation window for the calculations block. Only meaningful
when include=calculations is supplied. now (default) returns
current as-of values; lifetime returns forecast values and
omits capital_activity.invested and fees.reserved_for_fees.
Any other value returns 400 invalid_parameter.

Responses

Status Description Schema
200

entity found

composite
400

Invalid window value

ErrorResponse
401

Unauthorized

403

Forbidden

404

Entity not found (includes include=calculations requested on a non-fund entity)

ErrorResponse
PATCH /api/v1/entities/{id} Update a firm-admin entity

Updates writable fields on an existing entity within the authenticated
account. All fields optional — only sent fields are applied.

kind is immutable. Sending a matching kind is a no-op; sending a
differing kind returns 422.

Renaming guard: if the entity's Organization is shared with sibling
AccountOrganization rows (an edge case for entities created before this
endpoint existed, or via paths that don't use the API's two-step create),
PATCH refuses with 409 organization_shared_with_siblings and includes
the sibling entity ids in error.details.sibling_entity_ids so callers
can fall back to the firm-admin UI.

Additional rename guard at the model level:
Organization#prevent_name_change_if_accounting_transactions_exist
returns 422 if the Organization has associated accounting transactions.

PATCH is_active=false is the v1 stopgap for hiding an entity, since
DELETE is not yet supported.

Requires a caller who is a full_access_account_admin? of the target account.

Parameters

Name In Type Required Description
id path integer required

Request body required

Content-Type Schema
application/json EntityUpdateRequest

Responses

Status Description Schema
200

OK

EntityShowResponse
401

Unauthorized

403

Forbidden

ErrorResponse
404

Entity not found in the authenticated account

ErrorResponse
409

Rename would affect sibling entities sharing this Organization

ErrorResponse
422

Validation failure

ErrorResponse

Capital Accounts 4

GET /api/v1/entities/{entity_id}/capital_accounts List capital accounts under an entity

Identity-only list. Per-account calculation values (committed
capital, contributions, balances) are intentionally NOT included
here — they come from the per-record /calculations endpoint and
the bulk /entities/{entity_id}/capital_accounts/calculations
endpoint.

Returns 404 when entity_id resolves to an entity in a different
account (cross-account requests are not distinguished from missing).

Parameters

Name In Type Required Description
entity_id path integer required

Entity id (plain integer).

active query string

true (default) returns capital accounts where
is_capital_account_enabled=true. false returns disabled
accounts; all returns both.

partner_type query string

Optional partner-type filter. Unknown values return a 400
invalid_parameter error.

page query integer

1-indexed page number (default 1).

per_page query integer

Page size. Capped at 100; defaults to 50.

Responses

Status Description Schema
200

paginated list of capital accounts

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

404

Entity not found

ErrorResponse
GET /api/v1/capital_accounts/{id} Show one capital account

Identity block + commitments + primary_contact + contacts + entity
ref. contacts is the full list of contacts on the capital account
(joint signatories, spouses, trustees, entity owners/signatories,
trust beneficiaries); each entry carries role flags plus
contact_status_type (none/primary/additional). Returns 404
when the capital account belongs to a different account. Use
?include=transfers to embed an ordered list of capital-account
transfers oriented at the requested CA (kind=outbound when the
requested CA is the from_capital_account, inbound otherwise);
effective_at is aliased from the underlying transferred_at
column.

Parameters

Name In Type Required Description
id path integer required

Capital account id (plain integer).

include query string

Comma-separated list of nested resources to embed. Only
transfers is currently supported. Unknown values are silently
ignored. When omitted, the transfers array is not present in
the response.

Responses

Status Description Schema
200

capital account found

composite
401

Unauthorized

403

Forbidden

404

Capital account not found

ErrorResponse
GET /api/v1/capital_accounts/{id}/calculations Single-capital-account period calculations

Computes a single capital account's period figures. Response groups:

- commitments — 12 commitment + paid-in fields.
- period_activity — 15 ledger movements within the window.
- performancedpi, rvpi, tvpi.
- metaperiod_start, period_end, currency,
management_fee_system, carry_system, cutover_dates. The
*_system keys are legacy (window ends before the cutover),
new (window starts on/after the cutover), or hybrid (window
straddles the cutover).

All numeric values are returned as decimal strings (currency 2
decimal places, ratios 4 decimal places). Nil values are returned
as null. Returning decimal strings is intentional so callers
don't lose precision via JS number parsing.

Period semantics: pass both period_start and period_end (ISO
YYYY-MM-DD). Both are required together — supplying one without
the other returns a 400. period_end must be on or after
period_start. When neither is supplied, the window defaults to
the current fiscal-year-to-date for the parent entity.

In a hybrid window the API uses the new-system carry calculation
directly even for GP-carry capital accounts, which can differ from
calculating each side of the cutover separately. Request explicit
pre/post cutover windows if you need each side calculated on its own.

Parameters

Name In Type Required Description
id path integer required

Capital account id (plain integer).

period_start query string (date)

ISO 8601 date (YYYY-MM-DD). Required when period_end is
supplied. Omitting both defaults to the fund's current
fiscal-year-to-date.

period_end query string (date)

ISO 8601 date (YYYY-MM-DD). Required when period_start is
supplied. Must be on or after period_start.

Responses

Status Description Schema
200

calculations computed

object
400

invalid parameter (e.g. malformed date, end before start)

ErrorResponse
401

Unauthorized

403

Forbidden

404

Capital account not found

ErrorResponse
GET /api/v1/entities/{entity_id}/capital_accounts/calculations Bulk capital-account period calculations + totals

Paginated bulk variant of the single-CA calculations endpoint.
Each row in capital_accounts is the same shape as the single-CA
response (commitments/period_activity/performance/meta groups) but
with id+name pulled out of identity for easier table rendering.
Adds a fund-level totals block aggregated across the filtered
scope (NOT only the current page).

Totals semantics:
- Currency fields are summed across the filtered scope.
- Per-CA ratio fields (percentage_of_total_commitments,
percentage_of_lp_commitments, percentage_of_funds_called,
amount_paid_in_for_capital_accounts_percentage) are null in
totals — per-account ratios do not sum into a fund-level figure.
- Performance ratios (dpi, rvpi, tvpi) are null in totals
for the same reason.
- total_committed_capital, lp_committed_capital,
gp_committed_capital are fund-wide regardless of filters — the
per-row total_committed_capital denominator is a fund-level
value, not "total of the filtered list."

Period and decimal-string semantics are identical to the single-CA
endpoint.

fields= projection: comma-separated whitelist of calculation
field names. When supplied, rows AND totals are narrowed to just
the requested fields. If zero requested fields fall within a
group, that entire group key is dropped from both rows and totals.
id and name are always present on each row. Unknown field
names are silently dropped.

Parameters

Name In Type Required Description
entity_id path integer required

Entity id (plain integer).

period_start query string (date)

ISO 8601 date. Required when period_end is supplied. Defaults to fiscal-year-to-date.

period_end query string (date)

ISO 8601 date. Required when period_start is supplied. Must be on or after period_start.

active query string

true (default) restricts to enabled capital accounts; false
for disabled-only; all for both. The filter narrows the rows
returned AND the totals aggregation, EXCEPT for the fund-wide
commitment denominators noted above.

partner_type query string
fields query string

Comma-separated whitelist of calculation fields to return.
When supplied, rows and totals are narrowed to just these
fields; groups with zero matching fields are dropped from both
rows and totals. id and name are always returned on each
row. Allowed fields (group in parentheses):

commitments — committed_capital, total_committed_capital,
lp_committed_capital, gp_committed_capital,
percentage_of_total_commitments,
percentage_of_lp_commitments,
percentage_of_funds_called,
amount_paid_in_for_capital_accounts,
amount_paid_in_for_capital_accounts_percentage,
outstanding_capital_contribution,
capital_call_receivable, capital_call_prepaid.

period_activity — beginning_balance, capital_contribution,
syndication_cost, management_fees, incentive_fees,
net_operating_gain, late_interest, unrealized_gain,
carried_interest_accrued, net_realized_gain,
deemed_gain, distributions, in_kind_distributions,
transfers, ending_balance.

performance — dpi, rvpi, tvpi.

meta — period_start, period_end, currency,
management_fee_system, carry_system, cutover_dates.

page query integer

1-indexed page number (default 1).

per_page query integer

Page size. Capped at 100; defaults to 50.

Responses

Status Description Schema
200

bulk calculations + totals

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

404

Entity not found

ErrorResponse

Journal Entries 4

GET /api/v1/entities/{entity_id}/journal_entries List journal entries (GL transactions) under an entity

Returns the journal entries (general-ledger / accounting transactions —
double-entry GL postings) recorded under the given entity. Each row
carries the transaction date/amount, reconciled/pending flags, comment,
the debit and credit ledger accounts (code + name), and the polymorphic
counterparty (type, id, name; null when absent). Discarded entries are
excluded.

Filters (all optional): a transaction_at window via
transaction_at_start/transaction_at_end; debit_code/credit_code
(GL account codes — an unknown code returns no rows); reconciled and
pending (true/false); min_amount/max_amount; and
counterparty_type (+ optional counterparty_id).

Returns 404 when entity_id resolves to an entity in a different
account (cross-account requests are not distinguished from missing).

Parameters

Name In Type Required Description
entity_id path integer required

Entity id (plain integer).

transaction_at_start query string (date)

ISO date (YYYY-MM-DD) lower bound on transaction_at.

transaction_at_end query string (date)

ISO date (YYYY-MM-DD) upper bound on transaction_at.

debit_code query string

GL account code on the debit side (e.g. "1100"). Unknown codes return no rows.

credit_code query string

GL account code on the credit side (e.g. "6000"). Unknown codes return no rows.

reconciled query string

Filter by reconciled flag. Unknown values return a 400 invalid_parameter error.

pending query string

Filter by pending flag. Unknown values return a 400 invalid_parameter error.

min_amount query number

Lower bound on transaction_amount.

max_amount query number

Upper bound on transaction_amount.

counterparty_type query string

Polymorphic counterparty type (e.g. FirmAdmin::CapitalAccount, FirmAdmin::PortfolioCompany, Organization).

counterparty_id query integer

Counterparty id; only meaningful alongside counterparty_type.

page query integer

1-indexed page number (default 1).

per_page query integer

Page size. Capped at 100; defaults to 50.

Responses

Status Description Schema
200

paginated list of journal entries

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

404

Entity not found

ErrorResponse
POST /api/v1/entities/{entity_id}/journal_entries Create one journal entry (GL transaction) under an entity

Creates a single journal entry (general-ledger / accounting transaction —
a double-entry GL posting) under the given entity. Posts one debit/credit
pair for the supplied amount and date. The entry is created unreconciled
(reconciled false, pending false). debit_code and credit_code are
GL account codes (see the chart-of-accounts endpoint) — they must differ
and both must resolve to a known accounting account. amount must be
numeric and greater than 0. transaction_at is an ISO date (YYYY-MM-DD).
An optional counterparty can be attached via counterparty_type +
counterparty_id; the counterparty must belong to the same account.

Returns 422 on invalid input (unknown code, equal debit/credit codes,
non-positive or non-numeric amount, malformed date, or a cross-account
counterparty), 403 for a read-only token, and 404 when entity_id
resolves to an entity in a different account.

Parameters

Name In Type Required Description
entity_id path integer required

Entity id (plain integer).

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

the created journal entry

JournalEntry
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden (read-only token or insufficient permission)

ErrorResponse
404

Entity not found

ErrorResponse
422

validation failed

ErrorResponse
POST /api/v1/entities/{entity_id}/journal_entries/bulk Create many journal entries (GL transactions) under an entity (atomic)

Creates many journal entries (general-ledger / accounting transactions —
double-entry GL postings) under the given entity in a single atomic,
all-or-nothing batch. Each row in journal_entries is a full independent
entry validated by the same rules as the single-create endpoint:
debit_code and credit_code are GL account codes (see the
chart-of-accounts endpoint) that must differ and both resolve to a known
account, amount is numeric and greater than 0, transaction_at is an
ISO date (YYYY-MM-DD), and an optional counterparty may be attached via
counterparty_type + counterparty_id (same account).

Provide between 1 and 100 rows. EVERY row is validated first; if ANY row
is invalid the entire batch is rejected with 422 and a per-row errors
array ({index, field, message}) and NOTHING is created. When all rows
are valid they are created together inside one database transaction; any
unexpected failure rolls the whole batch back (never a partial commit).
All entries are created unreconciled (reconciled false, pending
false). Idempotency is the caller's responsibility — re-sending a batch
posts it again.

Returns 422 on validation failure or an out-of-range batch (empty or more
than 100 rows), 403 for a read-only token, and 404 when entity_id
resolves to an entity in a different account.

Parameters

Name In Type Required Description
entity_id path integer required

Entity id (plain integer).

Request body required

Content-Type Schema
application/json JournalEntryBulkCreateRequest

Responses

Status Description Schema
201

the created journal entries

object
401

Unauthorized

403

Forbidden (read-only token or insufficient permission)

ErrorResponse
404

Entity not found

ErrorResponse
422

validation failed (per-row errors, or an out-of-range batch)

composite
GET /api/v1/journal_entries/{id} Show one journal entry (GL transaction)

Returns a single journal entry (general-ledger / accounting transaction —
a double-entry GL posting): transaction date/amount, reconciled/pending
flags, comment, the debit and credit ledger accounts (code + name), and
the polymorphic counterparty (type, id, name; null when absent). Returns
404 when the entry is unknown, discarded, or belongs to a different
account (cross-account requests are not distinguished from missing).

Parameters

Name In Type Required Description
id path integer required

Journal entry id (plain integer).

Responses

Status Description Schema
200

journal entry found

JournalEntry
401

Unauthorized

403

Forbidden

404

Journal entry not found

ErrorResponse

Accounting Accounts 2

GET /api/v1/accounting_accounts List the chart of accounts / GL account codes

Returns the chart of accounts (GL account codes) shared across the
account. Use this to discover valid account codes before posting
journal entries. Codes follow standard GL ranges: 1xxx=assets,
2xxx=liabilities, 3xxx=equity, 4xxx=revenue, 6xxx/7xxx=expenses. All
filters are optional and combine with AND. Results are paginated and
ordered by code.

Parameters

Name In Type Required Description
code query string

Exact account code to match, e.g. "1000".

code_prefix query string

Match account codes beginning with these characters, e.g. "1" for the asset range.

is_1099_eligible query boolean

Filter to accounts that are (true) or are not (false) 1099-eligible.

search query string

Case-insensitive substring match against account name or description.

page query integer
per_page query integer

Responses

Status Description Schema
200

paginated list of accounting accounts

object
400

Invalid query parameter

ErrorResponse
401

Unauthorized

403

Forbidden

GET /api/v1/accounting_accounts/{id} Show one chart-of-accounts / GL account code

Returns a single chart-of-accounts entry (GL account code) by its
integer id. Use after list_accounting_accounts to confirm a code
before posting a journal entry.

Parameters

Name In Type Required Description
id path integer required

Accounting account id (plain integer).

Responses

Status Description Schema
200

accounting account found

AccountingAccount
401

Unauthorized

403

Forbidden

404

Accounting account not found

ErrorResponse

Capital Calls 3

GET /api/v1/capital_calls List capital calls under an entity

Returns the capital calls (draft/open/closed) issued from the given
entity's fund. Each row carries header fields only: id, name, status,
percentage_to_call, notes, amount_being_called (sum of per-LP details),
created_at, closed_at, due_date, and the parent entity ref.

Filter by status and a created_at window via period_start /
period_end (both ISO dates; supply together). Returns 404 when
entity_id belongs to a different account.

Parameters

Name In Type Required Description
entity_id query integer required

Entity id (plain integer).

status query string

Filter by lifecycle status.

period_start query string (date)

ISO date (YYYY-MM-DD) lower bound on created_at. Required together with period_end.

period_end query string (date)

ISO date (YYYY-MM-DD) upper bound on created_at. Required together with period_start.

page query integer
per_page query integer

Responses

Status Description Schema
200

paginated list of capital calls

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

404

Entity not found

ErrorResponse
GET /api/v1/capital_calls/{id} Show one capital call

Returns the header block for a single capital call. Use
/api/v1/capital_calls/{id}/details for per-LP rows.

Parameters

Name In Type Required Description
id path integer required

Responses

Status Description Schema
200

capital call found

CapitalCallHeader
401

Unauthorized

403

Forbidden

404

Capital call not found

ErrorResponse
GET /api/v1/capital_calls/{id}/details List per-LP detail rows under a capital call

Returns the per-capital-account line items (LPs/GPs) attached to a
capital call: amount called, the LP's committed capital, wired amount
and wire date (from reconciled wire transactions on the period),
variance (wired − called) and a derived payment_status
(fully_paid/underpaid/overpaid/unpaid/prepaid/over_commitment/
any_variance/unknown).

Parameters

Name In Type Required Description
id path integer required

Capital call id (plain integer).

page query integer
per_page query integer

Responses

Status Description Schema
200

paginated list of capital call details

object
401

Unauthorized

403

Forbidden

404

Capital call not found

ErrorResponse

Financial Reports 3

GET /api/v1/financial_reports List financial report generation jobs

Returns a paginated list of financial report generation jobs that belong to the authenticated token's account, regardless of which token within that account created them. Sorted by created_at descending. Successful jobs include download URLs for the generated files.

Parameters

Name In Type Required Description
page query integer

0-indexed page number (50 jobs per page).

Responses

Status Description Schema
200

paginated list of jobs

object
401

Unauthorized

POST /api/v1/financial_reports Generate a financial report

Queues an asynchronous financial report generation job. The job includes every entity of the requested entity_type within the token's account. Use the returned status_url to poll job status and download generated files after the job succeeds.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
202

report generation job queued

object
400

Invalid parameter

401

Unauthorized

403

Forbidden

404

Account organization not found

422

Validation failed

GET /api/v1/financial_reports/{id} Get financial report generation status

Returns the current status for a financial report generation job created by the authenticated token. Successful jobs include download URLs for the generated files.

Parameters

Name In Type Required Description
id path integer required

Responses

Status Description Schema
200

job status found

object
401

Unauthorized

404

Job not found

Events 8

GET /api/v1/events List Events

Gets a paginated list of Events in your account. The response will have a data array with the events and a pagination object with the total count, current page, and total pages. Pages are 0-indexed, so the first page is page 0. The Events returned can be filtered and ordered. Order direction is ascending by default.

Parameters

Name In Type Required Description
title query string

Event title includes this string (case-insensitive)

start_date query string

Only events starting on or after this date (ISO 8601 format)

end_date query string

Only events ending on or before this date (ISO 8601 format)

published query boolean

Filter by published status

access_type query AccessType

Filter by access type

page query integer

Page number (0-indexed)

order_by query string

Field to order by

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

401

Unauthorized

POST /api/v1/events Create Event

Creates a new Event in your account. A successful request will return the created event data with success status. The event will automatically have an associated pipeline and questionnaire created for guest management.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

event created

400

bad request

ErrorResponse
401

Unauthorized

GET /api/v1/events/{id} Show Event

Get a single Event by ID or unique_event_id. The default response shape is unchanged from prior versions. The optional include= and fields= parameters are purely opt-in - include= replaces the default include set (currently empty for events) with a caller-specified set, and fields= narrows top-level columns. include_guests=true is preserved as a backwards-compatible alias for include=guests.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

include query string

Comma-separated list of nested resources to embed in the response.
Unknown values are ignored silently. Allowed values: guests.

fields query string

Comma-separated list of top-level fields to return. Unknown values
are ignored silently. When fields= is supplied, the response is always narrowed; id and name are always present, and if no supplied keys match the whitelist the response collapses to just {id, name}.

include_guests query boolean

Deprecated alias for include=guests; kept for backwards compatibility.

Responses

Status Description Schema
200

event found with guests

404

not found

401

Unauthorized

PUT /api/v1/events/{id} Update Event

Update an existing Event. Only the provided fields will be updated.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

event updated

404

not found

401

Unauthorized

400

invalid timezone

ErrorResponse
DELETE /api/v1/events/{id} Delete Event

Delete an Event and all associated data including pipeline and questionnaire.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

Responses

Status Description Schema
200

event deleted

404

not found

401

Unauthorized

GET /api/v1/events/{id}/guests Get Event Guests

Get a paginated list of guests for an event with their RSVP status and pipeline stage information. Results can be filtered by email or pipeline stage.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

page query integer

Page number (0-indexed)

email query string

Filter by email (partial match)

stage query string

Filter by pipeline stage name

Responses

Status Description Schema
200

guests retrieved

404

event not found

401

Unauthorized

POST /api/v1/events/{id}/guests Add Guests to Event

Add multiple guests to an event. Guests will be created as People if they don't exist and added to the event pipeline. The response includes arrays of added, duplicate, and error results for processing feedback.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

guests added

400

bad request

404

not found

401

Unauthorized

PATCH /api/v1/events/{id}/rsvp Update Guest RSVP

Update a guest's RSVP status for an event. This will also update the guest's pipeline stage accordingly.

Parameters

Name In Type Required Description
id path string required

Event ID or unique_event_id

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

rsvp updated

400

bad request

404

event not found

401

Unauthorized

Files 9

GET /api/v1/files List Files

Gets a paginated list of Files in your Files. The response will have a data array with the files and a pagination object with the total count, current page, and total pages. Pages are 0-indexed, so the first page is page 0. The Files returned can be filtered and ordered. Order direction is ascending by default.

Parameters

Name In Type Required Description
name query string

Name includes this string (case-insensitive)

folder_id query integer

Filter by folder ID

extension query string

Filter by file extension (e.g., .pdf, .doc)

created_before query string

Only files created on or before this date

created_after query string

Only files created on or after this date

page query integer

Page number (0-indexed)

order_by query string

Field to order by:
* name
* created_at
* updated_at

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

401

Unauthorized

POST /api/v1/files Upload File

Uploads a new file.

Request format

Must be sent as multipart/form-data with file params nested under
the file key
:

- file[file] — the upload (required)
- file[name] — optional custom name
- file[description] — optional description
- folder_id — optional, top-level (not under file[]). If omitted,
the file is placed in the account's default folder.
- file[attachable_type] and file[attachable_id] — optional pair. When
both are provided, the upload is *also* attached to the given record so
it appears in that record's attachment list (in addition to landing in
the data room). Allowed attachable_type values: Person,
Organization, PipelineProspect. For PipelineProspect, the
attachment is routed to the prospect's underlying prospectable
(Person or Organization) — this matches UI behavior.

Supported extensions

.ppt, .pptx, .key, .doc, .docx, .mov, .mp4, .ogg, .pdf,
.png, .jpg, .jpeg

Example

``
curl -X POST https://decilehub.com/api/v1/files \
-H "Authorization: Bearer $TOKEN" \
-F "file[file]=@./doc.pdf" \
-F "file[name]=My Doc" \
-F "folder_id=123"
``

Request body

Content-Type Schema
multipart/form-data object

Responses

Status Description Schema
201

file uploaded successfully

400

bad request

ErrorResponse
401

Unauthorized

GET /api/v1/files/{id} Show File

Gets details for a specific file, including metadata and associated folders.

Parameters

Name In Type Required Description
id path integer required

File ID

Responses

Status Description Schema
200

file found

400

file not found

ErrorResponse
401

Unauthorized

PUT /api/v1/files/{id} Update File

Updates a file. You can update just the metadata (name/description),
or upload a new version of the file — uploading a new file creates a new
version while maintaining history.

Request format

Must be sent as multipart/form-data with params nested under the
file key
. All fields are optional:

- file[name] — updated name
- file[description] — updated description
- file[file] — new file upload (creates a new version)

Parameters

Name In Type Required Description
id path integer required

File ID

Request body

Content-Type Schema
multipart/form-data object

Responses

Status Description Schema
200

new version created successfully

404

file not found

ErrorResponse
401

Unauthorized

GET /api/v1/files/{id}/download Download File

Downloads a file from your Files. Returns the file content with appropriate headers for download.

Parameters

Name In Type Required Description
id path integer required

File ID

Responses

Status Description Schema
200

file downloaded successfully

400

file not found

ErrorResponse
401

Unauthorized

POST /api/v1/files/{id}/save_to_folder Save File To Folder

Saves an in-message file (an Attachment) into a data room folder so it is
durably stored and visible to the folder's audience.

The {id} path parameter is the Attachment id. The target folder is given
by the required top-level folder_id in the JSON body.

The operation is idempotent on the pair of (file content, folder): if the
same file content already exists in the folder, no new placement is created
and the existing one is returned with status: unchanged. Otherwise a new
placement is created and returned with status: created.

The response includes folder_path (a breadcrumb such as "Parent > Child")
and audience (a human readable phrase describing who can see the file),
which the agent uses to compose its success message.

Parameters

Name In Type Required Description
id path integer required

Attachment ID

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

file saved to folder

200

file already present in folder (idempotent)

401

Unauthorized

403

forbidden

ErrorResponse
404

file or folder not found

ErrorResponse
400

missing folder_id or attachment has no file content

ErrorResponse
GET /api/v1/folders List Folders

Gets a paginated list of Folders in your Files. The response will have a data array with the folders and a pagination object with the total count, current page, and total pages. Pages are 0-indexed, so the first page is page 0. The Folders returned can be filtered and ordered. Order direction is ascending by default.

Parameters

Name In Type Required Description
name query string

Name includes this string (case-insensitive)

folder_type query string

Filter by folder type

parent_id query integer

Filter by parent folder ID

created_before query string

Only folders created on or before this date

created_after query string

Only folders created on or after this date

page query integer

Page number (0-indexed)

order_by query string

Field to order by:
* name
* created_at
* updated_at

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

401

Unauthorized

POST /api/v1/folders Create Folder

Creates a new folder in your Files. You can optionally specify a parent folder by providing a parent_id. Folder names must be unique within the same parent folder.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

child folder created successfully

400

malformed request

ErrorResponse
404

parent folder not found

ErrorResponse
401

Unauthorized

GET /api/v1/folders/{id} Show Folder

Gets details for a specific folder, including optional child folders and files. Use the contents parameter to specify what to include: "folders", "files", or "folders,files". Default includes both folders and files.

Parameters

Name In Type Required Description
id path integer required

Folder ID

contents query string

What to include: "folders", "files", "folders,files", or "none"

name query string

Filter child items by name (case-insensitive)

order_by query string

Field to order child items by:
* name
* created_at
* updated_at

order_direction query string

Order direction for child items

Responses

Status Description Schema
200

folder found

404

folder not found

ErrorResponse
401

Unauthorized

Folders 1

Directory 10

GET /api/v1/organizations List Organizations

Gets a paginated list of Organizations in your Organizations Directory. The response will have a data array with the organizations and a pagination object with the total count, current page, and total pages.Pages are 0-indexed, so the first page is page 0.The Organizations returned can be filtered and ordered. Order direction is ascending by default. The default response shape is unchanged from prior versions and embeds notes, people, and submit_your_company_response_data. The optional include= parameter is purely opt-in - when supplied it replaces the default include set with a caller-specified subset; absent the parameter, the legacy default is returned verbatim. fields= narrows top-level columns when supplied.

Parameters

Name In Type Required Description
include query string

Comma-separated list of nested resources to embed. Unknown values
are ignored silently. Allowed values: notes, people, referred_by,
submit_your_company_response_data.

fields query string

Comma-separated list of top-level fields to return. Unknown values
are ignored silently. When fields= is supplied, the response is always narrowed; id and name are always present, and if no supplied keys match the whitelist the response collapses to just {id, name}.

custom_data_points query string

Optional. Controls embedding of a custom_data_points field on
each organization.

- Omit the param entirely to leave custom_data_points out of the
response (default).
- Pass * to embed every account-declared organization_data_points
key (subject to the allow-list).
- Pass a comma-separated list (e.g. key1,key2) to narrow the
embed to that subset. Unknown keys are silently dropped.
- Pass an empty value to embed an explicit empty
custom_data_points object.
- The wildcard always wins, so *,foo behaves identically to
*.

Select-type values are resolved to their human-readable option
labels rather than the underlying stored value. Internal jsonb
keys are never returned.

name query string

Name includes this string (case-insensitive)

created_before query string

Only organizations created on or before this date

created_after query string

Only organizations created on or after this date

page query integer

Page number (0-indexed)

order_by query string

Field to order by:
* first_name
* last_name
* email
* created_at

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

POST /api/v1/organizations Create Organizations

Adds Organizations to your Organizations Directory. Only the first 100 Organizations per request will be processed.The response will have a created, duplicates, and errors array. The created array will contain the emails of the organizations that were created. The duplicates array will contain the emails of the organizations that were not created because they already exist in the database. The errors array will contain the emails of the organizations that were not created because of an error.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

no errors or creations

201

organizations created

400

bad request

ErrorResponse
401

Unauthorized

422

unprocessable entity

ErrorResponse
POST /api/v1/organization Create/Update an Organization

Create or Update an existing Organization. The request can only contain one Organization. A successful request will return a json object containing the success status, the organization_id, and a list of changes in the form of field_name: [old_value, new_value].

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

organization created/updated

400

bad request

401

Unauthorized

GET /api/v1/organizations/{id} Show Organization

Get a single Organization by id. The default response shape is unchanged from prior versions (embeds notes, people, submit_your_company_response_data). The optional include= and fields= parameters are purely opt-in - include= replaces the default include set with a caller-specified subset, and fields= narrows top-level columns. The response also carries a logo object (see schemas/attached_image) with a download url, or null when no logo is attached.

Parameters

Name In Type Required Description
id path integer required

Organization ID

include query string

Comma-separated list of nested resources to embed. Unknown values
are ignored silently. Allowed values: notes, people, referred_by,
submit_your_company_response_data.

fields query string

Comma-separated list of top-level fields to return. Unknown values
are ignored silently. When fields= is supplied, the response is always narrowed; id and name are always present, and if no supplied keys match the whitelist the response collapses to just {id, name}.

custom_data_points query string

Optional. Controls embedding of a custom_data_points field on
the organization.

- Omit the param entirely to leave custom_data_points out of the
response (default).
- Pass * to embed every account-declared organization_data_points
key (subject to the allow-list).
- Pass a comma-separated list (e.g. key1,key2) to narrow the
embed to that subset. Unknown keys are silently dropped.
- Pass an empty value to embed an explicit empty
custom_data_points object.
- The wildcard always wins, so *,foo behaves identically to
*.

Select-type values are resolved to their human-readable option
labels rather than the underlying stored value. Internal jsonb
keys are never returned.

Responses

Status Description Schema
200

organization found

404

not found

401

Unauthorized

POST /api/v1/organizations/{id}/notes Add a note to an organization

Append a plain-text note to an organization. The note is stored on the organization
and surfaced wherever organization notes appear (including the prospect view if the
organization is a pipeline prospect's prospectable).

Parameters

Name In Type Required Description
id path integer required

Organization ID

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

note created

note_envelope
401

Unauthorized

403

Forbidden

404

Organization not found

422

Validation error

GET /api/v1/people List People

Gets a paginated list of People in your People Directory. The response will have a data array with the people and a pagination object with the total count, current page, and total pages.Pages are 0-indexed, so the first page is page 0.The People returned can be filtered and ordered. Order direction is ascending by default. The default response shape is unchanged from prior versions and embeds notes, organizations_with_titles, and referred_by. The optional include= parameter is purely opt-in - when supplied it replaces the default include set with a caller-specified subset; absent the parameter, the legacy default is returned verbatim. fields= narrows top-level columns when supplied.

Parameters

Name In Type Required Description
include query string

Comma-separated list of nested resources to embed. Unknown values
are ignored silently. Allowed values: notes, referred_by, organizations.

fields query string

Comma-separated list of top-level fields to return. Unknown values
are ignored silently. When fields= is supplied, the response is always narrowed; id and name are always present, and if no supplied keys match the whitelist the response collapses to just {id, name}.

custom_data_points query string

Optional. Controls embedding of a custom_data_points field on
each person.

- Omit the param entirely to leave custom_data_points out of the
response (default).
- Pass * to embed every account-declared person_data_points key
(subject to the allow-list).
- Pass a comma-separated list (e.g. key1,key2) to narrow the
embed to that subset. Unknown keys are silently dropped.
- Pass an empty value to embed an explicit empty
custom_data_points object.
- The wildcard always wins, so *,foo behaves identically to
*.

Select-type values are resolved to their human-readable option
labels rather than the underlying stored value. Internal jsonb
keys are never returned.

first_name query string

First name includes this string (case-insensitive)

last_name query string

Last name includes this string (case-insensitive)

email query string

Email address includes this string (case-insensitive)

created_before query string

Only people created on or before this date

created_after query string

Only people created on or after this date

page query integer

Page number (0-indexed)

order_by query string

Field to order by:
* first_name
* last_name
* email
* created_at

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

POST /api/v1/people Create People

Adds People to your People Directory. Only the first 100 People per request will be processed.The response will have a created, duplicates, and errors array. The created array will contain the emails of the people that were created. The duplicates array will contain the emails of the people that were not created because they already exist in the database. The errors array will contain the emails of the people that were not created because of an error.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

no errors or creations

201

people created

400

bad request

401

Unauthorized

422

unprocessable entity

ErrorResponse
POST /api/v1/person Create/Update a person

Create or Update an existing Person. The request can only contain one Person. A successful request will return a json object containing the success status, the person_id, and a list of changes in the form of field_name: [old_value, new_value].

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

person updated

400

bad request

401

Unauthorized

GET /api/v1/people/{id} Show Person

Get a single Person by id. The default response shape is unchanged from prior versions (embeds notes, organizations_with_titles, referred_by). The optional include= and fields= parameters are purely opt-in - include= replaces the default include set with a caller-specified subset, and fields= narrows top-level columns. The response also carries a picture object (see schemas/attached_image) with a download url, or null when no photo is attached.

Parameters

Name In Type Required Description
id path integer required

Person ID

include query string

Comma-separated list of nested resources to embed. Unknown values
are ignored silently. Allowed values: notes, referred_by, organizations.

fields query string

Comma-separated list of top-level fields to return. Unknown values
are ignored silently. When fields= is supplied, the response is always narrowed; id and name are always present, and if no supplied keys match the whitelist the response collapses to just {id, name}.

custom_data_points query string

Optional. Controls embedding of a custom_data_points field on
the person.

- Omit the param entirely to leave custom_data_points out of the
response (default).
- Pass * to embed every account-declared person_data_points key
(subject to the allow-list).
- Pass a comma-separated list (e.g. key1,key2) to narrow the
embed to that subset. Unknown keys are silently dropped.
- Pass an empty value to embed an explicit empty
custom_data_points object.
- The wildcard always wins, so *,foo behaves identically to
*.

Select-type values are resolved to their human-readable option
labels rather than the underlying stored value. Internal jsonb
keys are never returned.

Responses

Status Description Schema
200

person found

404

not found

401

Unauthorized

POST /api/v1/people/{id}/notes Add a note to a person

Append a plain-text note to a person. The note is stored on the person and surfaced
wherever person notes appear (including the prospect view if the person is a pipeline
prospect's prospectable).

Parameters

Name In Type Required Description
id path integer required

Person ID

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

note created

note_envelope
401

Unauthorized

403

Forbidden

404

Person not found

422

Validation error

Tasks 5

GET /api/v1/tasks List Tasks

Returns a paginated, account-scoped list of Tasks. Optional filters narrow by status, assignee, and origin. Pages are 0-indexed. Requires the :hub_tasks feature flag to be enabled for the account; otherwise a 404 is returned.

Parameters

Name In Type Required Description
status query string

Filter by lifecycle status

assignee_id query integer

Filter by assignee user id

origin query string

Filter by task origin

page query integer

Page number (0-indexed)

Responses

Status Description Schema
200

tasks listed

object
401

Unauthorized

404

feature not enabled for this account

POST /api/v1/tasks Create Task

Creates a user-origin Task assigned to a member of the account. The authenticated token's user is recorded as the creator. Requires the :hub_tasks feature flag for the account.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

task created

object
401

Unauthorized

404

feature not enabled, or assignee is not an account member

422

validation failed

ErrorResponse
GET /api/v1/tasks/{id} Get Task

Returns a single account-scoped Task by id.

Parameters

Name In Type Required Description
id path integer required

Responses

Status Description Schema
200

task found

object
401

Unauthorized

404

task not found, or feature not enabled

PATCH /api/v1/tasks/{id} Update Task

Updates a Task's title, description, assignee, due date, or status. Permitted for the task creator, current assignee, account owners/admins, and Decile admins.

Parameters

Name In Type Required Description
id path integer required

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

task updated

object
401

Unauthorized

403

Forbidden

404

task not found, feature not enabled, or assignee not a member

422

validation failed

ErrorResponse
POST /api/v1/tasks/{id}/complete Complete Task

Marks a Task as completed. Permitted for the task creator, current assignee, account owners/admins, and Decile admins.

Parameters

Name In Type Required Description
id path integer required

Responses

Status Description Schema
200

task completed

object
401

Unauthorized

403

Forbidden

404

task not found, or feature not enabled

ResearchInvestors 2

GET /api/v1/research/investors List Decile Research Investors

Lists the shared "Decile Research" LP roster. The same roster is
visible to every authenticated account. The response has a data array
of roster entries and a pagination object with the total count, current
page (0-indexed), and total pages. Each entry carries the research
prospect id (use it with POST /api/v1/research/investors/copy_to_pipeline),
the LP person details, organization name(s), stage name, and probability.

Parameters

Name In Type Required Description
search query string

Case-insensitive filter over LP name, city, country, and organization name.

stage query string

Filter by exact stage name.

column query string

Sort column.

direction query string

Sort direction (ascending by default).

page query integer

Page number (0-indexed).

Responses

Status Description Schema
200

Roster returned

object
400

invalid parameter (e.g. bad sort column or direction)

401

Unauthorized

POST /api/v1/research/investors/copy_to_pipeline Copy Decile Research Investors To Pipeline

Copies selected entries from the shared "Decile Research" LP roster
into one of the caller's own pipeline stages. Supply the research
prospect ids (from GET /api/v1/research/investors) and the target
stage_id (a stage in your account's investor pipeline). Each copy is
processed asynchronously; the response reports how many copies were
enqueued and any ids that did not match the roster.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
202

Copies enqueued

object
401

Unauthorized

403

Forbidden — caller may not add prospects to the target pipeline.

404

Stage not found

422

No valid research prospect ids supplied

PipelineProspects 9

GET /api/v1/pipeline_prospects List Pipeline Prospects

Gets a paginated list of Prospects in a Pipeline. The response has a
data array with the Prospects and a pagination object with the total
count, current page, and total pages. Pages are 0-indexed, so the
first page is page 0. The Prospects returned can be filtered and
ordered. Order direction is ascending by default. Pass
custom_data_points=* (or a narrowed subset) to embed each prospect's
pipeline-declared custom data point values. For Select (Dropdown)
data points, the human-readable option label is returned (not the
underlying stored value).

Parameters

Name In Type Required Description
pipeline_id query string required

Pipeline ID

include query string

Comma-separated list of nested resources to embed. Allowed:
notes, referred_by, assigned, stage, capital_account.
Unknown values are ignored. Default (no include= supplied) embeds
assigned, stage, referred_by, notes. Supplying include=
REPLACES the default set.

capital_account embeds fund/KYC/onboarding details on
closing-pipeline prospects (prospectable_type ==
FirmAdmin::CapitalAccount); the key is omitted for other
prospect types.

fields query string

Comma-separated top-level fields to return. Allowed: id,
last_contact, next_contact, rating, probability,
prospectable_type, prospectable_id, capital_commitment,
created_at, updated_at. Unknown fields are ignored. id and
name are always present.

custom_data_points query string

Optional. Controls embedding of a custom_data_points field on
each prospect.

- Omit the param entirely to leave custom_data_points out of the
response (default).
- Pass * to embed every pipeline-declared custom data point
key (subject to the pipeline allow-list).
- Pass a comma-separated list (e.g. key1,key2) to narrow the
embed to that subset. Unknown keys are silently dropped.
- Pass an empty value to embed an explicit empty
custom_data_points object.
- The wildcard always wins, so *,foo behaves identically to
*.

Select-type values are resolved to their human-readable option
labels rather than the underlying stored value. Internal jsonb
keys (e.g. actionable_url) are never returned.

name query string

Name includes this string (case-insensitive)

created_before query string

Only prospects created on or before this date

created_after query string

Only prospects created on or after this date

updated_before query string

Only prospects updated on or before this date

updated_after query string

Only prospects updated on or after this date

last_contact_before query string

Only prospects last contacted on or before this date

last_contact_after query string

Only prospects last contacted on or after this date

next_contact_before query string

Only prospects with a next contact on or before this date

next_contact_after query string

Only prospects with a next contact on or after this date

stage_name query string

The name of the Pipeline Stage that the Prospect is in includes this string (case-insensitive)

stage_id query string

The ID of the Pipeline Stage that the Prospect is in

stage_before query string

The Prospect is in this stage ID or any stage before it in the pipeline

stage_after query string

The Prospect is in this stage ID or any stage after it in the pipeline

tags query string

The prospect has these tags (comma-separated)

page query integer

Page number (0-indexed)

order_by query string

Field to order by:
* name
* last_contact
* next_contact
* created_at
* updated_at
* stage

order_direction query string

Order direction

Responses

Status Description Schema
200

no errors

400

bad request

404

not found

POST /api/v1/pipeline_prospects Create Pipeline Prospects

Creates Person/Organization pipeline prospects for a given pipeline. Only the first 100 organizations and first 100 people will be processed.A valid request will return a json object with two keys, organizations and people. Each key will have a created, duplicates, and errors array. The created array will contain the names of the prospects that were created. The duplicates array will contain the names of the prospects that were not created because they already exist in the database. The errors array will contain the names of the prospects that were not created because of an error.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

no errors or creations

201

pipeline prospect created

400

bad request

401

Unauthorized

404

not found

422

unprocessable entity

ErrorResponse
PATCH /api/v1/pipeline_prospects Update pipeline prospects

Updates one or more prospects in a pipeline. Send pipeline_id (query or body) and a JSON array prospects.
Each element can identify the prospect by id (preferred), exact name, or for Person prospectables by email.

Stage moves: pass stage_id at the top level and/or per prospect. Omit stage_id to leave the stage unchanged.

Metadata: probability, rating, next_contact, and last_contact can be updated. Send JSON null for
next_contact or last_contact to clear them

Notes: pass note to append a note (same as the single-prospect upsert).

Tags: pass tag_list (comma-separated) to add tags and/or remove_tag_list (comma-separated) to remove tags. Tags not present on a prospect are ignored on removal.

Single prospect: PATCH /api/v1/pipeline_prospects/{id} accepts the same fields without wrapping in prospects.

Parameters

Name In Type Required Description
pipeline_id query string required

Pipeline ID (can also be sent in the JSON body)

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
200

At least one prospect updated. The errors array may be non-empty when some rows failed to
resolve or update while others succeeded. Each error entry contains an error message and,
when available, the originating params or the resolved prospect's id/name.

object
400

bad request

404

Returned when the pipeline itself is not found, when prospects is empty, or when every row
failed to resolve to a matching prospect (so there were no successful updates).

401

Unauthorized

PATCH /api/v1/pipeline_prospects/{id} Update one pipeline prospect

Same fields as the batch PATCH /api/v1/pipeline_prospects body (except prospects). pipeline_id is required
(query or body). The prospect id is taken from the path. Unlike the batch endpoint, this endpoint returns a
singular response shape (no prospects/errors wrapper).

Parameters

Name In Type Required Description
id path string required
pipeline_id query string required

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Prospect updated

object
400

Bad request. Returned when the id in the path is malformed (e.g. not an integer and not a valid
encoded id) or when required parameters are missing.

object
404

Pipeline not found, or no prospect with the given id exists in this pipeline.

object
422

The prospect was resolved but the update failed (for example invalid datetime value).

object
401

Unauthorized

POST /api/v1/pipeline_prospects/{pipeline_prospect_id}/notes Add a note to a pipeline prospect

Append a plain-text note in the context of a pipeline prospect. To match the in-app
behavior, the note is stored against the prospect's prospectable (Person /
Organization) when one exists, falling back to the prospect itself otherwise. When
note.context is omitted, the prospect's pipeline name is used as the context.

Parameters

Name In Type Required Description
pipeline_prospect_id path string required

Pipeline prospect ID (numeric or obscure-encoded)

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

note created

note_envelope
401

Unauthorized

403

Forbidden

404

Pipeline prospect not found

422

Validation error

POST /api/v1/pipeline_prospect Create/Update a Pipeline Prospect

Create or update an existing pipeline prospect in a given pipeline. The request must contain exactly one of
person or organization. On create, stage_id selects the stage. On update, the prospect's stage is
not changed unless you pass apply_stage_id_to_existing: true (then stage_id is applied to an existing
prospect in this pipeline only).

To move stages or update next_contact, probability, rating, or append notes without using this upsert,
prefer PATCH /api/v1/pipeline_prospects (batch) or PATCH /api/v1/pipeline_prospects/{id} (single).

A successful response includes success, pipeline_prospect_id, and changes (field name to [old, new]).

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

pipeline prospect created/updated

400

bad request

401

Unauthorized

404

not found

GET /api/v1/pipeline_prospects/{pipeline_prospect_id}/action_executions List a prospect's pipeline action executions

Lists the PipelineActionExecution rows for a single prospect — i.e. the
actions queued to run (or that have run / been skipped) on this prospect
at its current stage. Each row includes a human-readable description and
a per-type target block with foreign-key names resolved server-side, so
a caller (especially an agent / MCP client) can show the user *what the
action would do* before triggering it.

Defaults to state=pending. Pass state=completed, state=skipped,
or state=all to broaden. The state filter applies to ROOT executions —
children of returned roots are always included regardless of state, so
callers can see what's already been done within an in-progress task.

final_action_for_stage rows (the workflow gate that holds a
prospect at its current stage — not user-pickable) are excluded by
default. Pass include_final=true to include them.

### Response shape

Tree-shaped — data contains only ROOT executions (each represents
one task in the UI), and each root carries a children array with its
subtasks. Subtasks within a root are intended to execute in order.
Roots are ordered by position, then scheduled_at (NULLs last);
children are ordered by position within their parent.

- prospect: { id, name, stage_id, stage_name } envelope so the caller
knows the prospect's current stage in the same round-trip.
- data: array of root executions. Each row:
- id (string) — execution id (integer rendered as string).
- state — one of pending, completed, skipped.
- action_type — one of the 15 PipelineAction types
(send_email, move_to_stage, assign_user, apply_tag,
set_variable, record_task_completed, chat, execute_job,
copy_to_pipeline, final_action_for_stage,
move_to_stage_from_date_cell, base_post_reply,
start_questionnaire, create_user_notification).
- description — human-readable summary, e.g. "Send email Welcome",
"Change stage to Qualified", "Apply tag Lead". Plaintext (no
<em> tags).
- scheduled_at — ISO8601 or null.
- automate — boolean; whether the periodic worker will fire this
without manual completion.
- action_id — id of the source PipelineAction template (may be
null if the template was deleted; type is denormalised on the
execution and survives template deletion).
- parent_idnull on root rows, set to the parent root's id on
children (children appear inside their root's children array, but
still carry parent_id so flat traversals see the link).
- target — type-specific resolved payload (see below). May be
null for types with no resolvable target.
- next_pending_id (root rows only) — id of the next leaf the
caller should pass to the execute endpoint (first pending child
in position order, else the root if it's still pending, else
null). Mirrors the UI's "next" leaf. Prefer this over the
root's own id when the root has pending children: executing a
root with pending children CASCADES — the worker runs every
child in order then the root, in one call, with no per-subtask
note prompt. Walking via next_pending_id mirrors the UI's
per-subtask flow.
- children (root rows only) — array of child rows with the same
shape (minus their own children and next_pending_id).

### Per-type target shape

| action_type | target keys |
| --- | --- |
| send_email | email_template_id, email_template_name |
| move_to_stage | stage_id, stage_name |
| final_action_for_stage | stage_id, stage_name (omitted/blank stage_id means "hold at this stage") |
| move_to_stage_from_date_cell | stage_id, stage_name |
| assign_user | assignee_id, assignee_name |
| apply_tag | tag |
| set_variable | variable_name, value, use_today |
| execute_job | job_class (raw class name; review before triggering) |
| copy_to_pipeline | pipeline_id, pipeline_name |
| chat | chat_agenda_id, chat_agenda_name |
| record_task_completed | task_description |
| base_post_reply | reply_text (truncated to 200 chars) |

Other action_type values currently return null for target.

Parameters

Name In Type Required Description
pipeline_prospect_id path string required

Pipeline prospect id.

state query string

Filter ROOT executions by state. Defaults to pending. Pass all
to return roots in every state. Children of returned roots are
always included regardless of state.

include_final query boolean

When true, include final_action_for_stage rows. Default false.

Responses

Status Description Schema
200

ok

400

invalid state value

ErrorResponse
401

unauthorized (missing/invalid API token)

ErrorResponse
403

forbidden

ErrorResponse
404

prospect not found in the token's account

ErrorResponse
POST /api/v1/pipeline_prospects/{pipeline_prospect_id}/action_executions/{id}/execute Execute a single pipeline action execution

Executes one PipelineActionExecution for the prospect — sends the
templated email, moves the stage, applies the tag, runs the configured
background job, etc., according to the execution's action_type and
snapshotted data, then advances any chained automated actions.

The action runs as authored. This endpoint only triggers an
existing pending execution. An optional note body field is honored
for record_task_completed actions (attached when marking the task
complete) — see the request body below. Other
body fields are silently dropped.

One execution per call. This endpoint deliberately does not loop or
bulk-execute — agent / MCP callers are expected to list pending
executions, surface each action's resolved description to the user,
and call this endpoint per confirmed action.

Idempotency: if the execution is already completed or skipped,
returns 422 with code: already_finalized. Validation gates or
missing prerequisites surface as 422 with
code: action_execution_error.

Response shape mirrors GET /action_executions: a prospect
envelope (so callers see the resulting stage_id / stage_name if
the action transitioned the prospect) plus a single execution
object with the post-execute state, resolved description, and
per-type target block (see the GET endpoint for the per-type
target table).

Parameters

Name In Type Required Description
pipeline_prospect_id path string required

Pipeline prospect id.

id path string required

PipelineActionExecution id.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

ok

401

unauthorized (missing/invalid API token)

ErrorResponse
403

forbidden

ErrorResponse
404

prospect or execution not found in the token's account

ErrorResponse
422

Execution already completed/skipped (code: already_finalized) or
worker rejected the action (code: action_execution_error).

ErrorResponse
POST /api/v1/pipeline_prospects/{pipeline_prospect_id}/action_executions/{id}/preview Preview a pending send_email action execution

Renders the would-be sent email for a pending send_email
PipelineActionExecution — substitutes variables, resolves cc/bcc,
and reports unresolved variables / blocker warnings — without
sending or mutating the execution. The recipient is fixed to the
prospect that owns the execution; you can override the email body,
subject, cc/bcc, attachments, scheduled_at, the from-actor, the
template, and custom_substituted_variables at preview time.

Defaults come from the execution's persisted
data[:pipeline_email_content]
(the authored content snapshot).
Any override key you submit replaces the corresponding persisted
value for this preview only — nothing is written back to the
execution. Override keys are flat at the top level of the request
body (mirrors POST /api/v1/emails/preview), not nested under a
wrapper.

cc / bcc semantics: absent → fall back to the execution's
persisted cc/bcc. Explicit [] clears (distinct from absent).
Accepted entry shapes mirror POST /api/v1/emails/preview: raw
email string, {person_id: "..."}, or
{internal_user_id: <numeric_id>}. Malformed entries return 422
invalid_recipient_format.

Non-send_email actions return 422 unsupported_action_type.
Use GET /api/v1/pipeline_prospects/{id}/action_executions to
confirm the action_type first.

Response mirrors POST /api/v1/emails/preview plus a
pipeline_action_execution block carrying the execution id,
state, and resolved description.

Parameters

Name In Type Required Description
pipeline_prospect_id path string required

Pipeline prospect id.

id path string required

PipelineActionExecution id.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Preview envelope.

401

unauthorized (missing/invalid API token)

ErrorResponse
404

prospect or execution not found in the token's account

ErrorResponse
422

Action is not send_email (code: unsupported_action_type), or
a recipient list entry was malformed (code:
invalid_recipient_format
).

ErrorResponse

Pipelines 4

GET /api/v1/pipelines List pipelines for the current account

Returns the active pipelines for the current account. Pass
kind=investor to filter to investor pipelines. Rows are ordered
with the account's primary investor pipeline first (when one is
marked); prefer the is_primary: true row when multiple investor
pipelines exist. The id field is the value to pass to any
pipeline-scoped endpoint (e.g. /api/v1/pipeline_prospects?pipeline_id=…).

Parameters

Name In Type Required Description
kind query string

Optional pipeline-type filter. Unknown values return 422.

Responses

Status Description Schema
200

Pipelines found

array<object>
401

Unauthorized

422

Unknown kind value

object
GET /api/v1/pipelines/{id} Retrieves info for a specific pipeline

Returns basic information for a specific pipeline and its stages.

Parameters

Name In Type Required Description
id path string required

Responses

Status Description Schema
200

Pipeline found

object
401

Unauthorized

GET /api/v1/pipelines/{id}/metrics Pipeline metrics — current state + 7-day-ago snapshot

Returns aggregate counts/values for a pipeline plus a 7-days-ago
snapshot for week-over-week deltas. The caller is expected to
compute deltas in its prose layer.

Parameters

Name In Type Required Description
id path string required

Responses

Status Description Schema
200

ok

object
401

Unauthorized

404

pipeline not found or out of account scope

POST /api/v1/pipelines/{pipeline_id}/data_points Create a custom data point for a pipeline type (account-wide fan-out)

Create a custom data point (Variable) on the account, scoped to the type of the targeted pipeline (investor / company / etc). Data points are not attached to a single pipeline — they live at the account level under a type-specific context (e.g. investor_data_points, company_data_points). The pipeline_id in the path is used only to derive that type context. When add_as_column: true, the resulting kanban column is fanned out to every pipeline of that type in the account, not just the targeted pipeline (this matches the UI behavior). Account admin authorization is required (account admins, or decile admins acting on the account). The select format requires a non-empty select_options array.

Parameters

Name In Type Required Description
pipeline_id path string required

Obscure ID of any pipeline of the desired type. Used to derive the data point's type context (investor / company / etc). The data point applies to the account and, when add_as_column is true, fans out as a column to all pipelines of this type in the account — not just this one.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

Data point created

object
400

Request body missing the data_point wrapper

ErrorResponse
401

Unauthorized

ErrorResponse
403

Forbidden (caller is not an account admin or decile admin for the account)

ErrorResponse
404

Pipeline not found

ErrorResponse
422

Validation failed (missing/invalid name, unknown format, or select format with empty select_options)

ErrorResponse

Deal Shares 6

POST /api/v1/deals/share Create or update a Deal Share

Share a deal from the caller's account into the network feed. Idempotent per organization: if a Deal Share already exists for the given organization in the caller's account its attributes are updated; otherwise a new record is created. The target organization must belong to the caller's account — use POST /api/v1/organization to create or upsert one first. Pass selected_files to attach existing org / deal-memo / term-sheet files the caller account owns; foreign or unknown ids are skipped. The response attachments list confirms what was attached.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

Deal Share created

200

Existing Deal Share updated

400

Request body missing deals_share wrapper

401

Unauthorized

404

Organization not found (not in caller's account)

422

Validation failed (missing required field or invalid value)

GET /api/v1/deals/shares List the deal shares submitted by the current account

Returns the deal shares the caller's account has submitted into the network feed.
Each row carries the full submission attributes plus the computed stage.

Filter with search, industry, stage, and round. Sort with column +
direction. Pagination is keyset — pass pagination.next_page_token from a
response back as page_token= to fetch the next page.

Parameters

Name In Type Required Description
search query string

Free-text match over company_name, short_description, region, and country_address.

industry query string

Filter to shares tagged with this industry.

stage query string

Computed stage bucket filter.

round query string

Funding round filter (e.g. seed, a, b).

column query string

Sort column. Unknown columns fall back to company_name.

direction query string

Sort direction. Sending anything other than asc/desc returns 400.

page_token query string

Opaque keyset cursor returned by a previous call as pagination.next_page_token.

per_page query integer

Page size. Capped at 100; defaults to 25.

Responses

Status Description Schema
200

paginated list of the caller account's deal shares

object
400

invalid parameter

ErrorResponse
401

Unauthorized

403

Forbidden

GET /api/v1/deals/shares/{id} Get a single deal share owned by the current account

Returns one deal share submitted by the caller's account, with the full
submission attributes and the computed stage. Returns 404 if the share
does not belong to the caller's account.

Parameters

Name In Type Required Description
id path integer required

Deal share id.

Responses

Status Description Schema
200

The deal share

DealShareDetail
401

Unauthorized

403

Forbidden

404

Not found

ErrorResponse
DELETE /api/v1/deals/shares/{id} Delete a deal share owned by the current account

Permanently deletes a deal share owned by the caller's account. The lookup
is scoped to the caller's account, so an unknown id or one belonging to
another account returns 404 and deletes nothing. This action cannot be undone.

Parameters

Name In Type Required Description
id path integer required

Deal share id.

Responses

Status Description Schema
200

The deal share was deleted

401

Unauthorized

403

Forbidden

404

Not found

ErrorResponse
POST /api/v1/deals/shares/{id}/copy_to_pipeline Copy a shared deal into a pipeline stage

Copy a network-feed shared deal into one of the caller account's pipeline stages. Creates (or reuses) an organization in the caller's account and adds it as a prospect to the given stage, asynchronously. The pipeline_stage_id MUST belong to the caller's account. Requires the caller account's shared deal feed to be unlocked (deal_sharing_unlocked_until present and in the future); decile admins and full-access account admins bypass that gate.

Parameters

Name In Type Required Description
id path string required

Deals::Share id from the network feed

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
202

Copy accepted and enqueued

401

Unauthorized

403

Shared deal feed locked for the caller account

404

Deal share not found in the network feed, or pipeline stage not in the caller's account

POST /api/v1/deals/shares/ai_auto_fill AI auto-fill enrichment for a deal share

Run AI auto-fill enrichment for a deal share. Given an organization in the caller's account and a list of deal-share form field names, the model reasons over the data Hub already holds (organization profile, deal memos, notes, documents) and returns suggested values for those fields. The organization MUST belong to the caller's account. The call runs the LLM synchronously, so response latency tracks the model call. Field names use the form-input shape, e.g. deals_share[region] or deals_share[industry_list][].

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Enrichment completed

401

Unauthorized

404

Organization not found in the caller's account

422

Enrichment failed (e.g. the AI response could not be parsed)

Deal Memos 6

GET /api/v1/deal_memos List deal memos for the current account

Returns a paginated list of deal memos belonging to the caller's
account. Each row is a compact summary suitable for triage; use
GET /api/v1/deal_memos/{id} for the full payload (counterfactual,
ratings, links, question answers).

Pagination is keyset — pass pagination.next_page_token from a
response back as page_token= to fetch the next page.

Parameters

Name In Type Required Description
organization_id query integer

Filter to deal memos for a specific organization id.

stage query string

Filter to a single stage (active, review, ic_review, ic_review_submitted, ic_pre_approved, ic_approved, closed).

page_token query string

Opaque keyset cursor returned by a previous call as pagination.next_page_token.

per_page query integer

Page size. Capped at 100; defaults to 25.

Responses

Status Description Schema
200

paginated list of deal memos

object
401

Unauthorized

403

Forbidden

422

Invalid stage filter

POST /api/v1/deal_memos Start a Deal Memo

Start a new deal memo for an organization in the caller's account. The config template is resolved automatically from the account's latest deal memo config. Fails with 422 if the organization already has a non-closed deal memo. The target organization must belong to the caller's account. Set copy_last_deal_memo to true to clone the organization's most recent closed deal memo instead of starting a blank one. File attachments are not supported via the API.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
201

Deal Memo created

400

Request body missing deal_memo wrapper or organization_id

401

Unauthorized

403

Caller cannot manage investments for this account

404

Organization not found (not in caller's account)

422

Validation failed, or the organization already has a non-closed deal memo

GET /api/v1/deal_memos/{id} Get a single Deal Memo by id

Returns the full deal memo payload — organization, counterfactual,
links, ratings summary, and question answers — for an agent to inspect
before acting on the memo. Attachments, due-diligence tasks, and
comments are not included; fetch them via their own endpoints.

Parameters

Name In Type Required Description
id path string required

Deal Memo id.

Responses

Status Description Schema
200

the deal memo

object
401

Unauthorized

403

Forbidden

404

Deal Memo not found in caller's account

ErrorResponse
PATCH /api/v1/deal_memos/{id} Update a Deal Memo

Update an existing deal memo in the caller's account. Rejects updates with 422 when the deal memo is closed. Does not modify ratings, answers, attachments, or due-diligence tasks.

Parameters

Name In Type Required Description
id path string required

ID of the Deal Memo to update

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Deal Memo updated

400

Request body missing deal_memo wrapper

401

Unauthorized

403

Caller cannot manage investments for this account

404

Deal Memo not found in caller's account

422

Validation failed, or the deal memo is closed

POST /api/v1/deal_memos/{id}/submit_for_review Submit a Deal Memo for review

Submit a deal memo for review by Decile Hub. Requires the account to have the Deal Memo Review product enabled (returns 422 otherwise). Optionally attach a submission comment via submission_comment.content.

Parameters

Name In Type Required Description
id path string required

ID of the Deal Memo to submit for review

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Deal Memo submitted for review

401

Unauthorized

403

Caller cannot manage investments for this account

404

Deal Memo not found in caller's account

422

Account does not have the Deal Memo Review product enabled, or validation failed

POST /api/v1/deal_memos/{id}/close Close a Deal Memo

Close a deal memo with an outcome of approve or pass. Moves the underlying prospect to the configured pipeline stage and dispatches the close notification.

Parameters

Name In Type Required Description
id path string required

ID of the Deal Memo to close

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Deal Memo closed

401

Unauthorized

403

Caller cannot manage investments for this account

404

Deal Memo not found in caller's account

422

close_type missing or invalid, or validation failed

PortfolioCompanies 4

GET /api/v1/portfolio_companies List portfolio companies for the current account

Returns portfolio companies across every fund in the current account.
Each row is a (fund, organization) pair — the fund's stake in a single
underlying company. Filter by fund_id or organization_id.

Pagination is keyset — pass pagination.next_page_token from a response
back as page_token= to fetch the next page.

Parameters

Name In Type Required Description
fund_id query integer

Filter to a single fund_detail id (firm_admin_fund_details.id).

organization_id query integer

Filter to portfolio companies for a specific organization id.

page_token query string

Opaque keyset cursor returned by a previous call as pagination.next_page_token.

per_page query integer

Page size. Capped at 100; defaults to 25.

fields query string

Comma-separated top-level fields to return. Always returns at least id and name. Unknown fields are ignored.

Responses

Status Description Schema
200

paginated list of portfolio companies

object
401

Unauthorized

403

Forbidden

GET /api/v1/portfolio_companies/{id} Get a single portfolio company by id

Returns one portfolio company — the same allowlisted fields surfaced by
GET /api/v1/portfolio_companies.

Parameters

Name In Type Required Description
id path integer required

Portfolio company id.

fields query string

Comma-separated top-level fields to return. Always returns at least id and name. Unknown fields are ignored.

Responses

Status Description Schema
200

the portfolio company

PortfolioCompany
401

Unauthorized

403

Forbidden

404

Not found

ErrorResponse
GET /api/v1/portfolio_companies/{portfolio_company_id}/investments List investments for a portfolio company

Returns the investments (accounting-transaction-driven tranches) belonging
to a single portfolio company. Each row represents one investment tranche
with share counts and timestamps.

Pagination is keyset — pass pagination.next_page_token from a response
back as page_token= to fetch the next page.

Parameters

Name In Type Required Description
portfolio_company_id path integer required

Portfolio company id.

page_token query string

Opaque keyset cursor returned by a previous call as pagination.next_page_token.

per_page query integer

Page size. Capped at 100; defaults to 25.

fields query string

Comma-separated top-level fields to return. Always returns at least id. Unknown fields are ignored.

Responses

Status Description Schema
200

paginated list of investments

object
401

Unauthorized

403

Forbidden

404

Portfolio company not found in current account

ErrorResponse
GET /api/v1/portfolio_company_investments/{id} Get a single portfolio company investment

Returns a single investment tranche (accounting-transaction-driven) on a portfolio
company, with applied overrides resolved.

The response combines the column allowlist exposed by
list_portfolio_company_investments (id, parent FKs, shares, shares_decimal,
ignore_for_fmv_calc, tax_born_on, timestamps) with a fixed set of computed/resolved
fields: effective_shares, effective_tax_born_date, price_per_share,
transaction_amount (cost basis with write-off and convertible-debt conversion
applied), and transaction_at.

Raw admin levers (override_fmv*, override_investment_on, legal_cost_per_share,
write_off_investment*, convertible_debt_new_cost) are intentionally hidden — the
computed fields encode their resolved effect.

Parameters

Name In Type Required Description
id path integer required

Portfolio company investment id.

fields query string

Comma-separated top-level fields to return. Addresses both column fields and computed fields. Always returns at least id. Unknown fields are ignored.

Responses

Status Description Schema
200

a single investment with applied overrides resolved

PortfolioCompanyInvestmentDetail
401

Unauthorized

403

Forbidden

404

Investment not found in current account

ErrorResponse

Pacts 1

POST /api/v1/pacts/send_pact Send a PACT email to a Person

Mirrors the UI "Send PACT" button. Adds or moves the Person onto the investor pipeline's Send PACT stage, finds the configured PACT email template, and sends it. pipeline_id is required only when the account has more than one investor pipeline.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

PACT email dispatched

400

pipeline_id required when multiple investor pipelines exist

401

Unauthorized

403

Caller lacks access to the investor pipeline

404

Person or pipeline not found

422

Pipeline is not an investor pipeline, or PACT stage / email template not configured

Lpas 1

POST /api/v1/lpas/send_lpa Send an LPA email to a Person

Mirrors the UI "Send LPA" button. Resolves the target investor pipeline and its linked closing pipeline, moves the Person onto the investor pipeline's Closing stage, creates or finds their capital account on the fund, seats the closing-pipeline prospect on the Send LPA / Send questionnaire stage, finds the configured LPA email template, and sends it. pipeline_id is required only when the account has more than one investor pipeline. The returned pipeline_prospect_id refers to the closing-pipeline prospect (capital account), not the investor-pipeline prospect.

Request body

Content-Type Schema
application/json object

Responses

Status Description Schema
200

LPA email dispatched

400

pipeline_id required when multiple investor pipelines exist

401

Unauthorized

403

Caller lacks access to the investor pipeline

404

Person or pipeline not found

422

Pipeline is not an investor pipeline; no closing pipeline / fund linked; no LPA email template or target stage configured

Base 7

GET /api/v1/base/inbox List Decile Base inbox items

Returns the authenticated user's Decile Base inbox — a paginated, time-ordered feed of posts and replies they are subscribed to or mentioned in. Available to any API token with Base access. When channel_id is supplied, the token's user must have access to that channel.

Parameters

Name In Type Required Description
page query integer

Page number (1-indexed)

per_page query integer

Items per page (1–100, default 50)

channel_id query integer

Restrict results to a single Base channel ID

exclude_channel_ids query string

Comma-separated list of channel IDs to exclude

since query string (date-time)

ISO 8601 datetime — only items created/updated on or after this time

user_ids query string

Comma-separated list of user IDs to filter by author

Responses

Status Description Schema
200

inbox returned

400

bad request (e.g. invalid since parameter)

ErrorResponse
401

Unauthorized — token missing, invalid, or expired

403

Forbidden — token lacks necessary Base access

ErrorResponse
GET /api/v1/base/channels List accessible Decile Base channels

Lists Base channels the authenticated user can see. Available to any API token with Base access. Returns the user's accessible question and conversation channels.

Parameters

Name In Type Required Description
exclude_channel_ids query string

Comma-separated list of channel IDs to exclude from the response

Responses

Status Description Schema
200

channels returned

401

Unauthorized

403

Forbidden — token lacks Base access

ErrorResponse
POST /api/v1/base/posts Create a Decile Base post

Creates a new post in a Base channel. The content is parsed as Markdown and stored as rich text. Available to any API token with Base access; the acting user must also be authorized for the target channel. The post is always attributed to the user who owns the API token; impersonation is not supported.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

post created

400

missing required parameters

ErrorResponse
401

Unauthorized

403

Forbidden — token lacks Base write access, or user cannot post to channel

ErrorResponse
404

channel not found

ErrorResponse
422

validation failed

ErrorResponse
GET /api/v1/base/posts/{id} Show a Decile Base post

Returns a single Base post with its full thread of replies (ordered by creation time). Available to any API token with Base access; the acting user must also be authorized to view the post.

Parameters

Name In Type Required Description
id path integer required

Base post ID

Responses

Status Description Schema
200

post returned

401

Unauthorized

403

Forbidden — token lacks Base access, or user cannot view post

ErrorResponse
404

post not found

ErrorResponse
POST /api/v1/base/replies Create a Decile Base reply

Creates a reply to an existing Base post. The content is parsed as Markdown and stored as rich text. Available to any API token with Base access; the acting user must also be authorized to view the parent post. The reply is always attributed to the user who owns the API token; impersonation is not supported.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
201

reply created

400

missing required parameters

ErrorResponse
401

Unauthorized

403

Forbidden — token lacks Base write access, or user cannot reply

ErrorResponse
404

parent post not found

ErrorResponse
422

validation failed

ErrorResponse
POST /api/v1/base/search Search Decile Base posts and articles

Full-text search across Base posts (and Decile knowledge-base articles) via OpenSearch. Available to any API token with Base access. Searches the user's standard accessible channels and their child channels. Article results are suppressed when channel_ids is supplied.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
200

search results returned

400

missing search_term

ErrorResponse
401

Unauthorized

403

Forbidden — token lacks Base write access

ErrorResponse
GET /api/v1/base/attachments/{id} Download a Decile Base attachment

Downloads an Active Storage blob attached to a Base post or reply. The id is the signed blob ID returned by other Base endpoints (see the attachments array on inbox items). Available to any API token with Base access; the acting user must additionally be authorized to view at least one parent Base record the blob is attached to. Files larger than 50 MB respond with a 302 redirect to a short-lived (5 minute) pre-signed storage URL; smaller files are streamed inline as application/octet-stream with a Content-Disposition of attachment.

Parameters

Name In Type Required Description
id path string required

Signed Active Storage blob ID

Responses

Status Description Schema
200

file streamed inline (blobs ≤ 50 MB)

string (binary)
302

redirect to pre-signed download URL (blobs > 50 MB)

401

Unauthorized

403

Forbidden — token lacks Base access, or user cannot access blob

ErrorResponse
404

blob not found, signature invalid/expired, or file missing in storage

ErrorResponse

Emails 4

GET /api/v1/email_templates List email templates for the account

Returns email templates visible to the authenticated account, ordered
by id ascending and paginated 50 per page (0-indexed page param).
Optionally filter by pipeline_id to restrict to templates authored
on a specific pipeline. Use this to discover the email_template_id
you'll pass to POST /api/v1/emails/preview,
POST /api/v1/emails, or as a send_email action data override.

Each list row carries enough to render a picker (name, pipeline,
attachment count, admin/internal-only flags); use
GET /api/v1/email_templates/{id} for the full subject/body and
variable schema.

Parameters

Name In Type Required Description
pipeline_id query string

Restrict to templates authored on this pipeline.

page query integer

Page number (0-indexed). Page size is 50.

Responses

Status Description Schema
200

ok

401

unauthorized (missing/invalid API token)

ErrorResponse
GET /api/v1/email_templates/{id} Retrieve a single email template

Returns the full template — index fields plus rendered (HTML)
rich_subject / body, the resolved variables schema (each entry
carries name and a required flag — custom.* variables are the
ones callers must supply via custom_substituted_variables when
previewing/sending), and any attachments (id, filename, byte
size). Cross-account ids return 404.

Parameters

Name In Type Required Description
id path string required

Email template id.

Responses

Status Description Schema
200

ok

401

unauthorized (missing/invalid API token)

ErrorResponse
404

Template not found in the token's account.

ErrorResponse
POST /api/v1/emails/preview Preview a templated or freeform email before sending

Resolves the target recipient, renders the chosen template (or
freeform subject/body), substitutes variables, and reports
unresolved variables / blocker warnings — without sending. Use this
to surface the would-be email to a human (or agent) for
confirmation before calling POST /api/v1/emails.

Target resolution: pass exactly one of
pipeline_prospect_id, person_id, organization_id, or
to_email. Zero or multiple targets returns 422 (missing_target
/ multiple_targets). For person_id / organization_id /
to_email targets, pipeline resolves in priority order:
email_template_id's pipeline → explicit pipeline_id
account default pipeline (connector → investor).
Pass pipeline_id explicitly when the template is absent and
you need the variable / actor scope to come from a specific
pipeline. For pipeline_prospect_id the pipeline is derived
from the prospect, and an explicit pipeline_id that doesn't
match returns 422 mismatched_pipeline.

cc / bcc — array of: raw email strings
("alice@example.com"), {"person_id": "..."} (account Person →
email), or {"internal_user_id": <numeric_id>} (account user →
email). Anything else returns 422 invalid_recipient_format.

Response envelope: recipient (resolved person/email),
from (the API token's user), cc / bcc (normalized email
strings), rendered (subject + body html/text), template
(id/name/pipeline/admin-only), variables
(resolved / unresolved with reason), attachments (template +
prospect-auto + signed-id uploads, tagged by source), warnings
(blocker codes — recipient_missing_email,
decile_admin_only_template, etc.), and ready_to_send (true
only if no blockers and no unresolved variables).

Cross-account targets (a person_id / organization_id /
pipeline_prospect_id not visible to the token's account) return
404.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Preview envelope.

401

unauthorized (missing/invalid API token)

ErrorResponse
404

Target person / organization / prospect not in the token's account.

ErrorResponse
422

Target resolution failed (missing_target, multiple_targets,
mismatched_pipeline) or a cc/bcc entry was malformed
(invalid_recipient_format).

ErrorResponse
POST /api/v1/emails Compose and send (or schedule, or test-send) an email

Sends the previewed email. Request body is identical to
POST /api/v1/emails/preview PLUS a required confirm: true
acknowledgement, plus an optional test_email_to_addresses array
for test-sends.

Two-step flow. Always call POST /api/v1/emails/preview first
and surface the envelope (especially warnings, variables.unresolved,
recipient.missing_email) to a human or agent. Only call this
endpoint once the preview's ready_to_send is true (or after
supplying any missing custom_substituted_variables). Submitting
without confirm: true returns 422 confirmation_required — by
design, to prevent accidental sends.

Send modes (status in response):
- sent — default; dispatched immediately. delivered_at is the
PipelineEmail.created_at ISO 8601.
- scheduled — set when scheduled_at is supplied. scheduled_at
in the response echoes the scheduled time.
- test_sent — set when test_email_to_addresses is non-empty.
The recipient is unchanged but the actual delivery goes to the
test addresses; the prospect record is not persisted as a
side effect (the synthesized-recipient persistence step is
skipped). Use for sanity-checks during template authoring.

Server-side blockers (before the send is attempted) surface
as 422 with the matching preview-blocker code:
unresolved_variables, recipient_missing_email,
decile_admin_only_template. All preview-time errors
(missing_target, multiple_targets, mismatched_pipeline,
invalid_recipient_format) apply here too.

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
200

ok

401

unauthorized (missing/invalid API token)

ErrorResponse
404

Target person / organization / prospect not in the token's account.

ErrorResponse
422

confirmation_required (missing confirm: true),
unresolved_variables, recipient_missing_email,
decile_admin_only_template, plus all preview-time codes
(missing_target, multiple_targets, mismatched_pipeline,
invalid_recipient_format).

ErrorResponse

Variables 2

GET /api/v1/variables List firm variables

Returns the variable picker for a pipeline + the authenticated
user. Mirrors exactly what the user sees in the email composer's
variable list — same per-user policy filtering.

The display_format field is the merge-tag form (e.g.
email.fund_thesis, sender.name) that gets wrapped in {{...}}
inside an email template body. select_options is only present
when format_name == "Select (Dropdown)". The id is opaque —
treat it as a string and pass it back to
GET /api/v1/variables/{id} to look up a single row.

Parameters

Name In Type Required Description
pipeline_id query string required

Pipeline id (obscure or numeric). Required — variables are scoped per pipeline and per user.

page query integer

0-indexed page number. Page size is 50.

Responses

Status Description Schema
200

Variables found

object
400

Bad request (pipeline_id missing)

401

Unauthorized

404

Pipeline not found

GET /api/v1/variables/{id} Show a single variable

Returns a single variable from the pipeline's picker for the
authenticated user. The id path parameter is the value returned
by GET /api/v1/variables; treat it as opaque. Unknown ids,
variables not surfaced in the user's picker, and variables not
accessible to the authenticated account return 404.

Parameters

Name In Type Required Description
id path string required

Variable id as returned by the list endpoint.

pipeline_id query string required

Pipeline id (obscure or numeric). Required — variables are scoped per pipeline and per user.

Responses

Status Description Schema
200

Variable found

variable
400

Bad request (pipeline_id missing)

401

Unauthorized

404

Not found

agent_platform 1

POST /api/v1/agent_platform/file_search Semantic search across the caller's account corpus

Returns ranked chunks from the caller account's data room + any
in-message conversation-scoped chunks the caller can read.
Optional conversation_id filter restricts results to that
conversation (caller must have access to it).

Request body required

Content-Type Schema
application/json object

Responses

Status Description Schema
200

Matches array

400

Input validation failed

401

Missing or invalid ApiToken

403

Caller lacks access to the requested conversation_id filter

Schemas

attached_image object

An attached image (Person picture / Organization logo). Null when no image is attached. url is a signed ActiveStorage download link to the original file.

Property Type
url string
content_type string
byte_size integer
filename string

PortfolioCompany object

A fund's stake in a single underlying organization.

Property Type
id integer
name string
organization_id integer
firm_admin_fund_details_id integer
entity_type string
initial_investment_date string (date)
investment_thesis string
reserve_consumed string
board_representation object
exit_strategy object
legal_name string
display_legal_name string
created_at string (date-time)
updated_at string (date-time)

PortfolioCompanyInvestment object

One investment tranche on a portfolio company, driven by an underlying accounting transaction.

Property Type
id integer
firm_admin_portfolio_companies_id integer
firm_admin_accounting_transactions_id integer
shares integer
shares_decimal string
ignore_for_fmv_calc boolean
tax_born_on string (date)
created_at string (date-time)
updated_at string (date-time)

PortfolioCompanyInvestmentDetail object

A single investment tranche on a portfolio company with applied overrides resolved.
Combines the PortfolioCompanyInvestment column allowlist with computed/resolved
fields. Sparse fields= can address either group.

Property Type
id integer
firm_admin_portfolio_companies_id integer
firm_admin_accounting_transactions_id integer
shares integer
shares_decimal string
ignore_for_fmv_calc boolean
tax_born_on string (date)
created_at string (date-time)
updated_at string (date-time)
effective_shares string
effective_tax_born_date string (date)
price_per_share string
transaction_amount string
transaction_at string (date-time)

ActivityEntry object

Property Type
id integer
name string
subject_type string
subject_id integer
entryable_type string
user_id integer
account_id integer
origin string
created_at string (date-time)
entryable object

ActivityEntryDetail object

Single activity entry returned by GET /api/v1/activity_entries/{id}, including the full entryable body.

Property Type
id integer
name string
subject_type string
subject_id integer
entryable_type string
entryable_id integer
user_id integer
account_id integer
origin string
created_at string (date-time)
entryable object

DealShare object

A deal share submitted by the caller's account into the network feed.

Property Type
id integer
organization_id integer
company_name string
the_bet string
referring_manager_name string
referring_manager_email string
founder string
short_description string
region string
country_address string
company_email string
deck_url string
round string
anticipated_close_date string (date)
why string
investor_role string
deal_source string
traction_metrics string
amount_raising number
deal_terms string
valuation number
industry_list array<string>
stage string
created_at string (date-time)
updated_at string (date-time)

DealShareList object

Property Type
data array<DealShare>

DealShareDetail object

Property Type
data DealShare

PipelineMetricsSnapshot object

Property Type
total_prospects integer
by_stage object
committed_amount integer
weighted_pipeline integer
as_of string (date-time)

note_envelope object

Property Type
data object

ErrorResponse object

Property Type
error object

Entity object

Identity block returned by GET /api/v1/entities (list) and as the outer object on GET /api/v1/entities/{id} (show). Show responses also include a details key (see EntityDetails).

Property Type
id integer
name string
kind string
currency string
fiscal_year_end string
is_active boolean

EntityDetails object

Detail block on GET /api/v1/entities/{id}. gp_carry, new_management_fee_system_cutover_date, and new_carry_system_cutover_date are only present when the entity is a fund (kind=fund, spv, or holding).

Property Type
currency string
currency_symbol string
fiscal_year_end string
entity_name string
logo_url string
is_active boolean
kind string
gp_carry number (double)
new_management_fee_system_cutover_date string (date)
new_carry_system_cutover_date string (date)
thesis string
target_fund_size integer
description string
news string
deck_url string
cap_table_link string
effective_date string (date)
first_close_date string (date)
fund_life_years number (double)

EntityShowResponse object

Combined identity + details payload returned by GET /api/v1/entities/{id}, POST /api/v1/entities, and PATCH /api/v1/entities/{id}. The calculations block is only present on the GET endpoint when ?include=calculations is supplied.

EntityCreateRequest object

Request body for POST /api/v1/entities. kind and name are required;
all other fields are optional. Fund-only fields (everything below
is_active) are accepted only when kind is fund, spv, or
holding; sending them on a non-fund kind returns 422.

Property Type
kind string
name string
is_active boolean
fiscal_year_end string
gp_carry string
thesis string
target_fund_size integer
description string
news string
deck_url string
cap_table_link string
effective_date string (date)
first_close_date string (date)
fund_life_years number

EntityUpdateRequest object

Request body for PATCH /api/v1/entities/{id}. All fields are optional;
only fields explicitly sent are applied. kind, if present, MUST match
the entity's current kind (sending a differing value returns 422) — the
entity kind is immutable post-create. Fund-only fields are rejected
with 422 when the target entity is a management_company or
general_partnership.

Property Type
kind string
name string
is_active boolean
fiscal_year_end string
gp_carry string
thesis string
target_fund_size integer
description string
news string
deck_url string
cap_table_link string
effective_date string (date)
first_close_date string (date)
fund_life_years number

EntityCalculations object

Fund-level dashboard values, present on GET /api/v1/entities/{id} only
when ?include=calculations is supplied. Numeric values are decimal strings
(currency 2dp, ratios 4dp); investor counts are integers. Per-window
field presence: capital_activity.invested and fees.reserved_for_fees
appear only when window=now.

Property Type
fund EntityCalculationsFund
commitments EntityCalculationsCommitments
capital_activity EntityCalculationsCapitalActivity
fees EntityCalculationsFees
investable_capital string
performance EntityCalculationsPerformance
portfolio EntityCalculationsPortfolio
investors EntityCalculationsInvestors
meta EntityCalculationsMeta

EntityCalculationsFund object

Property Type
target_fund_size string
fund_size string
general_partnership_name string

EntityCalculationsCommitments object

Property Type
total_committed string
lp_commitments string
committed string

EntityCalculationsCapitalActivity object

invested is present only when window=now — it is dropped entirely
from the response (not returned as null) when window=lifetime.

Property Type
called string
contributed string
paid_in string
invested string

EntityCalculationsFees object

reserved_for_fees is present only when window=now — it is dropped
entirely from the response (not returned as null) when window=lifetime.
total_fees is management_fees + admin_fees + other_fees for the chosen
window (realized fee deductions only) and does NOT include reserved_for_fees
even on the now window — those are a forward-looking reservation, not a
realized deduction. Fees are emitted as negative values per project convention.

Property Type
total_fees string
management_fees string
admin_fees string
other_fees string
reserved_for_fees string

EntityCalculationsPerformance object

Property Type
net_irr string

EntityCalculationsPortfolio object

Property Type
fmv string
fmv_cap_adjusted string

EntityCalculationsInvestors object

Property Type
lp_total_count integer
lp_active_count integer

EntityCalculationsMeta object

Property Type
window string
as_of string (date)
currency string

JournalEntryCreateRequest object

Request body for creating a single journal entry (double-entry GL posting). debit_code and credit_code are GL account codes that must differ and both resolve to a known accounting account. amount must be numeric and greater than 0. transaction_at is an ISO date (YYYY-MM-DD). An optional counterparty is attached via the counterparty_type + counterparty_id pair.

Property Type
debit_code string
credit_code string
amount string
transaction_at string (date)
comment string
counterparty_type string
counterparty_id integer

JournalEntryBulkCreateRequest object

Request body for atomically creating many journal entries under one entity. journal_entries holds 1 to 100 rows, each a full independent entry with the same shape and rules as JournalEntryCreateRequest. Every row is validated before any is created; if any row is invalid the whole batch is rejected and nothing is created.

Property Type
journal_entries array<JournalEntryCreateRequest>

JournalEntryBulkErrors object

Per-row validation failures for a bulk create. Each entry identifies the zero-based row index plus the offending field and a human-readable message. When present the batch created nothing.

Property Type
errors array<object>

JournalEntry object

A double-entry general-ledger posting (FirmAdmin::AccountingTransaction) under an entity. transaction_amount is the absolute amount (always positive; direction is determined by the debit/credit account assignment). counterparty is null when the entry has no counterparty.

Property Type
id integer
transaction_at string (date-time)
transaction_amount string
reconciled boolean
pending boolean
comment string
debit object
credit object
counterparty object

CapitalAccountIdentity object

Identity block shared by the list (GET /api/v1/entities/{entity_id}/capital_accounts) and show (GET /api/v1/capital_accounts/{id}) responses. The calculations endpoints do NOT include this block — single-CA returns only the commitments/period_activity/ performance/meta groups, and bulk-calc rows carry only id and name alongside the four calculation groups.

Property Type
id integer
name string
vehicle_type string
partner_type string
admitted_on string (date)
lp_signature_at string (date-time)
is_capital_account_enabled boolean
kyc_passed boolean
aml_passed boolean
is_gp_carry boolean
fund object

Commitment object

Property Type
id integer
committed_capital integer (int64)
committed_at string (date-time)

PrimaryContact object

Primary contact for the capital account; null when not set.

Property Type
id integer
name string
email string

CapitalAccountContact object

A contact on a capital account. contact_status_type is the
mailing/communication role; the boolean flags describe the legal
relationship to the account (joint primary, spouse, trustee,
entity owner/signatory, trust beneficiary). Multiple booleans can
be true for the same person.

Property Type
id integer
name string
email string
phone string
title string
contact_status_type string
is_primary_individual boolean
is_spouse boolean
is_trustee boolean
is_trust_beneficiary boolean
is_entity_owner boolean
is_entity_signatory boolean

EntityRef object

Property Type
id integer
name string
kind string

AccountingAccount object

A chart-of-accounts entry / GL account code, shared across the account.
code drives debit/credit automation and follows standard GL ranges
(1xxx=assets, 2xxx=liabilities, 3xxx=equity, 4xxx=revenue,
6xxx/7xxx=expenses).

Property Type
id integer
code string
name string
description string
is_1099_eligible boolean

CapitalCallHeader object

Header view of a capital call. amount_being_called is the sum of
the per-LP amounts being called. total_wired, total_outstanding,
and percentage_funded are derived from reconciled capital-call
payment transactions within the call's
created_at..(closed_at || now) window. fund_total_commitment is the
sum of active commitments across the parent fund's capital accounts
(constant across all rows on an index page, since a page is scoped to
a single fund).

Property Type
id integer
name string
status string
percentage_to_call number (float)
notes string
pipeline_id integer
amount_being_called string
total_wired string
total_outstanding string
percentage_funded number (float)
fund_total_commitment string
created_at string (date-time)
closed_at string (date-time)
due_date string (date)
entity object

CapitalCallDetail object

Per-LP line item under a capital call.

Property Type
id integer
capital_account object
amount_being_called string
committed_capital string
wired_amount string
wire_date string (date-time)
variance string
payment_status string
prospect_id integer

CapitalAccountTransfer object

Transfer entry oriented at the requested capital account. effective_at is aliased from the underlying transferred_at column.

Property Type
id integer
kind string
effective_at string (date-time)
from_capital_account_id integer
to_capital_account_id integer
amount integer (int64)

PeriodCommitments object

Commitment + paid-in figures. All values are decimal strings; currency fields use 2 decimal places, ratio fields use 4. Nil values are returned as null.

Property Type
committed_capital string
total_committed_capital string
lp_committed_capital string
gp_committed_capital string
percentage_of_total_commitments string
percentage_of_lp_commitments string
percentage_of_funds_called string
amount_paid_in_for_capital_accounts string
amount_paid_in_for_capital_accounts_percentage string
outstanding_capital_contribution string
capital_call_receivable string
capital_call_prepaid string

PeriodActivity object

Per-period ledger movements. All values are decimal strings (currency, 2 decimal places); null when not applicable.

Property Type
beginning_balance string
capital_contribution string
syndication_cost string
management_fees string
incentive_fees string
net_operating_gain string
late_interest string
unrealized_gain string
carried_interest_accrued string
net_realized_gain string
deemed_gain string
distributions string
in_kind_distributions string
transfers string
ending_balance string

PeriodPerformance object

Performance ratios. Decimal strings (4 decimal places). In the bulk endpoint's totals block these are always null because per-CA ratios don't aggregate cleanly across capital accounts.

Property Type
dpi string
rvpi string
tvpi string

PeriodMeta object

Property Type
period_start string (date)
period_end string (date)
currency string
management_fee_system string
carry_system string
cutover_dates object

BulkCalculationsRow object

One row in the bulk-calculations response. Always has id and name. The commitments, period_activity, performance, and meta groups are present by default; supplying ?fields= may drop entire groups from the response (a group with zero requested fields is omitted from both rows and totals).

Property Type
id integer
name string
commitments PeriodCommitments
period_activity PeriodActivity
performance PeriodPerformance
meta PeriodMeta

BulkCalculationsTotals object

Fund-level totals across the filtered scope (NOT the current page). Per-CA ratio fields and the performance ratios (dpi, rvpi, tvpi) are always null in totals — per-account ratios do not sum into a fund-level figure. Currency fields are summed across the filtered scope. As with rows, supplying ?fields= may drop entire groups from this object.

Property Type
commitments PeriodCommitments
period_activity PeriodActivity
performance PeriodPerformance
meta PeriodMeta

AccessType string

RsvpStatus string

TimeZone string

associated_person object

Property Type
first_name string
middle_name string
last_name string
email string
phone string

address object

Property Type
street string
city string
state string
country string
zipcode string

financial_report_job object

Property Type
id integer
status string
created_at string (date-time)
started_at string (date-time)
finished_at string (date-time)
status_url string (uri)
error_message string
files array<object>

variable object

A merge-tag variable usable in email templates (e.g.
{{fund_thesis}}). The id is opaque — pass it back to
GET /api/v1/variables/{id} to look up the row.

Property Type
id string
name string
context string
description string
value string
format_name string
display_format string
select_options array<composite>

pagination object

Property Type
total_count integer
current_page integer
total_pages integer

Task object

A Hub Task with its lifecycle status, origin, and assignment.

Property Type
id integer
title string
description string
status string
origin string
due_date string (date)
deep_link_url string
assignee_id integer
created_by_user_id integer
account_id integer
account_organization_id integer
parent_task_id integer
completed_at string (date-time)
created_at string (date-time)
updated_at string (date-time)