API Documentation
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
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
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 |
— |
| 403 | Forbidden — endpoint requires an admin API token |
ErrorResponse |
Accounts 1
Returns the current account's basic information
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | account found |
— |
| 401 | Unauthorized |
— |
AccountUsers 1
Returns the AccountUsers belonging to the authenticated token's account.
Use to discover the assigned_id value for PATCH /api/v1/pipeline_prospects andPATCH /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
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 | query | integer | — | Subject record id; pair with |
| include_associated | query | boolean | — | When |
| event | query | string | — | Curated event filter. Mutually exclusive with |
| entryable_type | query | string | — | Lower-level entryable class filter (e.g. |
| user_id | query | string | — | Actor user id. Pass the literal |
| 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 |
| page_token | query | string | — | Opaque keyset cursor returned by a previous call as |
| per_page | query | integer | — | Page size. Capped at 100; defaults to 25. |
| include | query | string | — | Comma-separated nested embeds. Currently supports |
| fields | query | string | — | Comma-separated top-level fields to return. Always returns at least |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | paginated list of activity entries |
object |
| 400 | invalid parameter |
ErrorResponse |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
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
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 byGET /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
|
| active | query | string | — | Active vs hidden entity filter. |
| 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 |
— |
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 |
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, andnew_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 plusfees.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 |
| window | query | string | — | Calculation window for the |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | entity found |
composite |
| 400 | Invalid |
ErrorResponse |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
| 404 | Entity not found (includes |
ErrorResponse |
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
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 | — |
|
| partner_type | query | string | — | Optional partner-type filter. Unknown values return a 400 |
| 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 |
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 pluscontact_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 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | capital account found |
composite |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
| 404 | Capital account not found |
ErrorResponse |
Computes a single capital account's period figures. Response groups:
- commitments — 12 commitment + paid-in fields.
- period_activity — 15 ledger movements within the window.
- performance — dpi, rvpi, tvpi.
- meta — period_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 (ISOYYYY-MM-DD). Both are required together — supplying one without
the other returns a 400. period_end must be on or afterperiod_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 | query | string (date) | — | ISO 8601 date (YYYY-MM-DD). Required when |
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 |
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 | query | string (date) | — | ISO 8601 date. Required when |
| active | query | string | — |
|
| partner_type | query | string | — | |
| fields | query | string | — | Comma-separated whitelist of calculation fields to return. commitments — period_activity — performance — meta — |
| 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
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 viatransaction_at_start/transaction_at_end; debit_code/credit_code
(GL account codes — an unknown code returns no rows); reconciled andpending (true/false); min_amount/max_amount; andcounterparty_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_end | query | string (date) | — | ISO date (YYYY-MM-DD) upper bound on |
| 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 |
| pending | query | string | — | Filter by pending flag. Unknown values return a 400 |
| min_amount | query | number | — | Lower bound on |
| max_amount | query | number | — | Upper bound on |
| 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 |
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 |
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 viacounterparty_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 |
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
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 |
— |
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
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 whenentity_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 |
| period_end | query | string (date) | — | ISO date (YYYY-MM-DD) upper bound on |
| 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 |
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 |
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
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 |
— |
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 |
— |
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
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 |
— |
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 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. |
| fields | query | string | — | Comma-separated list of top-level fields to return. Unknown values |
| 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 |
— |
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 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 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) |
| 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 |
— |
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 |
— |
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
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: |
| order_direction | query | string | — | Order direction |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
| 401 | Unauthorized |
— |
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 |
— |
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 |
— |
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 thefile 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 |
— |
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 |
— |
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 |
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: |
| order_direction | query | string | — | Order direction |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
| 401 | Unauthorized |
— |
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 |
— |
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: |
| 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
Searches data room folders by name to help disambiguate a user's folder
reference (for example "save it to Acme") into folder ids.
Only folders in your account that you can read are returned. The match is
case insensitive on the folder name and is capped at 50 results. Each match
includes the folder id, name, a breadcrumb path (for example "Parent > Child"),
and an audience phrase describing who can see files saved to that folder. The
agent uses these to compose its confirmation request.
The q parameter is required (a missing or blank q returns 400). A query
that matches no folders returns an empty matches array.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| q | query | string | required | Substring to match against folder names (case insensitive). |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
| 400 | missing required parameter |
ErrorResponse |
| 401 | Unauthorized |
— |
Directory 10
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 |
| fields | query | string | — | Comma-separated list of top-level fields to return. Unknown values |
| custom_data_points | query | string | — | Optional. Controls embedding of a custom_data_points field on - Omit the param entirely to leave custom_data_points out of the Select-type values are resolved to their human-readable option |
| 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: |
| order_direction | query | string | — | Order direction |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
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 |
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 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 |
| fields | query | string | — | Comma-separated list of top-level fields to return. Unknown values |
| custom_data_points | query | string | — | Optional. Controls embedding of a custom_data_points field on - Omit the param entirely to leave custom_data_points out of the Select-type values are resolved to their human-readable option |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | organization found |
— |
| 404 | not found |
— |
| 401 | Unauthorized |
— |
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 |
— |
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 |
| fields | query | string | — | Comma-separated list of top-level fields to return. Unknown values |
| custom_data_points | query | string | — | Optional. Controls embedding of a custom_data_points field on - Omit the param entirely to leave custom_data_points out of the Select-type values are resolved to their human-readable option |
| first_name | query | string | — | First name includes this string (case-insensitive) |
| last_name | query | string | — | Last name includes this string (case-insensitive) |
| 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: |
| order_direction | query | string | — | Order direction |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
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 |
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 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 |
| fields | query | string | — | Comma-separated list of top-level fields to return. Unknown values |
| custom_data_points | query | string | — | Optional. Controls embedding of a custom_data_points field on - Omit the param entirely to leave custom_data_points out of the Select-type values are resolved to their human-readable option |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | person found |
— |
| 404 | not found |
— |
| 401 | Unauthorized |
— |
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
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 |
— |
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 |
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 |
— |
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 |
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
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 |
— |
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 targetstage_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
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:
|
| fields | query | string | — | Comma-separated top-level fields to return. Allowed: |
| custom_data_points | query | string | — | Optional. Controls embedding of a custom_data_points field on - Omit the param entirely to leave custom_data_points out of the Select-type values are resolved to their human-readable option |
| 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: |
| order_direction | query | string | — | Order direction |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | no errors |
— |
| 400 | bad request |
— |
| 404 | not found |
— |
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 |
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 fornext_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 |
object |
| 400 | bad request |
— |
| 404 | Returned when the pipeline itself is not found, when |
— |
| 401 | Unauthorized |
— |
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 |
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 |
— |
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. Whennote.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 |
— |
Create or update an existing pipeline prospect in a given pipeline. The request must contain exactly one ofperson 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 |
— |
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_id — null 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 |
| include_final | query | boolean | — | When true, include |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | ok |
— |
| 400 | invalid |
ErrorResponse |
| 401 | unauthorized (missing/invalid API token) |
ErrorResponse |
| 403 | forbidden |
ErrorResponse |
| 404 | prospect not found in the token's account |
ErrorResponse |
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 withcode: 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 ( |
ErrorResponse |
Renders the would-be sent email for a pending send_emailPipelineActionExecution — 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 persisteddata[: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 422invalid_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 apipeline_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 |
ErrorResponse |
Pipelines 4
Returns the active pipelines for the current account. Passkind=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 |
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 |
— |
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 |
— |
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 |
Request body required
| Content-Type | Schema |
|---|---|
| application/json | object |
Responses
| Status | Description | Schema |
|---|---|---|
| 201 | Data point created |
object |
| 400 | Request body missing the |
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 |
ErrorResponse |
Deal Memos 6
Returns a paginated list of deal memos belonging to the caller's
account. Each row is a compact summary suitable for triage; useGET /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 |
| 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 |
— |
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 |
— |
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 |
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 |
— |
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 |
— |
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
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 ( |
| 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 |
| 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 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | paginated list of portfolio companies |
object |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
Returns one portfolio company — the same allowlisted fields surfaced byGET /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 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | the portfolio company |
PortfolioCompany |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
| 404 | Not found |
ErrorResponse |
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 |
| 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 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | paginated list of investments |
object |
| 401 | Unauthorized |
— |
| 403 | Forbidden |
— |
| 404 | Portfolio company not found in current account |
ErrorResponse |
Returns a single investment tranche (accounting-transaction-driven) on a portfolio
company, with applied overrides resolved.
The response combines the column allowlist exposed bylist_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 |
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
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
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
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 |
ErrorResponse |
| 401 | Unauthorized — token missing, invalid, or expired |
— |
| 403 | Forbidden — token lacks necessary Base access |
ErrorResponse |
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 |
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 |
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 |
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 |
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 |
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
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); useGET /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 |
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 |
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 ofpipeline_prospect_id, person_id, organization_id, orto_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 ( |
ErrorResponse |
Sends the previewed email. Request body is identical toPOST /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 |
|
ErrorResponse |
Variables 2
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 toGET /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 |
— |
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
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 |
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 belowis_active) are accepted only when kind is fund, spv, orholding; 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 orgeneral_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 |
| 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 |
| 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'screated_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 |
| 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 toGET /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) |