` | Group by a population tag code (prefix is literal `population_`). |
| `category_` | Group by a population category code (prefix is literal `category_`). |
The web application builds population segment ids from enabled populations on the analysis.
#### Custom analysis segments
For custom (flex) analyses, additional segment fields may be used when they name **categorical** columns on the
analysis entry data table. Those names must be valid SQL identifiers and must exist on the table. The analysis
designer uses the same rules when defining risk segmentation there.
### Columns
`columns` is an ordered list of metric fields displayed in the dashboard table for each segment row. Values must match
the snake\_case ids below (these are the same ids the web application sends as `columns`).
#### Count and value summaries
| Column | Meaning |
| - | - |
| `total_count` | Entry count in the segment. |
| `total_value` | Total monetary value. |
| `total_value_dr` | Total debit value. |
| `total_value_cr` | Total credit value. |
| `net_activity` | Net activity value. |
| `risk_avg` | Average risk score in the segment. |
#### High / medium / low counts and values
| Column | Meaning |
| - | - |
| `high_count`, `medium_count`, `low_count` | Entry counts at each risk level. |
| `high_value`, `medium_value`, `low_value` | Monetary totals at each risk level. |
| `high_value_dr`, `high_value_cr`, … | Debit/credit splits of H/M/L value columns (same pattern as above). |
#### High / medium / low percentages
| Column | Meaning |
| - | - |
| `percent_high_risk`, `percent_med_risk`, `percent_low_risk` | Percent of entries at each risk level. |
| `percent_high_risk_dr`, `percent_high_risk_cr`, … | Debit/credit splits of the percentage columns (same pattern). |
Debit/credit column variants apply to general ledger analyses that expose separate debit and credit totals. Omit them
when not relevant to the analysis type.
Do **not** put segment keys (such as `risk_group` or `account_l1`) in `columns`; those belong in `segments`.
### Optional filters
These fields mirror the **Risk group** and **Risk score** filters on the dashboard facet bar. They restrict which
scores and categories are in scope when the config is opened. They do not add extra grouping levels.
| Field | Meaning |
| - | - |
| `riskScoreIds` | Risk score ids (ensemble object ids) to include. When omitted or empty, all enabled risk scores for the analysis are in scope. When `risk_score` is not a segment, this still limits which scores contribute to aggregated columns. |
| `riskGroups` | Risk group category names to include (for example `GENERAL`, `ASSETS`, `PROFIT_LOSS`, or a custom risk score category name). When omitted or empty, all groups are in scope. |
`riskGroups` values are **category labels**, not risk range ids and not entries from `/v1/risk-ranges`.
### Other fields
| Field | Meaning |
| - | - |
| `displayCellVisuals` | When `true`, the dashboard shows in-cell sparkline visuals for numeric columns. Defaults to `false`. Maps to internal `displayTableSparklines`. |
| `enabled` | Whether the config is active. Defaults to `true`. Disabled configs remain stored but are not selected by default in the web application. |
| `analysisTypeId` | Set automatically on create from the analysis. Returned on read and query; do not send on create. |
### Example create request
```json theme={null}
{
"analysisId": "123456789012345678901234",
"name": "Risk group and score",
"segments": ["risk_group", "risk_score"],
"columns": ["total_count", "total_value", "risk_avg"],
"displayCellVisuals": false,
"enabled": true,
"riskScoreIds": ["abcdefabcdefabcdefabcd"],
"riskGroups": ["GENERAL", "PROFIT_LOSS"]
}
```
### Validation
* `analysisId` must reference an existing analysis run.
* `name` must be unique among configs for that analysis.
* `segments` must include `risk_score`.
* Segment and column names must be valid SQL identifiers.
* Invalid segment or column combinations for the analysis type may be rejected at create time.
### Query
See the query operation description for filterable fields.
# Saved Filters
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/saved-filters
**Saved Filters** are used to filter data tables in order to easily and repeatedly extract insights on large sets of data. The saved filters
endpoint allows for easy creation and management of saved filters, and validation of the applicability of filters across different data
tables and even across engagements and organizations.
Saved filters contain **conditions**, which are definitions on how the filter applies constraints on the underlying data table. These
conditions contain a field, type and various parameters depending on the condition type.
The field can either specify a column in the data table (with some constraints), or a special case field name, which provides the ability to
filter the data table on features of the dataset that are not represented by a specific column.
The condition type determines how the data will be filtered. Which types can be applied depends on the data table's column type and other
properties. For special case filters the type parameters depend on the underlying data table and analysis features. See the *Condition
Types* section for more details.
Saved filters can be used to filter general ledger, accounts payable, and accounts receivable analyses. They cannot be used as part of
custom analysis types.
### Validation
Saved filters are different from other entities in the MindBridge API in that the filter conditions are not immediately validated upon
creation. This is because they may or may not be applicable to different target data tables based on the analysis features and the column
present in the data table, and their types. To validate whether a given filter is compatible on a target data table a `/validate` endpoint
is provided, which will return a list of errors and warnings explaining incompatibilities between the provided filter and the target data
table.
### Display fields
Saved Filter conditions include various fields that are used in generating a description of the filter for each condition. This description
is visible in the web application and presents the filter in plain English.
In the web application, filters can only be created in either a library or analysis context, and have immediate context with which to base
the display fields on. The API doesn't require this context, and can therefore create filters in contexts the web application can't, such as
on an organization or engagement without any analyses. In order to generate a sensible filter description for use in the web application,
users of the API can optionally provide these values, and verify if they align with a target data table using the `/validate` endpoint.
### Filter types
Filters can be of one of four types:
`LIBRARY`, `ORGANIZATION`, `ENGAGEMENT` and `PRIVATE`
Library, organization, and engagement types determine which parent entity type the filter is stored under, and in some cases restrict which
fields can be used on those filters.
Private filters function like organization filters, but they are only accessible by the user that created them. This also applies to the API
users, who can only see private filters created by that same token user. The API cannot be used to access private filter created by other
users, including other token users.
### Filter data type
Filter data type is used to determine what kind of data the filter intends to target, and can be set to the values: `TRANSACTION_FILE`,
`ENTRIES_FILE` or `LIBRARY_ADMIN_TABLE`.
The `TRANSACTION_FILE` value corresponds to the transactions data table in a general ledger analysis.
The `ENTRIES_FILE` corresponds to a general ledger, accounts payable and accounts receivable entries tables.
### Disallowed fields
The following fields cannot be used as conditions:
* `account`, if the analysis is a general ledger analysis
* `accounts` or `mac_hierarchy`, if the data table column type is `ARRAY_STRINGS`
* `txid`, `rowid` or `matched_entry_id`, if the data table column type is `INT64`
* `total_amt`, if the data table column type is `MONEY_100`
* `invoice_paid_zero_date`, if the data table column type is `DATE_TIME`
* Any data table column whose field name starts with "`cp_score_`"
* Any data table column whose field name starts with "`risk`", and has data table column type `PERCENTAGE_FIXED_POINT`
* Any column that does not have a data table column type of `KEYWORD_SEARCH` or `LEGACY_ACCOUNT_TAG_EFFECTS`, and without one of
`equalitySearch`, `rangeSearch` and `containsSearch` being `true`
### Condition types
Condition's types are determined by their `type` field. Some condition types also contain subtypes, which further determine what fields are
required to configure them.
Broadly there are 2 types of conditions: Group type conditions, and value conditions.
Group conditions don't require a field or other properties, and instead contain a sub-list of conditions that are applied against the data
table entries.
Value conditions filter a specific field and cover all other condition types other than `GROUP`. In addition to `field` they have the
following properties:
* `fieldLabel` - An optional display name for the field which is used in the full condition description.
* `negated` - When `true` the condition will instead exclude any entry that matches the condition from the result.
* `fullConditionDescription` - A description of the filter in plain English, using the provided display values such as `fieldLabel` and
others.
#### `GROUP` type conditions
Group conditions, also known as rules, don't require a field, and contain both an operator and a list of conditions. The operation can be
either `AND` or `OR`, and the condition will match records that meet all or any of the conditions, depending on the operator. Group
conditions can be nested, and the value of the `condition` field on a saved filter must be a group condition, though it can be either type.
```json theme={null}
{
"type": "GROUP",
"operator": "AND",
"conditions": [
...
]
}
```
#### `STRING` type conditions
String type conditions compare a field against a specific string value. This condition can only be applied to the following special case
fields:
| **Field** | **Name** | **Allowed Values** | **Notes** |
| - | - | - | - |
| `accountScoping` | Account Scoping | SIGNIFICANT, INSIGNIFICANT, UNSCOPED | Only allowed on general ledger analyses. |
| `riskGroup` | Risk Group | Not `GENERAL` or `MindBridge Score`
ASSETS, LIABILITIES\_EQUITY, PROFIT\_LOSS, or any custom account group by `category` name. | Only allowed on general ledger analyses. |
#### `STRING_ARRAY` type conditions
String array conditions compare the field against a set of string values. It can be applied to any data table column with the following
properties:
* Data table column type is `STRING` and `caseInsensitivePrefixSearch` is `true`.
* Data table column type is `KEYWORD_SEARCH`.
#### `CONTROL_POINT` type conditions
Control point conditions match a set of selected control points within their respective high, medium and low risk scores.
The control point type can only be used with the field `cp_failed` and when the data table column type is `BOOLEAN_FLAGS`.
The `riskLevel` property can be set to `HIGH_RISK`, `MEDIUM_RISK` or `LOW_RISK`.
The `controlPoints` contains a list of control point selection models, with the following properties:
* `id` - The unique ID of the control point prefixed with `custom_`, in the case of custom control points, or the symbolic name, in the case
of MindBridge control points.
* `name` - The display name of the control point. Optional.
* `symbolicName` - The symbolic name of the control point. In the case of custom control points it must be the symbolic name of the
underlying MindBridge control point.
* `isRulesBased` - Must be `true` if the target control point is rules based. Rules based control points can only have high and low risk
values, and therefore cannot be selected with a `riskLevel` of `MEDIUM_RISK`.
Here is an example of both a MindBridge and a custom control point:
```json theme={null}
{
"type": "CONTROL_POINT",
"field": "cp_failed",
"fieldLabel": "Control point",
"negated": false,
"riskLevel": "HIGH_RISK",
"controlPoints": [
{
"id": "custom_682fab332f732c4d0b8d1ced",
"name": "Expert Rules - Example Custom Control Point",
"symbolicName": "journal_entry_flat_expert_flow_v2",
"rulesBased": false
},
{
"id": "journal_entry_two_digit_benford_v2",
"name": "2 Digit Benford",
"symbolicName": "journal_entry_two_digit_benford_v2",
"rulesBased": false
}
]
}
```
#### `ACCOUNT_NODE_ARRAY` type conditions
Account node array type conditions match an entry if it's within an account group or specific account code within varying contexts.
This condition type can only be used for general ledger analyses.
The following fields use the account node array type:
| **Field** | **Name** | **Notes** |
| - | - | - |
| `account_hierarchy_codes` | Account | Matches if the entry is associated with an account within the selection of accounts. |
| `increasingCredits` | Increasing Credits | Matches if the entry is associated with an account within the selection of accounts and the credit value within those accounts are increasing. |
| `increasingDebits` | Increasing Debits | Matches if the entry is associated with an account within the selection of accounts and the debit value within those accounts are increasing. |
Both `increasingCredits` and `increasingDebits` are special case fields and can be used even if they are not present as data table columns.
When using an `ACCOUNT_NODE_ARRAY` condition a list of account selections must be provided with the following properties:
* `name` - The display name of the account. Optional.
* `code` - The account group or account ID of the account.
* `useAccountId` - If `true` the condition should match the account id from the account mapping instead of the account group ID for this
selection.
Here is an example of a condition that matches both an account group and a mapped account:
```json theme={null}
{
"type": "ACCOUNT_NODE_ARRAY",
"field": "increasingCredits",
"fieldLabel": "Increasing credits",
"negated": false,
"accountSelections": [
{
"name": "Assets",
"code": "1000",
"useAccountId": false
},
{
"name": "Accounts Payable",
"code": "21011",
"useAccountId": true
}
]
}
```
#### `TYPEAHEAD_ENTRY` type condition
The typeahead entry type condition can be used to match one or more string values within a known set of allowed values. They are used both
to filter columns that have been mapped to certain MindBridge field and additional columns marked as filterable. There are also additional
special case field that can be used for various purposes.
| **Field** | **Name** | **Notes** |
| - | - | - |
| `status` | Status | Matches entries which contain corresponding tasks with the selected statuses. |
| `memo` | Suspicious keyword | Allowed values are from the Suspicious keyword control point. |
| `entriesFundRestriction` | Fund restriction | Allowed values are `restricted`, `unrestricted` and `none` |
| `transactionsFundRestriction` | Fund restriction | Allowed values are `restricted`, `unrestricted`, `both` and `none` |
| `account_tags_increasing` | Increasing account tags | Matches entries whose accounts using the provided account tags have increased in value. |
| `account_tags_decreasing` | Decreasing account tags | Matches entries whose accounts using the provided account tags have decreased in value. |
In addition to the above field, any data table column with the type `STRING` or `ARRAY_STRINGS` and an ID set for `typeaheadDataTableId` can
be used in a typeahead entry condition. The allowed values for typeahead based fields are any of the values present in the column. Typeahead
column values are not currently validated, so no warnings will be produced if a value that is not present in the column is used as an entry.
A value selection for a typeahead entry has three properties: `lookupId`, which is the value being selected, `displayName`, which is the
display name of the underlying value, and `hideLookupId`, which hides the lookup ID when displaying the full display name.
Here is an example of a typeahead entry condition:
```json theme={null}
{
"type": "TYPEAHEAD_ENTRY",
"field": "entriesFundRestriction",
"fieldLabel": "Fund restriction",
"negated": false,
"values": [
{
"lookupId": "none",
"displayName": "No fund information",
"hideLookupId": true
},
{
"lookupId": "restricted",
"displayName": "Restricted funds",
"hideLookupId": true
}
]
}
```
#### `POPULATIONS` type condition
The populations type condition matches any entries that are within the provided populations.
Population type conditions can only be used in general ledger analyses, and can only be used in saved filters at the analysis level.
Populations type conditions must use the special case field `population`. Population type conditions can only be applied to general ledger
analyses.
To include a population in the condition it simply needs to be added to the `populationIds` field. In addition to IDs, population category
names can be present in the population IDs list for display purposes.
Here is an example of a populations filter:
```json theme={null}
{
"type": "POPULATIONS",
"field": "population",
"fieldLabel": "Population",
"negated": false,
"populationIds": [
"Custom Category",
"67d06587edfa507f5e80c7c2"
]
}
```
#### `RISK_SCORE` type condition
A risk score condition matches entries whose risk score falls within the constraints configured in the condition.
The specific risk score being tested is selected by setting the `riskScoreId` field to the field of the target risk score, as found in the
data table column metadata.
Risk scores are used on the special case fields `riskScoresHml` or `riskScoresPercentage`, depending on the library configuration for the
analysis. Additionally, the `riskScoreType` must be set to `HML` or `PERCENT` accordingly.
For HML type risk score conditions a set of the values `HIGH`, `MEDIUM`, `LOW` or `UNSCORED`, which match entries that fall within the
configured risk range for the selected risk score.
Here is an example of a HML risk score filter on a custom risk score:
```json theme={null}
{
"type": "RISK_SCORE",
"field": "riskScoresHml",
"fieldLabel": "Risk score",
"negated": false,
"riskScoreType": "HML",
"riskScoreId": "risk_67d2f16d9ffead02b4f54aad",
"riskScoreLabel": "My custom risk score",
"values": [
"MEDIUM",
"UNSCORED"
]
}
```
For percentage risk score conditions a `riskScorePercentType` of `MORE_THAN`, `LESS_THAN`, `BETWEEN`, `CUSTOM_RANGE` or `UNSCORED` is set.
These determine how the rule will be applied, and which parameters can be set.
For `UNSCORED` only entries that haven't been scored are matched.
For `MORE_THAN` and `LESS_THAN`, a `value` parameter must be set with a number from 0 to 10,000, representing a percentage between 0% to
100%, and matching entries with scores above or below the specified value.
For `CUSTOM_RANGE` a pair of percentage values `rangeStart` and `rangeEnd` are set. Any entries whose score falls between the values will be
matched.
`BETWEEN` is functionally equivalent to custom range, with the restriction that the `rangeStart` and `rangeEnd` must equal the start and end
values of one of the risk score's risk range entries (high, medium or low risk). In the web application this is represented as the user
selecting an existing risk range, rather than manually entering a pair of percentages as custom range requires.
Here is an example of a percentage risk score filter:
```json theme={null}
{
"type": "RISK_SCORE",
"field": "riskScoresPercentage",
"fieldLabel": "Risk score",
"negated": false,
"riskScoreType": "PERCENT",
"riskScoreId": "risk",
"riskScoreLabel": "MindBridge score",
"riskScorePercentType": "MORE_THAN",
"value": 0
}
```
#### `MONETARY_FLOW` type condition
The `MONETARY_FLOW` type condition matches entries that are part of a monetary flow corresponding to the filter's configuration.
This condition type can only be used in general ledger analyses.
Only the special case field `monetarySpecificFlow` can be used with this condition type.
The property `monetaryFlowType` must be set to one of the following values, which determine what kind of flow to include entries from:
`SIMPLE_FLOW`, `COMPLEX_FLOW` or `SPECIFIC_FLOW`.
For simple and complex flow values, entries that are part of simple account to account flows, or flows that are too complex to assign to an
account are included.
For specific flows a pair of credit and debit account selections, `creditAccount` and `debitAccount` accordingly are set. These use the same
parameters as the account node array condition. In addition, the code may be set to `complex` to match flows whose credit or debit account
is
determined to be too complex to match.
Additionally for specific flows a value for `specificMonetaryFlowType` must be set, which further filters the entries based on the specific
value of the flow. The following values can be used:
* `SPECIFIC_VALUE` - by setting the `value` field to a currency amount only entries whose flow amount matches the value exactly will be
matched.
* `MORE_THAN` - by setting the `value` field to a currency amount only entries where the flow value exceeds that amount will be matched.
* `BETWEEN` - a pair of `rangeStart` and `rangeEnd` values only entries whose value is between the specified currency amounts.
Currency amounts are expressed as integers, and do not include decimal places. They follow the same formatting rules as `MONEY_100` fields.
See the *Data Formats* section for more information.
Here is an example of a monetary flow condition:
```json theme={null}
{
"type": "MONETARY_FLOW",
"field": "monetarySpecificFlow",
"fieldLabel": "Monetary flow",
"negated": false,
"monetaryFlowType": "SPECIFIC_FLOW",
"creditAccount": {
"name": "Flows too complex to determine a match",
"code": "complex",
"useAccountId": false
},
"debitAccount": {
"name": "Operational assets",
"code": "1100",
"useAccountId": false
},
"specificMonetaryFlowType": "BETWEEN",
"rangeStart": 0,
"rangeEnd": 1037979412
}
```
#### `MONEY` type condition
The money type condition matches entries whose value for the provided field is within the configured bounds of the condition.
The money type condition can be applied to any field with a data table column type of `MONEY_100`.
The following `monetaryValueType` values can be used to configure how the entries are matched:
* `MORE_THAN` - Matches entries whose value is more than the configured `value` field.
* `LESS_THAN` - Matches entries whose value is less than the configured `value` field.
* `SPECIFIC_VALUE` - Matches entries whose value is equal to the configured `value` field.
* `BETWEEN` - Matches entries whose value is between the provided `rangeStart` and `rangeEnd` values.
The values for `value`, `rangeStart` and `rangeEnd` follow the same formatting rules as the `MONEY_100` data type.
Here is an example of a money type condition:
```json theme={null}
{
"type": "MONEY",
"field": "bs_delta",
"fieldLabel": "Balance sheet impact",
"negated": false,
"monetaryValueType": "MORE_THAN",
"value": 0
}
```
#### `MATERIALITY` type condition
The materiality type condition matches entries that are above, below or above a percentage of the threshold.
The materiality type condition can be applied to general ledger analyses with a materiality judgment value set, and can only be applied to
the special case `materiality` field.
The following `materialityOption` values can be used to configure how the entries are matched:
* `ABOVE` - Matches entries whose value is above the materiality threshold.
* `BELOW` - Matches entries whose value is below the materiality threshold.
* `PERCENTAGE` - Matches entries whose value is above a percent of the materiality threshold. The percent is a decimal number set in the
`value` field, and can be greater than 100%.
Here is an example of a materiality type condition, and represents a percentage value of 110.25%:
```json theme={null}
{
"type": "MATERIALITY",
"field": "materiality",
"fieldLabel": "Materiality",
"negated": false,
"materialityOption": "PERCENTAGE",
"value": 110.25
}
```
#### `NUMERICAL` type condition
The numerical type condition matches entries whose value for the provided field is within the configured bounds of the condition.
This condition can be applied to any field with a data table column types of `INT32`, `INT64`, `FLOAT32` and `FLOAT64`.
The following `numericalValueType` values can be used to configure how the entries are matched:
* `MORE_THAN` - Matches entries whose value is more than the configured `value` field.
* `LESS_THAN` - Matches entries whose value is less than the configured `value` field.
* `SPECIFIC_VALUE` - Matches entries whose value is equal to the configured `value` field.
* `BETWEEN` - Matches entries whose value is between the provided `rangeStart` and `rangeEnd` values.
Here is an example of a numerical type condition:
```json theme={null}
{
"type": "NUMERICAL",
"field": "entries_count",
"fieldLabel": "Entries count",
"negated": false,
"numericalValueType": "MORE_THAN",
"value": 0
}
```
#### `DATE` type condition
The date type condition matches entries whose value for the provided field is within the configured bounds of the condition.
The numerical type condition can be applied to any field with a data table column types of `DATE` and `DATE_TIME`.
The following `numericalValueType` values can be used to configure how the entries are matched:
* `AFTER` - Matches entries whose value is more than the configured `value` field.
* `BEFORE` - Matches entries whose value is less than the configured `value` field.
* `SPECIFIC_VALUE` - Matches entries whose value is equal to the configured `value` field.
* `BETWEEN` - Matches entries whose value is between the provided `rangeStart` and `rangeEnd` values.
The values for `value`, `rangeStart` and `rangeEnd` should be expressed as ISO date strings, without a timestamp or timezone.
Here is an example of a date type condition:
```json theme={null}
{
"type": "DATE",
"field": "effective_date",
"fieldLabel": "Effective date",
"negated": false,
"dateType": "SPECIFIC_VALUE",
"value": "2010-01-01"
}
```
### Legacy filters
Saved filters with the `legacyFilterFormat` field set to `true` are using a legacy format which is not supported by the API, and will have
their `condition` property set to `null`.
# Task History
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/task-history
**Task Histories** are the history entries related to an individual task within the system.
# Tasks
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/tasks
**Tasks** are data table transactions or entries that have been added to the audit plan for further investigation.
# Transaction ID Previews
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/transaction-id-previews
**Transaction ID previews** contain the data behind our transaction ID generation and analysis system. In this object, analytic data about a proposed transaction ID is provided to guide the selection of the most appropriate, granular transaction ID, with as few single-entry transactions as possible. An appropriate transaction ID enables MindBridge’s analytics engine to detect anomalies that are more relevant and insightful.
# Users
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/users
**Users** generally represent you and your team and can be assigned to various roles and tasks within the platform. Users may also represent
MindBridge Customer Support staff who are active in customer assistance requests, as well as portal users when connecting integrations and
API Token Users.
### User roles
User roles determine which actions a user can perform within MindBridge.
| Role ID | User Role | Description |
| - | - | - |
| ROLE\_ADMIN | App Admin | App Admins have full access to the MindBridge tenant. They can invite and manage users, and view/edit all organizations and engagements. |
| ROLE\_USER\_ADMIN | User Admin | User Admins can invite and manage tenant users, and create new organizations. |
| ROLE\_ORGANIZATION\_ADMIN | Organization Creator | Organization Creators have the same privileges as users, but can also create new organizations. |
| ROLE\_USER | User | Users can be invited to existing organizations and engagements, but they cannot create new organizations. |
| ROLE\_CLIENT | Client | Clients must be [invited to connect](https://support.mindbridge.ai/hc/en-us/articles/1500001350402) to MindBridge. Once the client account has been activated via email, access is limited to the page that allows them to set up a data source. |
| ROLE\_MINDBRIDGE\_SUPPORT | MindBridge Support | MindBridge Support accounts have limited access to engagements, enabling them to assist with specific support requests. |
| \* ROLE\_ADMIN and `serviceAccount` equals `true` | API Token User | API Token Users are non-human user accounts linked to unique API tokens. Any action that an API takes will be attributed to this user account. |
### Enabling and disabling users
The `enabled` property can be used to enable and disable user accounts within a single tenant. If a user’s account is *disabled*, they will
no longer have access to the tenant until they are *enabled*.
**Note:** A user who is disabled in one tenant will still be able to access other tenants where they are enabled.
### Account activation emails
When a new user is created, they will be sent an **account activation email**. This email contains a link they must use to activate their
account. Until the account is activated, the user will not be able to sign in.
Activation links expire after 7 days, but additional account activation emails can be sent using the `Resend Activation Link` endpoint.
When a user who is `disabled` becomes `enabled` again, they will be sent an activation email. These users must use the account activation
link before they can sign in.
### API token permissions
The following table details the actions that users of the API may be permitted to take:
| Role | Read | Query | Create | Update user enabled status | Update user role | Can update role to | Delete | Can be sent account activation emails |
| - | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| App Admin | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
| User Admin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Organization Manager | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| User | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Client | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ |
| MindBridge Support | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| API Token | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
App Admins cannot be deleted, nor have their roles updated. This restriction prevents an API token from accidentally locking out a
legitimate administrator, resulting in the loss of administration to the entire tenant.
MindBridge Support and API Token Users cannot be created, updated, deleted or sent account activation emails to. These accounts are
automatically managed by support access requests and API tokens accordingly.
Client users serve a special purpose and cannot be created, nor have their roles updated. These users can only provide access to an
integration service.
# Webhook event logs
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/webhook-event-logs
The webhook event logs provide a way to track events as they are sent by the system, and allow the user
to help track messages, or diagnose issues with webhooks.
See the webhooks documentation for more information on receiving webhooks, or the webhook section for information
about the webhooks themselves.
# Webhooks
Source: https://developer.mindbridge.ai/api-explorer/tag-descriptions/webhooks
The webhooks entity provides a way to configure webhook integrations with other systems. Once created and active webhooks will send event payloads to the configured URL.
See the webhooks documentation for more information on receiving webhooks.
# Webhooks
Source: https://developer.mindbridge.ai/api-explorer/webhooks
webhook webhooks
Webhooks provide a lightweight, event driven method of notifying external systems of events within the MindBridge platform. Internal events communicate data
with external systems via HTTPS requests originating from our platform, allowing for a more robust automation potential without the need to poll for status. In
order to leverage webhook functionality, a URL must be provided, and a selection of events that you would like to receive notifications for associated with that
URL.
## URL Restrictions
- Each webhook must have a unique URL. You can configure a webhook to send multiple events to the same URL.
- Must be an HTTPS URL.
- The URL hostname must use a fully qualified name, not an IP address.
## Outbound Request
Each outbound request is sent as an HTTPS POST. The post will contain a JSON payload in the body of the message. As well as the JSON payload, there are a number
of important HTTPS headers that are attached to each message. Using this information, combined with the public key associated with the configured webhook,
allows the verification of a digital signature. The method of authenticating the payload will be covered in a separate section.
| **HTTPS Header** | **Description** |
|---------------------|------------------------------------------------------------------------------------------|
| `webhook-id` | A unique event ID for the event that triggered the outbound webhook request. |
| `webhook-timestamp` | Timestamp associated with the outbound HTTPS request. |
| `webhook-signature` | The digital signature that can be used to validate the authenticity of the webhook data. |
## Security
Webhooks operate by communicating with configured HTTPS URLs. This can lead to potential security risks from malicious actors. To authenticate the validity of
webhook payloads on the receiving side, the MindBridge platform implements an asymmetric digital signature scheme. This scheme verifies that a payload
originated from the platform and has not been modified. When a webhook is registered, a public key utilizing the `Ed25519` algorithm is associated with the
webhook configuration. Measures used to mitigate common attack scenarios within the digital signing scheme are covered below.
## Configuring your Server
In order to listen to webhook events, you must have a publicly accessible server that can accept HTTPS POST requests from the MindBridge system. This server
must not implement any authentication protocols in order to receive data. The data signature scheme implemented provides a mechanism to ensure data integrity,
and while this is optional
to [authenticate the received payload,](https://mindbridge-ai.atlassian.net/wiki/spaces/SBE/pages/4921327617/API+Content+-+Webhooks#Authenticating-a-Payload
"https://mindbridge-ai.atlassian.net/wiki/spaces/SBE/pages/4921327617/API+Content+-+Webhooks#Authenticating-a-Payload")
it is highly recommended to utilize this data integrity check in your workflow.
## Responding to Webhook Requests
How you respond to a webhook event has implications on the status of the webhook configured within the MindBridge system. We look at the HTTP response code, and
in some cases the HTTP headers in order to determine actions we may take within our system.
| **HTTP Code** | **Result** |
|---------------------|---------------------------------------|
| 200 series response | Successfully received webhook payload |
## Authenticating a Payload
Use the data from the payload, the headers in the HTTP post, and the public key associated with your webhook configuration. With these, you will be able to
validate the digital signature that is attached in the HTTP header. In order to accomplish this, you need to format a string with the following format:
`..`
Values with `< >` surrounding them are variables to insert into the template above.
| **Variable** | **Description** |
|-------------------|--------------------------------------------------|
| webhook-id | Found in the HTTP header |
| webhook-timestamp | Found in the HTTP header |
| payload | The unmodified contents of the HTTP POST request |
With this string generated, and using the public key from the webhook configuration, and the algorithm `Ed25519`, you can create a digital signature of the
formatted string created above, and compare it against the digital signature provided in the HTTP header, under the key `webhook-signature`. The creation of
this formatted payload helps to mitigate common attack patterns, such as replay attacks, which is why the timestamp of the outbound request is part of the
signed message.
## Events
| **Name** | **Description** | **Event Type** | **Payload Model** |
|----------------------------------|------------------------------------------------------------------------------------------|----------------------------------|----------------------------------------------|
| Analysis Created | An analysis was created. | analysis.created | AnalysisWebhookPayload |
| Analysis Updated | An analysis was updated. | analysis.updated | AnalysisWebhookPayload |
| Analysis Deleted | An analysis was deleted. | analysis.deleted | AnalysisWebhookPayload |
| Analysis Archived | An analysis was archived. | analysis.archived | AnalysisWebhookPayload |
| Analysis Unarchived | An analysis was unarchived. | analysis.unarchived | AnalysisWebhookPayload |
| Analysis Complete | An analysis completed successfully. | analysis.complete | AnalysisWebhookPayload |
| Analysis Failed | An analysis failed. | analysis.failed | AnalysisWebhookPayload |
| Engagement Created | An engagement was created. | engagement.created | EngagementWebhookPayload |
| Engagement Updated | An engagement was updated. | engagement.updated | EngagementWebhookPayload |
| Engagement Deleted | An engagement was deleted. | engagement.deleted | EngagementWebhookPayload |
| Unmapped Accounts | An engagement has unresolved account mappings from accounts discovered during ingestion. | unmapped.accounts | EngagementWebhookPayload |
| Ingestion Complete | A data ingestion workflow completed. | ingestion.complete | AnalysisSourceWebhookPayload |
| Ingestion Failed | A data ingestion workflow failed. | ingestion.failed | AnalysisSourceWebhookPayload |
| File Added | A file was added through the file manager. | file.added | FileManagerWebhookPayload |
| Connection Data Complete | Asynchronous connection data work finished (for example reading table data). | connection.data.complete | ConnectionAsyncWebhookPayload |
| Connection Test Complete | An asynchronous connection test finished. | connection.test.complete | ConnectionAsyncWebhookPayload |
| Connection Created | A connection was created. | connection.created | ConnectionLifecycleWebhookPayload |
| Connection Deleted | A connection was deleted. | connection.deleted | ConnectionLifecycleWebhookPayload |
| Export Ready | A requested file export is ready for download. | export.ready | FileManagerWebhookPayload |
| User Invited | A user was invited to the tenant. | user.invited | UserRoleWebhookPayload |
| User Role Updated | A user's role was updated. | user.role | UserRoleWebhookPayload |
| User Deleted | A user was deleted. | user.deleted | UserWebhookPayload |
| User Login | A user logged in. | user.login | UserLoginWebhookPayload |
| User Status Updated | A user was enabled or disabled. | user.status | UserStatusWebhookPayload |
| MCP Admin Settings Updated | Tenant MCP admin settings changed. See the Activity Report for details. | mcp.admin-settings.updated | McpAdminSettingsWebhookPayload |
# Append From Chunked File
Source: https://developer.mindbridge.ai/api-reference/account-groupings/append-from-chunked-file
/openapi.json post /v1/account-groupings/{accountGroupingId}/append-from-chunked-file
Append a chunked file that contains a MindBridge account grouping file (.xlsx) to an existing account grouping to add
new account groups and mappings to the existing account grouping.
**Note:** Appending to _CCH group trial balance_ files is not supported.
### Permissions
- `api.account-groupings.write`
# Delete Account Grouping
Source: https://developer.mindbridge.ai/api-reference/account-groupings/delete-account-grouping
/openapi.json delete /v1/account-groupings/{accountGroupingId}
Delete an existing account grouping, identified by its ID.
### Permissions
- `api.account-groupings.delete`
# Export Account Grouping
Source: https://developer.mindbridge.ai/api-reference/account-groupings/export-account-grouping
/openapi.json post /v1/account-groupings/{accountGroupingId}/export
Export an account grouping and all it’s account groups as an Excel file. Exporting returns an async result, which can
then be used to return a file result.
### Permissions
- `api.account-groupings.read`
# Import From Chunked File
Source: https://developer.mindbridge.ai/api-reference/account-groupings/import-from-chunked-file
/openapi.json post /v1/account-groupings/import-from-chunked-file
Import a chunked file that contains a MindBridge account grouping file (.xlsx) or a _CCH group trial balance_ file to
create a new account grouping entry with a complete set of account groups and MAC mappings.
The type of file being imported is determined by the `type` property.
### Permissions
- `api.account-groupings.write`
# Query Account Grouping
Source: https://developer.mindbridge.ai/api-reference/account-groupings/query-account-grouping
/openapi.json post /v1/account-groupings/query
Query account groupings, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
### Permissions
- `api.account-groupings.read`
# Read Account Grouping
Source: https://developer.mindbridge.ai/api-reference/account-groupings/read-account-grouping
/openapi.json get /v1/account-groupings/{accountGroupingId}
Read an existing account grouping, identified by its ID.
### Permissions
- `api.account-groupings.read`
# Update Account Grouping
Source: https://developer.mindbridge.ai/api-reference/account-groupings/update-account-grouping
/openapi.json put /v1/account-groupings/{accountGroupingId}
Update an existing account grouping, identified by its ID.
**Note:** If LLM AG Mapping is enabled for the tenant, publishing the account grouping will automatically mark all suggested Mac Code mappings as Verified.
### Permissions
- `api.account-groupings.write`
# Query Account Group
Source: https://developer.mindbridge.ai/api-reference/account-groups/query-account-group
/openapi.json post /v1/account-groups/query
Query account groups, optionally applying a filter.
## Required Query Restrictions
When querying account groups, an `accountGroupingId` field and either an `$eq` or `$in` term must be included. Queries
without these restrictions will fail.
### Queryable Fields
- `id` - `OBJECT_ID`
- `accountGroupingId` - `OBJECT_ID`
- `code` - `STRING`
### Permissions
- `api.account-groupings.read`
# Read Account Group
Source: https://developer.mindbridge.ai/api-reference/account-groups/read-account-group
/openapi.json get /v1/account-groups/{accountGroupId}
Read an existing account group, identified by its ID.
### Permissions
- `api.account-groupings.read`
# Update Account Group
Source: https://developer.mindbridge.ai/api-reference/account-groups/update-account-group
/openapi.json put /v1/account-groups/{accountGroupId}
Update an existing account group, identified by its ID.
## Lowest level only properties
The following properties can only be set on the lowest-level category of each account group:
- `macCode`
- `accountTags`
### Permissions
- `api.account-groupings.write`
# Delete Unused Account Mappings For Engagement
Source: https://developer.mindbridge.ai/api-reference/account-mappings/delete-unused-account-mappings-for-engagement
/openapi.json post /v1/account-mappings/delete-unused
Deletes all unused accounts mappings for the provided engagement.
### Permissions
- `api.analyses.write`
# Export Account Mappings For Engagement
Source: https://developer.mindbridge.ai/api-reference/account-mappings/export-account-mappings-for-engagement
/openapi.json post /v1/account-mappings/export
### Permissions
- `api.analyses.read`
# Get Account Mapping
Source: https://developer.mindbridge.ai/api-reference/account-mappings/get-account-mapping
/openapi.json get /v1/account-mappings/{accountMappingId}
Read an existing account mappings, identified by its ID.
### Permissions
- `api.analyses.read`
# Query Account Mappings
Source: https://developer.mindbridge.ai/api-reference/account-mappings/query-account-mappings
/openapi.json post /v1/account-mappings/query
Query account mappings, optionally applying a filter.
## Required Query Restrictions
When querying account groups, an `engagementId` field and either an `$eq` or `$in` term must be included. Queries
without these restrictions will fail.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `account` - `STRING`
### Permissions
- `api.analyses.read`
# Update Account Mapping
Source: https://developer.mindbridge.ai/api-reference/account-mappings/update-account-mapping
/openapi.json put /v1/account-mappings/{accountMappingId}
Update an existing account mapping, identified by its ID.
### Permissions
- `api.analyses.write`
# Verify Account Mappings For Engagement
Source: https://developer.mindbridge.ai/api-reference/account-mappings/verify-account-mappings-for-engagement
/openapi.json post /v1/account-mappings/verify
Mark all account mappings for a given engagement as verified.
### Permissions
- `api.analyses.write`
# Run Activity Report
Source: https://developer.mindbridge.ai/api-reference/admin-reports/run-activity-report
/openapi.json post /v1/admin-reports/activity-report/run
Running an **activity report** returns an async result, which can then be used to return a **file result**.
Provide `start` and `end` date values to limit the results to a specific time period.
Setting values in the `userIds` and `categories` lists will limit the results to the users who performed the actions, and the provided
categories, respectively. Leaving these lists empty will return results for all users and categories, respectively.
### Permissions
- `api.admin-reports.run`
# Run Analysis Overview Report
Source: https://developer.mindbridge.ai/api-reference/admin-reports/run-analysis-overview-report
/openapi.json post /v1/admin-reports/analysis-overview-report/run
Running an **analysis overview report** returns an async result, which can then be used to return a **file result**.
### Permissions
- `api.admin-reports.run`
# Run Row Usage Report
Source: https://developer.mindbridge.ai/api-reference/admin-reports/run-row-usage-report
/openapi.json post /v1/admin-reports/row-usage-report/run
Running a **row usage report** returns an async result, which can then be used to return a **file result**.
### Permissions
- `api.admin-reports.run`
# Create Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/create-analysis
/openapi.json post /v1/analyses
Create a new analysis.
If no `reportingPeriodConfigurationId` is provided, it inherits the reporting period set on the engagement.
### Permissions
- `api.analyses.write`
# Delete Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/delete-analysis
/openapi.json delete /v1/analyses/{analysisId}
Delete an existing analysis, identified by its ID.
### Permissions
- `api.analyses.delete`
# Engagement Roll Forward Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/engagement-roll-forward-analysis
/openapi.json post /v1/analyses/engagement-roll-forward
Roll a completed analysis forward into an existing engagement. This will create a new analysis within the target engagement using the source analysis' data as
prior period data for the new analysis.
For analyses using a non-periodic time frame, this will create a new current analysis period, with the existing data being added as prior period data. This new
current period can be configured to either be a full period, or an interim period.
Analyses that use the periodic time frame will be rolled forward into a new periodic time frame, and will not have a new period added.
Rolling forward is subject to the following restrictions:
- The target engagement must not be the same as the analysis' current engagement.
- Only completed analyses can be rolled forward.
- Interim analyses cannot be rolled forward. This does not apply to interim analyses that have been converted to full-period analyses.
- The library of the target engagement must support the analysis type of the analysis.
### Permissions
- `api.analyses.write`
# Query Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/query-analysis
/openapi.json post /v1/analyses/query
Query analyses, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `name` - `STRING`
### Permissions
- `api.analyses.read`
# Read Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/read-analysis
/openapi.json get /v1/analyses/{analysisId}
Read an existing analysis, identified by its ID.
### Permissions
- `api.analyses.read`
# Read Analysis Status
Source: https://developer.mindbridge.ai/api-reference/analyses/read-analysis-status
/openapi.json get /v1/analyses/{analysisId}/status
See a summary of the readiness of an existing analysis, including errors, missing analysis sources and more.
### Permissions
- `api.analyses.read`
# Run Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/run-analysis
/openapi.json post /v1/analyses/{analysisId}/run
Run an analysis through MindBridge’s analytics.
### Permissions
- `api.analyses.run`
# Start Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/start-analysis
/openapi.json post /v1/analyses/{analysisId}/start
Run an analysis through MindBridge’s analytics.
**Deprecation**: This endpoint has been renamed to `/run` and will be removed in a future release.
### Permissions
- `api.analyses.run`
# Update Analysis
Source: https://developer.mindbridge.ai/api-reference/analyses/update-analysis
/openapi.json put /v1/analyses/{analysisId}
Update an existing analysis, identified by its ID.
If no `reportingPeriodConfigurationId` is provided, the existing value will be kept.
### Permissions
- `api.analyses.write`
# Query Analysis Results
Source: https://developer.mindbridge.ai/api-reference/analysis-results/query-analysis-results
/openapi.json post /v1/analysis-results/query
Query analysis results, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisId` - `OBJECT_ID`
### Permissions
- `api.analyses.read`
# Read Analysis Result
Source: https://developer.mindbridge.ai/api-reference/analysis-results/read-analysis-result
/openapi.json get /v1/analysis-results/{analysisResultId}
Read an existing analysis result, identified by its ID.
### Permissions
- `api.analyses.read`
# Query Analysis Source Type
Source: https://developer.mindbridge.ai/api-reference/analysis-source-types/query-analysis-source-type
/openapi.json post /v1/analysis-source-types/query
Query analysis source types, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
### Permissions
- `api.analysis-source-types.read`
# Read Analysis Source Type
Source: https://developer.mindbridge.ai/api-reference/analysis-source-types/read-analysis-source-type
/openapi.json get /v1/analysis-source-types/{analysisSourceTypeId}
Read an existing analysis source type, identified by its ID.
### Permissions
- `api.analysis-source-types.read`
# Create Analysis Source
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/create-analysis-source
/openapi.json post /v1/analysis-sources
Create a new analysis source.
### Permissions
- `api.analysis-sources.write`
# Delete Analysis Source
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/delete-analysis-source
/openapi.json delete /v1/analysis-sources/{analysisSourceId}
Delete an existing analysis source, identified by its ID.
### Permissions
- `api.analysis-sources.delete`
# Query Analysis Source
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/query-analysis-source
/openapi.json post /v1/analysis-sources/query
Query analysis sources, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisId` - `OBJECT_ID`
- `analysisPeriodId` - `OBJECT_ID`
- `analysisSourceTypeId` - `OBJECT_ID`
- `additionalDataColumnField` - `STRING`
### Permissions
- `api.analysis-sources.read`
# Read Analysis Source
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/read-analysis-source
/openapi.json get /v1/analysis-sources/{analysisSourceId}
Read an existing analysis source, identified by its ID.
### Permissions
- `api.analysis-sources.read`
# Read Effective Date Metrics
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/read-effective-date-metrics
/openapi.json get /v1/analysis-sources/{analysisSourceId}/effective-date-metrics
Query the results of the **Analysis Period** step in the data import process (based on the effective date column), including displaying the
histogram by day, week, or month, as well as debit and credit sums for the period and more.
### Permissions
- `api.analysis-sources.read`
# Update Analysis Source
Source: https://developer.mindbridge.ai/api-reference/analysis-sources/update-analysis-source
/openapi.json put /v1/analysis-sources/{analysisSourceId}
Update an existing analysis source, identified by its ID.
### Permissions
- `api.analysis-sources.write`
# Query
Source: https://developer.mindbridge.ai/api-reference/analysis-type-configuration/query
/openapi.json post /v1/analysis-type-configuration/query
Query analysis type configurations, optionally applying a filter.
### Queryable fields:
- `id` - `OBJECT_ID`
- `libraryId` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `controlPointBundleVersion` - `STRING`
- `template` - `BOOLEAN`
### Permissions
- `api.analysis-type-configuration.read`
# Read
Source: https://developer.mindbridge.ai/api-reference/analysis-type-configuration/read
/openapi.json get /v1/analysis-type-configuration/{analysisTypeConfigurationId}
Retrieve an existing analysis type configuration by its ID.
### Permissions
- `api.analysis-type-configuration.read`
# Update
Source: https://developer.mindbridge.ai/api-reference/analysis-type-configuration/update
/openapi.json put /v1/analysis-type-configuration/{analysisTypeConfigurationId}
Update an existing analysis type configuration by its ID.
The configurable properties of an analysis type configuration are grouped into Risk Groups. They can be configured as follows:
- Risk groups can be enabled and disabled by setting the `disabled` property. Only engagement-level analysis type configuration can be
disabled.
- The risk range for use by the risk group can be set by the `selectedRiskRange`, and must also be included in the list of
`applicableRiskRanges`.
- A `filter` field can optionally be set to limit the risk group to only apply to a set of accounts, rather than all accounts.
- The control point weights can be adjusted by setting the value of the `controlPointWeights` key-value map, where the key is the control
point's symbolic name. Setting a control point weight to `0` disables the control point within the risk group.
Additionally, analysis type configurations cannot be updated if:
- The `system` or `template` properties are `true`.
- The analysis type configuration is at the analysis level, with a defined `analysisId`.
### Permissions
- `api.analysis-type-configuration.write`
# Query Analysis Type
Source: https://developer.mindbridge.ai/api-reference/analysis-types/query-analysis-type
/openapi.json post /v1/analysis-types/query
Query analysis types, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
### Permissions
- `api.analysis-types.read`
# Read Analysis Type
Source: https://developer.mindbridge.ai/api-reference/analysis-types/read-analysis-type
/openapi.json get /v1/analysis-types/{analysisTypeId}
Read an existing analysis type, identified by its ID.
### Permissions
- `api.analysis-types.read`
# Create API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/create-api-token
/openapi.json post /v1/api-tokens
Create a new API token.
The creation response will include a `token` field with the newly created token. This token is only returned on creation, and cannot be
re-generated afterwards.
When an API token is created, an API Token User is automatically created and assigned to the API token. This non-human user account
represents the API token, and any action that the API takes will be attributed to that account. The API Token User can be identified through
the `userId` property in the API Token entity.
### Permissions
- `api.api-tokens.write`
# Delete API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/delete-api-token
/openapi.json delete /v1/api-tokens/{apiTokenId}
Delete an existing API token, identified by its token ID.
This will de-authorize the token and automatically delete the associated API Token User.
### Permissions
- `api.api-tokens.delete`
# Get Current API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/get-current-api-token
/openapi.json get /v1/api-tokens/current
Read the API token record specified by the API token.
This endpoint is not restricted by any permissions and can be used to test the API.
# Query API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/query-api-token
/openapi.json post /v1/api-tokens/query
Query API tokens, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `userId` - `OBJECT_ID`
- `name` - `STRING`
### Permissions
- `api.api-tokens.read`
# Read API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/read-api-token
/openapi.json get /v1/api-tokens/{apiTokenId}
Read an existing API token, identified by its ID.
### Permissions
- `api.api-tokens.read`
# Update API Token
Source: https://developer.mindbridge.ai/api-reference/api-tokens/update-api-token
/openapi.json put /v1/api-tokens/{apiTokenId}
Update an existing API token, identified by its ID.
### Permissions
- `api.api-tokens.write`
# Query Async Result
Source: https://developer.mindbridge.ai/api-reference/async-results/query-async-result
/openapi.json post /v1/async-results/query
Query async results, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `type` - `STRING`
- `status` - `STRING`
- `entityId` - `OBJECT_ID`
- `entityType` - `STRING`
### Permissions
This endpoint inherits the permissions from the target entity in scope. For example, if the async result represents an **analysis source**,
then the requesting token must contain the permission: `api.analysis-sources.read`.
# Read Async Result
Source: https://developer.mindbridge.ai/api-reference/async-results/read-async-result
/openapi.json get /v1/async-results/{asyncResultId}
Read an existing async result, identified by its ID.
### Permissions
This endpoint inherits the permissions from the target entity in scope. For example, if the async result represents an **analysis source**,
then the requesting token must contain the permission: `api.analysis-sources.read`.
# Add Chunked File Part
Source: https://developer.mindbridge.ai/api-reference/chunked-files/add-chunked-file-part
/openapi.json post /v1/chunked-files/{chunkedFileId}/part
This endpoint is used to append a `chunkedFilePart` to a chunked file.
Chunked file parts must provide an `offset` and a `size` along with content. The first chunked file part must have offset `0`. You may add
the same chunked file part multiple times to retry a failed import. When retrying, you must use the same `offset` and `size`. You may add
chunked file parts out of order.
- Maximum chunked file part size: 50 MiB.
- Maximum number of chunked file parts in one file: 1000.
- Maximum overall file size: 20 GiB.
The body of the request is an HTTP form with the `Content-Type` header set to `multipart/form-data`, and contains 2 parts: `chunkedFilePart`
for the **chunk properties**, and `fileChunk` for the **data**.
The `chunkedFilePart` must have the `Content-Type` header set to `application/json` and is similar to other entity types. It specifies the
`offset` and `size` of the chunk.
The fileChunk contains the file to be imported. Its `Content-Type` header must correspond to the file’s data type.
For example, for a `.csv` file, the `Content-Type` header for the `fileChunk` should be `text/csv`.
### Permissions
- `api.file-manager.write`
# Create Chunked File
Source: https://developer.mindbridge.ai/api-reference/chunked-files/create-chunked-file
/openapi.json post /v1/chunked-files
This endpoint allows you to begin the process of importing a file in multiple chunks. Calling this endpoint returns a `{chunkedFileId}` to use
in subsequent steps.
### Permissions
- `api.file-manager.write`
# Delete Chunked File
Source: https://developer.mindbridge.ai/api-reference/chunked-files/delete-chunked-file
/openapi.json delete /v1/chunked-files/{chunkedFileId}
Deletes a pending chunked file import, identified by its ID.
### Permissions
- `api.file-manager.delete`
# Query Chunked File
Source: https://developer.mindbridge.ai/api-reference/chunked-files/query-chunked-file
/openapi.json post /v1/chunked-files/query
Queries a pending chunked file import, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `name` - `STRING`
### Permissions
- `api.file-manager.read`
# Read Chunked File
Source: https://developer.mindbridge.ai/api-reference/chunked-files/read-chunked-file
/openapi.json get /v1/chunked-files/{chunkedFileId}
Returns the state of a pending chunked file import, identified by its ID.
### Permissions
- `api.file-manager.read`
# Query Connection Tables Results
Source: https://developer.mindbridge.ai/api-reference/connection-tables-results/query-connection-tables-results
/openapi.json post /v1/connection-tables-results/query
Query connection tables results, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `connectionId` - `OBJECT_ID`
### Permissions
- `api.connections.read`
# Read Connection Tables Result
Source: https://developer.mindbridge.ai/api-reference/connection-tables-results/read-connection-tables-result
/openapi.json get /v1/connection-tables-results/{connectionTablesResultId}
Read an existing connection tables result, identified by its ID.
### Permissions
- `api.connections.read`
# Query Connection Test Results
Source: https://developer.mindbridge.ai/api-reference/connection-test-results/query-connection-test-results
/openapi.json post /v1/connection-test-results/query
Query connection test results, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `connectionId` - `OBJECT_ID`
### Permissions
- `api.connections.read`
# Read Connection Test Result
Source: https://developer.mindbridge.ai/api-reference/connection-test-results/read-connection-test-result
/openapi.json get /v1/connection-test-results/{connectionTestResultId}
Read an existing connection test result, identified by its ID.
### Permissions
- `api.connections.read`
# Create Connection
Source: https://developer.mindbridge.ai/api-reference/connections/create-connection
/openapi.json post /v1/connections
Create a new connection.
### Permissions
- `api.connections.write`
# Delete Connection
Source: https://developer.mindbridge.ai/api-reference/connections/delete-connection
/openapi.json delete /v1/connections/{connectionId}
Delete an existing connection, identified by its ID.
### Permissions
- `api.connections.delete`
# Get Data For Connection
Source: https://developer.mindbridge.ai/api-reference/connections/get-data-for-connection
/openapi.json post /v1/connections/{connectionId}/get-data
Retrieve data from a specific table in an existing connection. Requires a request body specifying the table, engagement, and optional schema
hint, filter, and pagination parameters. Returns an async result that can be polled for the data retrieval outcome. On success, the
retrieved data is stored as a Data Table entity.
### Permissions
- `api.connections.read`
- `api.data-tables.write`
# Get Tables For Connection
Source: https://developer.mindbridge.ai/api-reference/connections/get-tables-for-connection
/openapi.json post /v1/connections/{connectionId}/tables
Retrieve the list of available tables from an existing connection, identified by its ID. Returns an async result that can be polled for the table discovery outcome.
### Permissions
- `api.connections.read`
# Query Connection
Source: https://developer.mindbridge.ai/api-reference/connections/query-connection
/openapi.json post /v1/connections/query
Query connections, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `type` - `STRING`
### Permissions
- `api.connections.read`
# Read Connection
Source: https://developer.mindbridge.ai/api-reference/connections/read-connection
/openapi.json get /v1/connections/{connectionId}
Read an existing connection, identified by its ID.
### Permissions
- `api.connections.read`
# Test Connection
Source: https://developer.mindbridge.ai/api-reference/connections/test-connection
/openapi.json post /v1/connections/{connectionId}/test
Test an existing connection, identified by its ID. Returns an asynchronous result that can be polled for the test outcome.
### Permissions
- `api.connections.read`
# Create Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/create-data-catalog-entry
/openapi.json post /v1/data-catalog-entries
Create a new data catalog entry.
Data catalog entries must provide a value for the `source` field, and depending on the value used the following values are required:
- When the `source` field is set to `DATA_TABLE` the `dataTableId` field must be set to the ID of a data table accessible by the API.
- When the `source` field is set to `CONNECTION`, both `connectionId` and `tableId` must be set.
### Permissions
- `api.data-catalog-entries.write`
# Delete Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/delete-data-catalog-entry
/openapi.json delete /v1/data-catalog-entries/{dataCatalogEntryId}
Delete an existing data catalog entry, identified by its ID.
### Permissions
- `api.data-catalog-entries.delete`
# Get Data For Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/get-data-for-data-catalog-entry
/openapi.json post /v1/data-catalog-entries/{dataCatalogEntryId}/get-data
Imports the data from a data catalog entry into MindBridge, asynchronously creating a new data table. The request can specify which columns
to import, and can optionally provide a filter, a limit, an offset, and a set of sort properties to be applied when importing the data.
The data catalog entry’s source will be updated and validated before importing any data to ensure that the schema in the data catalog entry
and the request are valid. If either the data catalog entry or the request are not valid, then the request will fail.
Unlike the Validate endpoint, for `CONNECTION` sources this endpoint does not need to call the `Get Tables For Connection` endpoint, as the
underlying connection table will be refreshed directly before validation. Note that the data catalog entry's own column definitions are not
automatically updated from the connection — they reflect the schema at the time the entry was created.
### Permissions
- `api.data-catalog-entries.read`
- `api.data-tables.write`
# Query Data Catalog Entries
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/query-data-catalog-entries
/openapi.json post /v1/data-catalog-entries/query
Query data catalog entry, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECTID`
- `source` - `STRING`
### Permissions
- `api.data-catalog-entries.read`
# Read Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/read-data-catalog-entry
/openapi.json get /v1/data-catalog-entries/{dataCatalogEntryId}
Read an existing data catalog entry, identified by its ID.
### Permissions
- `api.data-catalog-entries.read`
# Update Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/update-data-catalog-entry
/openapi.json put /v1/data-catalog-entries/{dataCatalogEntryId}
Update an existing data catalog entry, identified by its ID.
### Permissions
- `api.data-catalog-entries.write`
# Validate Data Catalog Entry
Source: https://developer.mindbridge.ai/api-reference/data-catalog-entries/validate-data-catalog-entry
/openapi.json post /v1/data-catalog-entries/{dataCatalogEntryId}/validate
Validates that the schema of the data catalog entry aligns with the schema of its source.
In the case of `CONNECTION` sourced data catalog entries the connection may need to be refreshed before running validate to ensure that the
most current schema of the remote data table is being validated against. This can be done by calling the `Get Tables For Connection` endpoint,
which will update all tables related to that connection.
### Permissions
- `api.data-catalog-entries.read`
# Query Connection Tables
Source: https://developer.mindbridge.ai/api-reference/data-connection-tables/query-connection-tables
/openapi.json post /v1/connection-tables/query
Query connection tables, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `tablesResultId` - `OBJECT_ID`
- `connectionId` - `OBJECT_ID`
- `tableId` - `STRING`
### Permissions
- `api.connections.read`
# Read Connection Tables
Source: https://developer.mindbridge.ai/api-reference/data-connection-tables/read-connection-tables
/openapi.json get /v1/connection-tables/{connectionTableId}
Read an existing connection table, identified by its ID.
### Permissions
- `api.connections.read`
# Create Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/create-data-flow
/openapi.json post /v1/data-flows
Create a new data flow.
### Permissions
- `api.data-catalog-entries.write`
# Delete Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/delete-data-flow
/openapi.json delete /v1/data-flows/{dataFlowId}
Delete an existing data flow, identified by its ID.
### Permissions
- `api.data-catalog-entries.delete`
# Get Data For Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/get-data-for-data-flow
/openapi.json post /v1/data-flows/{dataFlowId}/get-data
Imports the data from a data flow into MindBridge, asynchronously creating a new data table. The request can specify which columns to
import, and can optionally provide a filter, a limit, an offset, and a set of sort properties to be applied when importing the data.
The data flow’s upstream data catalog will be updated and validated before importing any data to ensure that the schema in the data flow and
the request are valid. If either the data flow definition or the request are not valid, then the request will fail.
### Permissions
- `api.data-catalog-entries.read`
- `api.data-tables.write`
# Query Data Flows
Source: https://developer.mindbridge.ai/api-reference/data-flows/query-data-flows
/openapi.json post /v1/data-flows/query
Query data flows, optionally applying a filter.
### Permissions
- `api.data-catalog-entries.read`
# Read Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/read-data-flow
/openapi.json get /v1/data-flows/{dataFlowId}
Read an existing data flow, identified by its ID.
### Permissions
- `api.data-catalog-entries.read`
# Update Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/update-data-flow
/openapi.json put /v1/data-flows/{dataFlowId}
Update an existing data flow, identified by its ID.
### Permissions
- `api.data-catalog-entries.write`
# Validate Data Flow
Source: https://developer.mindbridge.ai/api-reference/data-flows/validate-data-flow
/openapi.json post /v1/data-flows/{dataFlowId}/validate
Validates a provided data query against an existing data flow, returning a list of errors caused by incompatibilities or mis-configuration
of the query, the data flow, or any sources that are used as part of the data flow.
Note that this does not update any schemas, such as connection tables, so users may need to use the appropriate endpoint to update those
schemas to the latest version before validation.
### Permissions
- `api.data-catalog-entries.read`
# Query Data Source Import Tasks
Source: https://developer.mindbridge.ai/api-reference/data-source-import-tasks/query-data-source-import-tasks
/openapi.json post /v1/data-source-import-tasks/query
Query data source import tasks, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECTID`
- `engagementId` - `OBJECTID`
- `state` - `STRING`
- `type` - `STRING`
- `dataSourceId`- `OBJECTID`
- `outputDataTableId` - `OBJECTID`
### Permissions
- `api.data-catalog-entries.read`
# Read Data Source Import Task
Source: https://developer.mindbridge.ai/api-reference/data-source-import-tasks/read-data-source-import-task
/openapi.json get /v1/data-source-import-tasks/{dataSourceImportTaskId}
Read an existing data source import task, identified by its ID.
### Permissions
- `api.data-catalog-entries.read`
# Export Data Table
Source: https://developer.mindbridge.ai/api-reference/data-tables/export-data-table
/openapi.json post /v1/data-tables/{dataTableId}/export
Export a data table as a CSV. Exporting returns an async result, which can then be used to return a file result.
### CSV Formatting
By default, the following CSV formatting is used:
- Comma (`,`) is used as the separator
- Double quotes (`"`) are used as the quote character
- Double quotes (`"`) are used as the quote escape character: (`""`)
- No quote escape escape value is set, as it is not needed
- All headers and values are quoted
The CSV formatting rules can be customized by setting the `csvConfiguration` field. Any values that are not changed will use their
default value.
It is strongly recommended to not use newline or whitespace characters, or to use the same characters for both the separator and quote
characters, as they may produce files that can't be read correctly.
### Inner lists
`ARRAY_STRINGS` type fields are formatted as a CSV value.
By default, they have the following formatting:
- Semicolon (`;`) is used as the separator
- Single quotes (`'`) are used as the quote character
- Single quotes (`'`) are used as the quote escape character: (`''`)
- No quote escape escape value is set, as it is not needed
- All values are quoted
In addition to the same recommendations as with CSV formatting it is also strongly recommended to not use the same characters for
formatting inner lists as are used for CSV formatting, as it may produce a file that can't be read correctly.
### Flag type formatting
`BOOLEAN_FLAGS`, `MAP_SCALARS`, and `LEGACY_ACCOUNT_TAG_EFFECTS` type fields are split into multiple columns based on the column's flags.
The field names will be formatted in the following way: `{field}_{flag}`.
### Query Restrictions
Columns with type `KEYWORD_SEARCH` or the `filterOnly` property set to `true` can't be included in data table exports. Attempting to select them as part of
`fields` will cause the export request to fail.
### Sorting Restrictions
When a `sort` is provided in the request body, it will only apply to data table exports under 2 million rows. For exports over 2 million
rows, no sorting will be applied to improve performance.
### Permissions
- `api.data-tables.read`
# Query Data Table
Source: https://developer.mindbridge.ai/api-reference/data-tables/query-data-table
/openapi.json post /v1/data-tables/query
Query data tables, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisId` - `OBJECT_ID`
- `analysisResultId` - `OBJECT_ID`
- `logicalName` - `STRING`
- `type` - `STRING`
### Permissions
- `api.data-tables.read`
# Query Data Table Data
Source: https://developer.mindbridge.ai/api-reference/data-tables/query-data-table-data
/openapi.json post /v1/data-tables/{dataTableId}/data
This endpoint allows you to load data from the data table. This data is retrieved as pages and can be sorted and filtered by a
MindBridge QL query.
## 423 Locked – Response Code
MindBridge automatically loads data table results into fast storage for querying. If you receive an **HTTP 423** response code while
querying a table, it means MindBridge is retrieving your data. Wait a few seconds before trying again.
## Paging for tables without a primary key
Some data tables, such as those loaded from a data connection, do not have a primary key. These tables are paged using a simple
offset and limit rather than the optimized cursor used for other tables. As a result:
- Ordering is not guaranteed to be stable across requests unless you supply a `sort`. Sorting on a column that contains duplicate
values may still produce an inconsistent order between pages.
- Requesting deep pages may be slower.
For consistent results, supply a `sort` on a column with unique values.
## Filter-only fields
Filter-only fields cannot be included in the `fields` or `sort` properties in a data table query, but they can be included in the `query`
property.
## Populations
If supported by your analysis, data table entries can be filtered by population, and can include an additional column to indicate all
populations that the entry appears within.
To include or exclude entries by population, use the `$population` and `$not_population` operators as part of the `query`.
For example, if you had a population with ID `"643eff00ec992f7ec42ed9f7"`, you could filter for all entries that appear within the
population.
```json
{
"query": {
"$population": "643eff00ec992f7ec42ed9f7"
},
"fields": [
"rowid",
"txid",
"debit",
"credit"
]
}
```
To include a list of populations that each entry is part of, add the `"populations"` column to the `fields` parameter.
**Note**: You cannot use the `population` field as part of a query — instead, use the `$population` and `$not_population` operators.
For example, the following body will include the `populations` column:
```json
{
"query": {},
"fields": [
"rowid",
"txid",
"populations",
"debit",
"credit"
]
}
```
### Permissions
- `api.data-tables.read`
# Read Data Table
Source: https://developer.mindbridge.ai/api-reference/data-tables/read-data-table
/openapi.json get /v1/data-tables/{dataTableId}
Read an existing data table, identified by its ID.
### Permissions
- `api.data-tables.read`
# Create Gdpdu Unpack Job
Source: https://developer.mindbridge.ai/api-reference/data-transformation/create-gdpdu-unpack-job
/openapi.json post /v1/file-manager/transform/gdpdu-unpack
Unpack and format the data files in a GDPdU archive stored in the File Manager. Returns an async result whose target is the created GDPdU
Unpack Job.
### Permissions
- `api.file-manager.write`
# Create Merge File Job
Source: https://developer.mindbridge.ai/api-reference/data-transformation/create-merge-file-job
/openapi.json post /v1/file-manager/transform/merge
Merge data from the first sheet of multiple file manager files, then generate a new file with all source data on a single sheet.
Preferred field (new): `mappings` — a list of objects, each with a `fileManagerFileId` and a `columns` array that defines how its columns map into the merged output positions.
Example (`mappings`):
```
{
"mappings": [
{"fileManagerFileId": "1234567890abcdef12345678", "columns": [0, 1, 2, 3, 4]},
{"fileManagerFileId": "2345678901bcdefa23456789", "columns": [1, 0, 2, 4, 3]}
]
}
```
Deprecated (legacy) field: `fileColumnMappings` — a map from `fileManagerFileId` to its columns array. It is still accepted for backward compatibility but will be removed in a future version.
Example (`fileColumnMappings`):
```
{
"fileColumnMappings": {
"1234567890abcdef12345678": [0, 1, 2, 3, 4],
"2345678901bcdefa23456789": [1, 0, 2, 4, 3]
}
}
```
The first mapping entry (in either format) is the master/template file and its columns array defines the output column positions. Columns are numbered from left to right, with the leftmost in a file being position 0. Each subsequent entry defines, for each output column, which column index to use from that file, allowing flexible mapping and positioning in the merged result.
### Permissions
- `api.file-manager.write`
# Create Databricks Authorization
Source: https://developer.mindbridge.ai/api-reference/databricks-authorization/create-databricks-authorization
/openapi.json post /v1/databricks-auth
Create a new Databricks authorization.
### Permissions
- `api.connections.write`
# Delete Databricks Authorization
Source: https://developer.mindbridge.ai/api-reference/databricks-authorization/delete-databricks-authorization
/openapi.json delete /v1/databricks-auth/{authorizationId}
Delete an existing Databricks authorization, identified by its ID.
### Permissions
- `api.connections.write`
# Get Databricks Authorization
Source: https://developer.mindbridge.ai/api-reference/databricks-authorization/get-databricks-authorization
/openapi.json get /v1/databricks-auth/{authorizationId}
Read an existing Databricks authorization, identified by its ID.
### Permissions
- `api.connections.read`
# Query Databricks Authorizations
Source: https://developer.mindbridge.ai/api-reference/databricks-authorization/query-databricks-authorizations
/openapi.json post /v1/databricks-auth/query
Query Databricks authorizations, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `connectionId` - `OBJECT_ID`
### Permissions
- `api.connections.read`
# Update Databricks Authorization
Source: https://developer.mindbridge.ai/api-reference/databricks-authorization/update-databricks-authorization
/openapi.json put /v1/databricks-auth
Update an existing Databricks authorization.
### Permissions
- `api.connections.write`
# Export Engagement Account Grouping
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groupings/export-engagement-account-grouping
/openapi.json post /v1/engagement-account-groupings/{engagementAccountGroupingId}/export
Export an engagement account grouping and all of its account groups as an Excel file. Exporting returns an async result,
which can then be used to return a file result.
### Permissions
- `api.engagement-account-groupings.read`
# Query Engagement Account Grouping
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groupings/query-engagement-account-grouping
/openapi.json post /v1/engagement-account-groupings/query
Query engagement account groupings, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `accountGroupingId` - `OBJECT_ID`
### Permissions
- `api.engagement-account-groupings.read`
# Read Engagement Account Grouping
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groupings/read-engagement-account-grouping
/openapi.json get /v1/engagement-account-groupings/{engagementAccountGroupingId}
Read an existing engagement account grouping, identified by its ID.
### Permissions
- `api.engagement-account-groupings.read`
# Create Engagement Account Group
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groups/create-engagement-account-group
/openapi.json post /v1/engagement-account-groups
Create a new engagement account group.
New engagement account groups must adhere to the following conditions:
- The provided code must be unique within the engagement account grouping.
- An engagement account group can have no more than three parents in its hierarchy. Setting an engagement account group's parent code such
that it would have more than three parents is not allowed.
- Lowest level engagement account groups must include a valid MAC code.
- Engagement account groups cannot be added to a MAC account grouping.
### Permissions
- `api.engagement-account-groupings.write`
# Delete Engagement Account Group
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groups/delete-engagement-account-group
/openapi.json delete /v1/engagement-account-groups/{engagementAccountGroupId}
Delete an existing engagement account group by its ID.
The following restrictions apply when deleting engagement account groups:
- Engagement account groups that are in use by an account mapping, or have child groups that are in use, cannot be deleted.
- Engagement account groups derived from a library-level account grouping cannot be deleted.
- Engagement account groups that are part of a MAC account grouping cannot be deleted.
### Permissions
- `api.engagement-account-groupings.write`
# Query Engagement Account Groups
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groups/query-engagement-account-groups
/openapi.json post /v1/engagement-account-groups/query
Query engagement account groups, optionally applying a filter.
### Required Query Restrictions
When querying engagement account groups, an `engagementAccountGroupingId` field and either an `$eq` or `$in` term must be
included. Queries without these restrictions will fail.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementAccountGroupingId` - `OBJECT_ID`
- `hidden` - `BOOLEAN`
- `code` - `STRING`
### Permissions
- `api.engagement-account-groupings.read`
# Read Engagement Account Group
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groups/read-engagement-account-group
/openapi.json get /v1/engagement-account-groups/{engagementAccountGroupId}
Read an existing engagement account group, identified by its ID.
### Permissions
- `api.engagement-account-groupings.read`
# Update Engagement Account Group
Source: https://developer.mindbridge.ai/api-reference/engagement-account-groups/update-engagement-account-group
/openapi.json put /v1/engagement-account-groups/{engagementAccountGroupId}
Update an existing engagement account group by its ID.
Updates to existing engagement account groups must adhere to the following conditions:
- Engagement account groups cannot be hidden or have their code changed if they are in use.
- Updated codes must be unique within the engagement account grouping.
- In order to ensure the integrity of the balance sheet and income statement MAC codes in the 1000, 2000, or 3000 range cannot be changed to
codes in the 4000 or 5000 range, and vice versa.
- Engagement account groups that are part of a MAC account grouping cannot be updated.
### Permissions
- `api.engagement-account-groupings.write`
# Create Engagement
Source: https://developer.mindbridge.ai/api-reference/engagements/create-engagement
/openapi.json post /v1/engagements
Create a new engagement.
### Permissions
- `api.engagements.write`
# Delete Engagement
Source: https://developer.mindbridge.ai/api-reference/engagements/delete-engagement
/openapi.json delete /v1/engagements/{engagementId}
Delete an existing engagement, identified by its ID.
### Permissions
- `api.engagements.delete`
# Query Engagement
Source: https://developer.mindbridge.ai/api-reference/engagements/query-engagement
/openapi.json post /v1/engagements/query
Query engagements, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `organizationId` - `OBJECT_ID`
- `name` - `String`
- `billingCode` - `String`
- `libraryId` - `OBJECT_ID`
- `engagementLeadId` - `OBJECT_ID`
### Permissions
- `api.engagements.read`
# Read Engagement
Source: https://developer.mindbridge.ai/api-reference/engagements/read-engagement
/openapi.json get /v1/engagements/{engagementId}
Read an existing engagement, identified by its ID.
### Permissions
- `api.engagements.read`
# Update Engagement
Source: https://developer.mindbridge.ai/api-reference/engagements/update-engagement
/openapi.json put /v1/engagements/{engagementId}
Update an existing engagement, identified by its ID.
### Permissions
- `api.engagements.write`
# Get File Info
Source: https://developer.mindbridge.ai/api-reference/file-info/get-file-info
/openapi.json get /v1/file-infos/{fileInfoId}
Read an existing file info, identified by its ID.
### Permissions
- `api.file-infos.read`
# Query File Info
Source: https://developer.mindbridge.ai/api-reference/file-info/query-file-info
/openapi.json post /v1/file-infos/query
Query file infos, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `type` - `TEXT`
### Permissions
- `api.file-infos.read`
# Create File Manager Directory
Source: https://developer.mindbridge.ai/api-reference/file-manager/create-file-manager-directory
/openapi.json post /v1/file-manager
Create a new file manager directory.
### Permissions
- `api.file-manager.write`
# Create File Manager File From Chunked File
Source: https://developer.mindbridge.ai/api-reference/file-manager/create-file-manager-file-from-chunked-file
/openapi.json post /v1/file-manager/create-from-chunked-file
This endpoint validates that all chunks of the import have been received, then completes a chunked file import, given by its ID in the
message body, and creates a **file manager file** entity.
### Permissions
- `api.file-manager.write`
# Create File Manager File From Chunked File (deprecated)
Source: https://developer.mindbridge.ai/api-reference/file-manager/create-file-manager-file-from-chunked-file-deprecated
/openapi.json post /v1/file-manager/import-from-chunked/{chunkedFileId}
This endpoint validates that all chunks of the import have been received, then completes a chunked file import, given by its ID in the URL,
and creates a **file manager file** entity.
### Permissions
- `api.file-manager.write`
# Create File Manager File From Multipart File
Source: https://developer.mindbridge.ai/api-reference/file-manager/create-file-manager-file-from-multipart-file
/openapi.json post /v1/file-manager/import
This endpoint allows you to import a file and set the properties of the resulting File Manager File entity at the same time. The body of the
request is an HTTP form with the `Content-Type` header set to `multipart/form-data`, containing 2 parts: `fileManagerFile` for the **entity
properties**, and `file` for the **file**.
The `fileManagerFile` part must have the `Content-Type` header set to `application/json` and is similar to other entity types.
The `file` part contains the file to be uploaded and its `Content-Type` header must correspond to the file’s data type. For example, for a
`.csv` file, the `Content-Type` header for the file part should be `text/csv`.
For reference, these are the content types associated with common file types:
| File extension | Content type value |
|----------------|---------------------------------------------------------------------|
| `.csv` | `text/csv` |
| `.xls` | `application/vnd.ms-excel` |
| `.xlsx` | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` |
| `.zip` | `application/zip` |
| `.gz` | `application/gzip` |
### Permissions
- `api.file-manager.write`
# Delete File Manager Entity
Source: https://developer.mindbridge.ai/api-reference/file-manager/delete-file-manager-entity
/openapi.json delete /v1/file-manager/{fileManagerEntityId}
Delete an existing **file manager entity**, identified by its ID.
### Permissions
- `api.file-manager.delete`
# Export File Manager File
Source: https://developer.mindbridge.ai/api-reference/file-manager/export-file-manager-file
/openapi.json get /v1/file-manager/{fileManagerFileId}/export
Export an existing **file manager file**, identified by its ID.
### Permissions
- `api.file-manager.read`
# Import From Data Table
Source: https://developer.mindbridge.ai/api-reference/file-manager/import-from-data-table
/openapi.json post /v1/file-manager/import-from-data-table
Create a new file manager file by exporting data from a data table. The resulting file will be a CSV file placed in the specified
file manager directory. Returns an async result that can be polled for the export outcome.
Requires both `API_DATA_TABLES_READ` and `API_FILE_MANAGER_WRITE` permissions.
### Permissions
- `api.file-manager.write`
# Import From Json Table
Source: https://developer.mindbridge.ai/api-reference/file-manager/import-from-json-table
/openapi.json post /v1/file-manager/import-from-json-table
Create a new file manager file from the imported parts of a JSON table. The resulting file will be a CSV file, and headers will appear in
the same order as the original source.
### Permissions
- `api.file-manager.write`
# Query File Manager Entity
Source: https://developer.mindbridge.ai/api-reference/file-manager/query-file-manager-entity
/openapi.json post /v1/file-manager/query
Query **file manager entities**, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `type` - `STRING`
- `engagementId` - `OBJECT_ID`
- `parentFileManagerEntityId` - `OBJECT_ID`
- `name` - `STRING`
- `originalName` - `STRING`
### Permissions
- `api.file-manager.read`
# Read File Manager Entity
Source: https://developer.mindbridge.ai/api-reference/file-manager/read-file-manager-entity
/openapi.json get /v1/file-manager/{fileManagerEntityId}
Read an existing **file manager entity**, identified by its ID.
### Permissions
- `api.file-manager.read`
# Update File Manager Entity
Source: https://developer.mindbridge.ai/api-reference/file-manager/update-file-manager-entity
/openapi.json put /v1/file-manager/{fileManagerEntityId}
Update an existing **file manager entity**, identified by its ID.
### Permissions
- `api.file-manager.write`
# Export File Result
Source: https://developer.mindbridge.ai/api-reference/file-results/export-file-result
/openapi.json get /v1/file-results/{fileResultId}/export
Export a file result, identified by its ID.
# Query File Result
Source: https://developer.mindbridge.ai/api-reference/file-results/query-file-result
/openapi.json post /v1/file-results/query
Query file results, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `fileName` - `STRING`
# Read File Result
Source: https://developer.mindbridge.ai/api-reference/file-results/read-file-result
/openapi.json get /v1/file-results/{fileResultId}
Read an existing file result, identified by its ID.
# Query Gdpdu Unpack Job
Source: https://developer.mindbridge.ai/api-reference/gdpdu-unpack-jobs/query-gdpdu-unpack-job
/openapi.json post /v1/gdpdu-unpack-jobs/query
Query GDPdU unpack jobs, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `fileManagerFileId` - `OBJECT_ID`
### Permissions
- `api.file-manager.read`
# Read Gdpdu Unpack Job
Source: https://developer.mindbridge.ai/api-reference/gdpdu-unpack-jobs/read-gdpdu-unpack-job
/openapi.json get /v1/gdpdu-unpack-jobs/{gdpduUnpackJobId}
Read a GDPdU unpack job, identified by its ID.
### Permissions
- `api.file-manager.read`
# Append
Source: https://developer.mindbridge.ai/api-reference/json-tables/append
/openapi.json post /v1/json-tables/{jsonTableId}/append
Append data to an existing JSON table. This should not be run in parallel with another append call, or when creating a
file manager file, as undefined behaviour may occur.
### Permissions
- `api.file-manager.write`
# Create
Source: https://developer.mindbridge.ai/api-reference/json-tables/create
/openapi.json post /v1/json-tables
Create a new JSON table.
### Permissions
- `api.file-manager.write`
# Read Json Table
Source: https://developer.mindbridge.ai/api-reference/json-tables/read-json-table
/openapi.json get /v1/json-tables/{jsonTableId}
Read an existing JSON Table, identified by its ID.
### Permissions
- `api.file-manager.read`
# Create Library
Source: https://developer.mindbridge.ai/api-reference/libraries/create-library
/openapi.json post /v1/libraries
Create a new library.
If the selected account grouping and the account grouping associated with the selected base library are different,
MindBridge can attempt to convert the settings (e.g., ratios, filters, populations, etc.) from the base library for use
with the accounts in the selected account grouping. To do so, set the `convertSettings` property to `true` — any
accounts that cannot be converted will be listed in the `conversionWarnings` field.
**Note**: If `warningsDismissed` is also set to `true`, these warnings will not be displayed in the UI.
Restrictions
- The industry tags for the new library must be included in the selected account grouping.
### Permissions
- `api.libraries.write`
# Delete Library
Source: https://developer.mindbridge.ai/api-reference/libraries/delete-library
/openapi.json delete /v1/libraries/{libraryId}
Delete an existing library, identified by its ID.
Restrictions
* System libraries cannot be deleted.
* Libraries in use by engagements cannot be deleted.
* Libraries that are used as the basis of other libraries cannot be deleted.
### Permissions
- `api.libraries.delete`
# Query Library
Source: https://developer.mindbridge.ai/api-reference/libraries/query-library
/openapi.json post /v1/libraries/query
Query libraries, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `basedOnLibraryId` - `OBJECT_ID`
- `originalSystemLibraryId` - `OBJECT_ID`
- `accountGroupingId` - `OBJECT_ID`
- `system` - `BOOLEAN`
- `archived` - `BOOLEAN`
### Permissions
- `api.libraries.read`
# Read Library
Source: https://developer.mindbridge.ai/api-reference/libraries/read-library
/openapi.json get /v1/libraries/{libraryId}
Read an existing library, identified by its ID.
### Permissions
- `api.libraries.read`
# Update Library
Source: https://developer.mindbridge.ai/api-reference/libraries/update-library
/openapi.json put /v1/libraries/{libraryId}
Update an existing library, identified by its ID.
Restrictions
- System libraries cannot be updated.
### Permissions
- `api.libraries.write`
# Create Organization
Source: https://developer.mindbridge.ai/api-reference/organizations/create-organization
/openapi.json post /v1/organizations
Create a new organization.
### Permissions
- `api.organizations.write`
# Delete Organization
Source: https://developer.mindbridge.ai/api-reference/organizations/delete-organization
/openapi.json delete /v1/organizations/{organizationId}
Delete an existing organization, identified by its ID.
### Permissions
- `api.organizations.delete`
# Query Organization
Source: https://developer.mindbridge.ai/api-reference/organizations/query-organization
/openapi.json post /v1/organizations/query
Query organizations, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `name` - `STRING`
- `externalClientCode` - `STRING`
### Permissions
- `api.organizations.read`
# Read Organization
Source: https://developer.mindbridge.ai/api-reference/organizations/read-organization
/openapi.json get /v1/organizations/{organizationId}
Read an existing organization, identified by its ID.
### Permissions
- `api.organizations.read`
# Update Organization
Source: https://developer.mindbridge.ai/api-reference/organizations/update-organization
/openapi.json put /v1/organizations/{organizationId}
Update an existing organization, identified by its ID.
### Permissions
- `api.organizations.write`
# Create Population
Source: https://developer.mindbridge.ai/api-reference/populations/create-population
/openapi.json post /v1/populations
Create a new population.
Engagement populations cannot be created directly, they can only be promoted from an analysis population, or inherited from a library
population.
### Permissions
- `api.libraries.write`
- `api.analyses.write`
# Delete Population
Source: https://developer.mindbridge.ai/api-reference/populations/delete-population
/openapi.json delete /v1/populations/{populationTagId}
Delete a population, identified by its ID.
Engagement populations cannot be deleted.
### Permissions
- `api.libraries.delete`
- `api.analyses.delete`
# Query Populations
Source: https://developer.mindbridge.ai/api-reference/populations/query-populations
/openapi.json post /v1/populations/query
Query populations, optionally applying a filter.
### Queryable Fields
- `id - OBJECT_ID`
- `libraryId - OBJECT_ID`
- `disabledForAnalysisIds - List`
- `promotedFromAnalysisId - OBJECT_ID`
- `engagementId - OBJECT_ID`
- `analysisId - OBJECT_ID`
- `derivedFromEngagement - BOOLEAN`
- `basePopulationId - OBJECT_ID`
- `name - STRING`
- `category - STRING`
- `disabled - BOOLEAN`
### Permissions
- `api.libraries.read`
- `api.engagements.read`
- `api.analyses.read`
# Read Population
Source: https://developer.mindbridge.ai/api-reference/populations/read-population
/openapi.json get /v1/populations/{populationTagId}
Read an existing population, identified by its ID.
### Permissions
- `api.libraries.read`
- `api.engagements.read`
- `api.analyses.read`
# Update Population
Source: https://developer.mindbridge.ai/api-reference/populations/update-population
/openapi.json put /v1/populations/{populationTagId}
Update an existing population, identified by its ID.
Engagement populations cannot be updated.
### Permissions
- `api.libraries.write`
- `api.analyses.write`
# Create Reporting Period Configuration
Source: https://developer.mindbridge.ai/api-reference/reporting-period-configuration/create-reporting-period-configuration
/openapi.json post /v1/reporting-period-config
Create a new reporting period configuration.
### Permissions
- `api.reporting-period-config.write`
# Delete Reporting Period Configuration
Source: https://developer.mindbridge.ai/api-reference/reporting-period-configuration/delete-reporting-period-configuration
/openapi.json delete /v1/reporting-period-config/{reportingPeriodConfigurationId}
Delete an existing reporting period configuration, identified by its ID.
### Permissions
- `api.reporting-period-config.delete`
# Query Reporting Period Configuration
Source: https://developer.mindbridge.ai/api-reference/reporting-period-configuration/query-reporting-period-configuration
/openapi.json post /v1/reporting-period-config/query
Query reporting period configurations, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
### Permissions
- `api.reporting-period-config.read`
# Read Reporting Period Configuration
Source: https://developer.mindbridge.ai/api-reference/reporting-period-configuration/read-reporting-period-configuration
/openapi.json get /v1/reporting-period-config/{reportingPeriodConfigurationId}
Read an existing reporting period configuration, identified by its ID.
### Permissions
- `api.reporting-period-config.read`
# Create Risk Range
Source: https://developer.mindbridge.ai/api-reference/risk-ranges/create-risk-range
/openapi.json post /v1/risk-ranges
Create a new set of risk ranges.
Risk ranges can be created at the library level, by setting an associated library ID. Risk ranges can be created at the engagement level by
setting an engagement ID. You must set at least one of these IDs to successfully create a risk range.
### Permissions
- `api.risk-ranges.write`
# Delete Risk Range
Source: https://developer.mindbridge.ai/api-reference/risk-ranges/delete-risk-range
/openapi.json delete /v1/risk-ranges/{riskRangesId}
Delete an existing set of risk ranges.
### Permissions
- `api.risk-ranges.delete`
# Query Risk Range
Source: https://developer.mindbridge.ai/api-reference/risk-ranges/query-risk-range
/openapi.json post /v1/risk-ranges/query
Query risk ranges with an optional filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `system` - `BOOLEAN`
- `engagementId` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `libraryId` - `OBJECT_ID`
### Permissions
- `api.risk-ranges.read`
# Read Risk Range
Source: https://developer.mindbridge.ai/api-reference/risk-ranges/read-risk-range
/openapi.json get /v1/risk-ranges/{riskRangesId}
Retrieve an existing set of risk ranges by its ID.
### Permissions
- `api.risk-ranges.read`
# Update Risk Range
Source: https://developer.mindbridge.ai/api-reference/risk-ranges/update-risk-range
/openapi.json put /v1/risk-ranges/{riskRangesId}
Update an existing set of risk ranges by its ID.
### Permissions
- `api.risk-ranges.write`
# Create Risk Segmentation Config
Source: https://developer.mindbridge.ai/api-reference/risk-segmentation-configs/create-risk-segmentation-config
/openapi.json post /v1/risk-segmentation-configs
Create a risk segmentation config for an analysis.
The analysis must exist. The config `name` must not already be in use for that analysis. `segments` must include
`risk_score`.
See the tag description for how to choose `segments`, `columns`, `riskScoreIds`, and `riskGroups`, and for a full
create example.
# Delete Risk Segmentation Config
Source: https://developer.mindbridge.ai/api-reference/risk-segmentation-configs/delete-risk-segmentation-config
/openapi.json delete /v1/risk-segmentation-configs/{riskSegmentationConfigId}
Delete an existing risk segmentation for an analysis, identified by its ID.
# Query Risk Segmentation Configs
Source: https://developer.mindbridge.ai/api-reference/risk-segmentation-configs/query-risk-segmentation-configs
/openapi.json post /v1/risk-segmentation-configs/query
Query risk segmentation configs, optionally applying a filter.
Filter by `analysisId` to list configs for a specific analysis run. See the tag description for field meanings.
### Queryable Fields
- `id` - `OBJECT_ID`
- `analysisId` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `enabled` - `BOOLEAN`
# Read Risk Segmentation Config
Source: https://developer.mindbridge.ai/api-reference/risk-segmentation-configs/read-risk-segmentation-config
/openapi.json get /v1/risk-segmentation-configs/{riskSegmentationConfigId}
Read an existing risk segmentation for an analysis, identified by its ID.
# Create Saved Filter
Source: https://developer.mindbridge.ai/api-reference/saved-filters/create-saved-filter
/openapi.json post /v1/saved-filters
Create a saved filter.
### Permissions
- `api.filters.write`
# Delete Saved Filter
Source: https://developer.mindbridge.ai/api-reference/saved-filters/delete-saved-filter
/openapi.json delete /v1/saved-filters/{filterId}
Delete a saved filter, identified by its ID.
### Permissions
- `api.filters.delete`
# Query Saved Filters
Source: https://developer.mindbridge.ai/api-reference/saved-filters/query-saved-filters
/openapi.json post /v1/saved-filters/query
Query saved filters, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `organizationId` - `OBJECT_ID`
- `libraryId` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
### Permissions
- `api.filters.read`
# Read Saved Filter
Source: https://developer.mindbridge.ai/api-reference/saved-filters/read-saved-filter
/openapi.json get /v1/saved-filters/{filterId}
Read a saved filter, identified by its ID.
# Update Saved Filter
Source: https://developer.mindbridge.ai/api-reference/saved-filters/update-saved-filter
/openapi.json put /v1/saved-filters/{filterId}
Update a saved filter, identified by its ID.
### Permissions
- `api.filters.write`
# Validate Saved Filter
Source: https://developer.mindbridge.ai/api-reference/saved-filters/validate-saved-filter
/openapi.json post /v1/saved-filters/validate
Validate a saved filter for correctness against the provided data table ID, returning a list of actionable errors describing
incompatibilities between the provided filter and table, if any.
Additionally mismatches between display values in the provided filter and the target data table are returned as actionable errors with
`severity` set to `WARNING`, which represent display values that are different that those in the target data table.
### Permissions
- `api.filters.read`
# Query Task History
Source: https://developer.mindbridge.ai/api-reference/task-history/query-task-history
/openapi.json post /v1/task-histories/query
Query task histories, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `taskId` - `OBJECT_ID`
### Required Query Restrictions
When querying for task history, a `taskId` field and either an `$eq` or `$in` term must be
included. Queries without these restrictions will fail.
### Permissions
- `api.tasks.read`
# Read Task History
Source: https://developer.mindbridge.ai/api-reference/task-history/read-task-history
/openapi.json get /v1/task-histories/{taskHistoryId}
Read an existing task history, identified by its ID.
### Permissions
- `api.tasks.read`
# Add Task Comment
Source: https://developer.mindbridge.ai/api-reference/tasks/add-task-comment
/openapi.json post /v1/tasks/{taskId}/add-comment
Add a comment to a task.
### Permissions
- `api.tasks.write`
# Create Task
Source: https://developer.mindbridge.ai/api-reference/tasks/create-task
/openapi.json post /v1/tasks
Create a new task.
Tasks are created on entries or transactions based on their transaction type, and row ID or transaction ID fields.
The analysis type determines which transaction types are permitted to create new tasks:
For general ledger (for-profit), general ledger (not-for-profit), and general ledger (not-for-profit with funds) analyses:
- `ENTRY`
- `TRANSACTION`
For accounts payable analyses:
- `AP_ENTRY`
- `AP_OUTSTANDING_ENTRY`
For accounts receivable analyses:
- `AR_ENTRY`
- `AR_OUTSTANDING_ENTRY`
The task type determines which of `rowId` and `transactionId` are required when creating a new task. The following table outlines which
fields must be set for a given task type:
| Type | `rowId` | `transactionId` |
|------------------------|:-------:|:---------------:|
| `ENTRY` | ✅ | ✅ |
| `TRANSACTION` | ❌ | ✅ |
| `AP_ENTRY` | ✅ | ❌ |
| `AR_ENTRY` | ✅ | ❌ |
| `AP_OUTSTANDING_ENTRY` | ✅ | ❌ |
| `AR_OUTSTANDING_ENTRY` | ✅ | ❌ |
All tasks created by this endpoint will have `sampleType` set to `MANUAL`.
### Permissions
- `api.tasks.write`
# Delete Task
Source: https://developer.mindbridge.ai/api-reference/tasks/delete-task
/openapi.json delete /v1/tasks/{taskId}
Delete an existing task, identified by its ID.
### Permissions
- `api.tasks.delete`
# Query Task
Source: https://developer.mindbridge.ai/api-reference/tasks/query-task
/openapi.json post /v1/tasks/query
Query tasks, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `engagementId` - `OBJECT_ID`
- `analysisResultId` - `OBJECT_ID`
- `analysisId` - `OBJECT_ID`
- `analysisTypeId` - `OBJECT_ID`
- `transaction` - `STRING`
- `name` - `STRING`
- `rowId` - `INT64`
- `transactionId` - `INT64`
- `status` - `STRING`
- `assignedId` - `OBJECT_ID`
- `auditAreas` - `ARRAY_STRINGS`
- `assertions` - `ARRAY_STRINGS`
- `type` - `STRING`
- `sampleType` - `STRING`
### Permissions
- `api.tasks.read`
# Read Task
Source: https://developer.mindbridge.ai/api-reference/tasks/read-task
/openapi.json get /v1/tasks/{taskId}
Read an existing task, identified by its ID.
### Permissions
- `api.tasks.read`
# Update Task
Source: https://developer.mindbridge.ai/api-reference/tasks/update-task
/openapi.json put /v1/tasks/{taskId}
Update an existing task, identified by its ID.
### Permissions
- `api.tasks.write`
# Query Transaction Id Preview
Source: https://developer.mindbridge.ai/api-reference/transaction-id-previews/query-transaction-id-preview
/openapi.json post /v1/transaction-id-previews/query
Query transaction ID previews, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `analysisSourceId` - `OBJECT_ID`
### Permissions
- `api.analysis-sources.read`
# Read Transaction Id Preview
Source: https://developer.mindbridge.ai/api-reference/transaction-id-previews/read-transaction-id-preview
/openapi.json get /v1/transaction-id-previews/{transactionIdPreviewId}
Read an existing transaction ID preview, identified by its ID.
### Permissions
- `api.analysis-sources.read`
# Create User
Source: https://developer.mindbridge.ai/api-reference/users/create-user
/openapi.json post /v1/users
Create a new user.
When creating a user, you must provide the user’s email address and a user role. The email address must not be associated with an existing
user.
The following roles may not be created with the `Create User` endpoint:
- `ROLE_MINDBRIDGE_SUPPORT`
- `ROLE_CLIENT`
Upon creation, an account activation email will be sent to the provided email address.
### Rate limit
This endpoint is subject to a maximum limit of 100 requests per hour. Once the limit is exceeded, the `X-User-Hour-Limit-Remaining` response
header will be set, and it’s value will indicate the number of seconds until the rate limit is reset.
**Note:** This rate limit is shared with the `Update User` and `Resend activation email` endpoints. Once the limit is reached, subsequent
calls to any of these endpoints will fail until the rate limit resets.
### Permissions
- `api.users.write`
# Delete User
Source: https://developer.mindbridge.ai/api-reference/users/delete-user
/openapi.json delete /v1/users/{userId}
Delete an existing user, identified by its ID.
Users with the following roles cannot be deleted:
- `ROLE_ADMIN`
- `ROLE_MINDBRIDGE_SUPPORT`
- API Token Users with the `serviceAccount` property set to `true`
### Permissions
- `api.users.delete`
# Get Current User
Source: https://developer.mindbridge.ai/api-reference/users/get-current-user
/openapi.json get /v1/users/current
Read the current user tied to the provided API token.
This endpoint is not restricted by any permissions and can be used to test the API.
# Query User
Source: https://developer.mindbridge.ai/api-reference/users/query-user
/openapi.json post /v1/users/query
Query users, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `email` - `STRING`
- `role` - `STRING`
- `enabled` - `BOOLEAN`
### Permissions
- `api.users.read`
# Read User
Source: https://developer.mindbridge.ai/api-reference/users/read-user
/openapi.json get /v1/users/{userId}
Read an existing user, identified by its ID.
### Permissions
- `api.users.read`
# Resend Activation Link
Source: https://developer.mindbridge.ai/api-reference/users/resend-activation-link
/openapi.json post /v1/users/{userId}/resend-activation-link
Send a previously invited user a new activation email.
Users who have `validated` equal to `true` or `enabled` equal to `false` cannot be sent activation emails.
### Rate limit
This endpoint is subject to a maximum limit of 100 requests per hour. Once the limit is exceeded, the `X-User-Hour-Limit-Remaining` response
header will be set, and it’s value will indicate the number of seconds until the rate limit is reset.
**Note:** This rate limit is shared with the `Create User` and `Update User` endpoints. Once the limit is reached, subsequent calls to
any of these endpoints will fail until the rate limit resets.
### Permissions
- `api.users.write`
# Update User
Source: https://developer.mindbridge.ai/api-reference/users/update-user
/openapi.json put /v1/users/{userId}
Update an existing user, identified by their user ID.
Only the `enabled` and `role` properties can be updated, with some exceptions.
The `enabled` property cannot be changed for users with the following roles:
- `ROLE_ADMIN`
- `ROLE_MINDBRIDGE_SUPPORT`
- API Token Users with the `serviceAccount` property set to `true`
The `role` property cannot be changed for users with the following roles:
- `ROLE_ADMIN`
- `ROLE_CLIENT`
- `ROLE_MINDBRIDGE_SUPPORT`
- API Token Users with the `serviceAccount` property set to `true`
### Rate limit
This endpoint is subject to a maximum limit of 100 requests per hour. Once the limit is exceeded, the `X-User-Hour-Limit-Remaining` response
header will be set, and it’s value will indicate the number of seconds until the rate limit resets.
**Note:** This rate limit is shared with the `Create User` and `Resend activation email` endpoints. Once the limit is reached, subsequent calls to
any of these endpoints will fail until the rate limit resets.
### Permissions
- `api.users.write`
# Query Webhook Event Logs
Source: https://developer.mindbridge.ai/api-reference/webhook-event-logs/query-webhook-event-logs
/openapi.json post /v1/webhook-event-logs/query
Query webhook event logs, optionally applying a filter.
### Queryable Fields
- `status` - `STRING`
- `webhookId` - `OBJECT_ID`
- `attemptStartDate` - `DATE_TIME`
- `eventType` - `STRING`
- `responseStatusCode` - `INT32`
### Permissions
- `api.webhooks.read`
# Read Webhook Event Log
Source: https://developer.mindbridge.ai/api-reference/webhook-event-logs/read-webhook-event-log
/openapi.json get /v1/webhook-event-logs/{webhookEventId}
Read an existing Webhook event log, identified by its ID.
### Permissions
- `api.webhooks.read`
# Create Webhook
Source: https://developer.mindbridge.ai/api-reference/webhooks/create-webhook
/openapi.json post /v1/webhooks
Create a new webhook.
### Permissions
- `api.webhooks.write`
# Delete Webhook
Source: https://developer.mindbridge.ai/api-reference/webhooks/delete-webhook
/openapi.json delete /v1/webhooks/{webhookId}
Delete an existing **Webhook**.
### Permissions
- `api.webhooks.delete`
# Query Webhooks
Source: https://developer.mindbridge.ai/api-reference/webhooks/query-webhooks
/openapi.json post /v1/webhooks/query
Query webhooks, optionally applying a filter.
### Queryable Fields
- `id` - `OBJECT_ID`
- `name` - `STRING`
- `url` - `STRING`
- `events` - `LIST`
### Permissions
- `api.webhooks.read`
# Read Webhook
Source: https://developer.mindbridge.ai/api-reference/webhooks/read-webhook
/openapi.json get /v1/webhooks/{webhookId}
Read an existing Webhook, identified by its ID.
### Permissions
- `api.webhooks.read`
# Update Webhook
Source: https://developer.mindbridge.ai/api-reference/webhooks/update-webhook
/openapi.json put /v1/webhooks/{webhookId}
Update an existing webhook, identified by its ID.
### Permissions
- `api.webhooks.write`
# Welcome
Source: https://developer.mindbridge.ai/dev-portal/introduction
The MindBridge Developer Portal is your central hub for building, integrating, and extending the MindBridge platform. Whether you're automating workflows, integrating with external systems, or extracting analysis results, this is where you’ll find the resources to get started.
We’re excited to support your integration journey and help you unlock the full power of MindBridge through automation and connectivity.
MindBridge API
SDKs
Available Integrations
# How to Connect
Source: https://developer.mindbridge.ai/integrations/bi/power-bi/how-to-connect
## Step 1: Generate an API Token from MindBridge
To authenticate with the API, you’ll need a Bearer token.
How to generate it:
1. Log into your MindBridge tenant.
2. Navigate to Admin → API (Admins only).
3. Click Generate New Token.
4. Name it (e.g., “Power BI Integration”).
5. Copy the token — it won’t be visible again.
Tokens can be revoked or rotated anytime from the same screen.
## Step 2: Create a Parameter in Power BI for the Token
To securely reference the token in your queries:
1. Open Power BI Desktop.
2. Go to Transform Data → Manage Parameters → New Parameter.
3. Use the following values:
* **Name:** apiToken
* **Type:** Text
* **Current Value:** Paste your token here — no “Bearer ” prefix
### Security Notes
The token is stored in plain text within the `.pbix` file — limit access accordingly.
For production or shared reports, publish to Power BI Service and configure a Gateway with securely stored credentials.
For enterprise deployments, consider using Azure Key Vault integration to securely manage secrets (Power BI Premium feature).
## Step 3: Create a Basic Test Query to Validate the Connection
This lightweight test will confirm that Power BI can connect to the MindBridge API.
1. Go to Home → Transform Data.
2. In the Power Query Editor, click Advanced Editor.
3. Paste the following M code, but replace `yourcompany` in the URL with the subdomain of your own MindBridge tenant.
```m theme={null}
let
token = "Bearer " & apiToken,
url = "https://yourcompany.mindbridge.ai/api/v1/engagements/query?page=0&size=1",
response = Web.Contents(url, [
Headers = [
#"Authorization" = token,
#"Content-Type" = "application/json"
],
Content = Text.ToBinary("{}")
]),
json = Json.Document(response)
in
json
```
You should see a JSON response — typically one item or an empty content array — confirming the connection works.
## Step 4: Set Authentication Method to Anonymous
To ensure Power BI uses your token rather than prompting for login:
1. Go to File → Options and settings → Data source settings.
2. Select or add your API domain (e.g., `https://yourcompany.mindbridge.ai`).
3. Click Edit Permissions.
4. Set Authentication Method to Anonymous.
5. Click OK.
# Overview
Source: https://developer.mindbridge.ai/integrations/bi/power-bi/overview
You can combine MindBridge data with internal systems (e.g., client portfolios, workflow apps, Power Automate) to build end-to-end audit or control monitoring dashboards.
## Use Cases
### Operational Tracking
* See how many engagements are active.
* View usage trends by month, business unit, or engagement type.
* Monitor activity (e.g., recent runs or task follow-up).
### Risk & Results Reporting
* Visualize results from risk-scored analyses (e.g., GL, TRA, PRA).
* Create charts showing risk distribution, exceptions, or flagged entries.
* Track findings and resolutions (where applicable).
# Example Use Case
Source: https://developer.mindbridge.ai/integrations/data/example-use-case
A global technology company uses Databricks as its centralized data platform, updating it nightly with ERP and operational data. To streamline workflows, they prefer MindBridge to source data directly from Databricks, reducing the need for multiple systems to access operational environments.
Using the MindBridge integration notebooks with Databricks, the company enables a fully automated, end-to-end financial analytics workflow:
* **Data preparation and transformation**\
A scheduled Databricks job prepares ERP and operational data by applying reusable, predefined transformation logic. Cleaned and structured datasets are formatted to match MindBridge requirements and pushed directly into MindBridge via API.
* **Automated analysis orchestration**\
The same Databricks Notebook automates MindBridge API calls to trigger new analyses as soon as data is ready. This orchestration ensures that every data refresh (e.g., nightly or weekly) results in timely, consistent financial analysis—without manual intervention.
* **Frictionless insights delivery**\
With automated data delivery and analysis execution, business users can access the latest results in MindBridge as part of their daily workflows. No separate data pulls or manual uploads are required.
* **Integrated risk intelligence**\
Risk scores and analysis results are programmatically retrieved via API back into Databricks. The company leverages MindBridge outputs to conduct deeper investigations and enrich internal dashboards—enabling continuous risk monitoring and integrated reporting alongside other business KPIs.
# Overview
Source: https://developer.mindbridge.ai/integrations/data/overview
MindBridge has developed a set of set of notebooks to create a streamlined integration betweeen Databricks and MindBridge. The same data workflows can be adapted for other cloud data platforms like [Snowflake](https://snowflake.com) and [Microsoft Fabric](https://www.microsoft.com/en-us/microsoft-fabric).
# Benefits
* **Operational efficiency:** Streamlines operations and eliminates the need for custom scripts.
* **Focused risk mitigation:** Enables finance teams to concentrate on reviewing and mitigating risks more effectively.
* **Seamless workflow:** Maintains consistent workflows within the Databricks environment.
# Key aspects of the integration
* **Pre-configured Python notebooks:** Access reusable Python notebooks designed to run within Databricks for tasks such as sending data to MindBridge, triggering analyses, and querying results.
* **Customization:** Easily customize these notebooks to meet specific needs, such as adjusting data frequency, integrating custom data sources, or modifying analysis parameters.
* **Resources and tutorials:** Leverage supporting documentation to help your team quickly set up and customize the notebooks for your environment.
| Name | Description |
| - | - |
| MindBridge\_E2E\_Integration\_Tutorial | Provides a how-to guide for setting up a MindBridge integration with Databricks, covering steps like setting up an Organization and Engagement, performing a General Ledger analysis, and extracting key information from analysis results. |
| MindBridge\_Explore\_GL\_Table | Provides an example of querying from a Databricks database of General Ledger data to create a file that can be leveraged as input into any MindBridge analysis. |
| MindBridge\_E2E\_Analysis\_Data\_Flow | Demonstrates a complete initial configuration of a MindBridge organization, engagement, and analysis. It includes uploading data from Databricks to MindBridge, executing an analysis, and generating a link to view results in MindBridge. |
| MindBridge\_Update\_Data\_Run\_Existing\_Analysis | Illustrates the process of updating data (e.g., adding new transactional data) from Databricks and running an existing analysis in MindBridge without modifying the original configuration. This use case supports periodic analysis needs, allowing for refreshed data insights based on the latest data updates. |
| MindBridge\_Results\_Integration\_Example | Showcases how to pull MindBridge results back into Databricks, enabling further analysis using downstream tools. This allows users to integrate MindBridge results into dashboards or reports for deeper insight and communication. |
[Download](https://github.com/mindbridge-ai/mindbridge-databricks-notebooks) the preconfigured Python notebooks for Databricks from GitHub.
Reach out to your Customer Success representative if you need assistance integrating MindBridge with your Databricks environment. We are happy to support you through the process.
# Integrations
Source: https://developer.mindbridge.ai/integrations/index
Databricks, Snowflake, Microsoft Fabric
Power BI
# Data Processing and Retention
Source: https://developer.mindbridge.ai/mcp/data-processing-and-retention
* The MindBridge MCP server operates in the same geographical region as your MindBridge environment.
* Data returned to your assistant is processed or stored according to that assistant’s configuration and provider terms, which may involve a different region.
* On *standard contract terms*, MindBridge may retain anonymized tool call inputs for 30 days, such as analysis identifiers, keyword searches, and SQL queries generated by the assistant. It does not log the analysis result rows returned to the assistant.
* If your organization has contracted out of *section 5.2* of the *standard terms*, MindBridge logs the names of tools called but does not log their inputs.
MindBridge does not control the assistant provider’s retention, processing locations, or subprocessors. Do not treat MindBridge logging as a complete record of what an assistant retrieved, stored, or shared.
MindBridge’s existing *subscriber content terms* continue to apply. For customers on *standard contract terms*, MindBridge may retain tool call inputs in anonymized form for 30 days for maintenance and product improvement, with storage and processing in the same region as the customer’s MindBridge environment. These inputs include analysis identifiers, keyword searches, and SQL queries generated by the assistant.
For customers who have contracted out of *section 5.2* of the *standard terms*, MindBridge logs the names of tools called but does not log their inputs. Consult your organization’s agreement for the terms that apply to you. These MindBridge practices are separate from the external AI provider’s handling of retrieved data.
# Explore an Analysis
Source: https://developer.mindbridge.ai/mcp/explore-an-analysis
The assistant can:
* Find analyses you can access. The recent-analysis list returns up to 50 analyses. Ask the assistant to search by name or keyword if the analysis you need is not in that list.
* Describe the tables, fields, and risk scores available in a selected analysis.
* Explain how control points score records.
* Query result rows or aggregates when you granted analysis result data access.
The connection cannot create, change, or delete MindBridge records, ingest data, run analyses, or perform Insights workflows. Continue to use MindBridge for those activities.
Answers depend on the data in the selected analysis and the permissions you granted. Wording and layout vary by assistant and environment. Use the prompts below as a starting point, then confirm the analysis and results in MindBridge.
## Find and confirm the analysis
Start by identifying the analysis you want to use. Include its name or other identifying details, and ask the assistant to confirm the analysis before retrieving results.
For example:
> Find recent general ledger analyses I can access. Show their names so I can choose one.
## Inspect the available data
Then ask about the selected analysis:
> What tables, fields, and risk scores are available in this analysis?
> Explain how this control point scores records.
## Request specific results
Once you understand the available data, request specific results. Specify the analysis, relevant fields, filters, threshold, and number of results you need:
> Show the 20 highest-risk records in this analysis. Identify the risk score used to rank them and include the available record identifiers.
> Count the records above this risk-score threshold and state the filters used.
Ask the assistant to distinguish information retrieved from MindBridge from its own interpretation.
Before you rely on a result, see [Security, Privacy, and Responsible Use](/mcp/security-privacy-and-responsible-use).
# Get Started
Source: https://developer.mindbridge.ai/mcp/get-started
Connect a compatible AI assistant to MindBridge so you can explore completed analyses with plain-language questions.
## Before you begin
You need:
* A MindBridge account with access to the completed analyses you want to explore. If you cannot see an analysis in MindBridge, MCP cannot see it either.
* MCP enabled by MindBridge for your environment (also called your tenant). MCP is not enabled by default. If it is not enabled, contact your MindBridge account team.
* A compatible AI assistant that supports remote MCP connections and OAuth sign-in. MindBridge has tested this MCP with common LLM providers such as **ChatGPT**, **Claude**, **Cursor**, and **Microsoft Copilot Studio**. Other assistants that support a remote MCP server URL and OAuth may also work. Menu names may differ by product.
* Your organization’s approval to use that assistant with the MindBridge data you intend to access.
Each user authorizes their own connection. Sign-in uses OAuth 2.1; you do not need API keys, service accounts, or shared credentials.
Read-only access does not mean the assistant cannot copy data. See [Security, Privacy, and Responsible Use](/mcp/security-privacy-and-responsible-use). For retention and regional processing, see [Data Processing and Retention](/mcp/data-processing-and-retention).
## MindBridge MCP Settings Page
You must be a MindBridge administrator to view **Settings → MCP**. On that page you can:
* Copy the **MCP server URL** for your environment. Each environment has its own URL. Connecting to the wrong URL queries that environment’s analyses.
* See **connected applications** you have authorized.
* **Revoke** access for an application you no longer need. See [Manage or Revoke Access](/mcp/manage-or-revoke-access).
If you are not an administrator, ask one for the MCP server URL for your environment. If you are an administrator and the page is still unavailable, contact your MindBridge account team to confirm that MCP is enabled.
## Connect your AI assistant
1. Sign in to **MindBridge** as an administrator and open **Settings → MCP**.
2. Copy the MCP server URL for your MindBridge environment.
3. In ChatGPT, Claude, Cursor, Microsoft Copilot, or another compatible assistant, open MCP or connector settings and add the copied URL.
4. Sign in to MindBridge when prompted, using your normal sign-in process and your organization’s existing identity controls.
5. Review the MindBridge consent screen and approve the permissions needed for your task. To use all available capabilities, grant both analysis metadata access and analysis result data access, described below.
After you connect, start with [Explore an Analysis](/mcp/explore-an-analysis).
## Access and permissions
Every request runs with your MindBridge user permissions. The assistant can access only the analyses available to you in MindBridge. Removing or restricting your access in MindBridge also affects your MCP connection.
The consent screen requests access through two read-only permissions:
* **Analysis metadata (`api.analyses.read`):** Find analyses, describe their structure, and explain control points.
* **Analysis result data (`api.data-tables.read`):** Query specific result rows or aggregates.
If you grant only metadata access, the assistant can explore analysis structure but cannot retrieve underlying result rows. There is no write permission available for this connection.
# Overview
Source: https://developer.mindbridge.ai/mcp/introduction
Model Context Protocol (MCP) is an open standard that connects AI assistants to external data and tools. MindBridge’s MCP connection lets you explore completed MindBridge analyses from a compatible AI assistant, using plain-language questions to find analyses, understand risk scoring, and retrieve specific results.
The assistant queries results directly from your MindBridge environment, so you can explore them without first exporting data or copying analysis identifiers. You do not need to write SQL to ask questions.
The connection provides **read-only access**. It cannot create, change, or delete MindBridge records, ingest data, run analyses, or perform Insights workflows. Continue to use MindBridge for those activities.
Confirm prerequisites and connect AI assistants.
Ask the assistant to find analyses and retrieve specific results.
Set who can use MCP and revoke connections you no longer need.
Understand the risks of retrieving analysis data through an assistant.
Resolve common connection and retrieval issues.
# Manage or Revoke Access
Source: https://developer.mindbridge.ai/mcp/manage-or-revoke-access
You must have the Admin role, and MCP must be enabled for your environment, to open **Admin → MCP**. Use that page to turn MCP on or off, set default scopes, add user overrides, and revoke active grants.
## MCP access
**MCP access** is the master switch for the tenant.
* **On:** Users can connect agents if allowed by your scope settings below.
* **Off:** No new connections are allowed, and all existing connections are revoked within a few minutes.
## Default scopes and user overrides
**Default scopes** set the maximum permissions users can approve for an MCP client. A user’s regular MindBridge permissions still apply in addition to the scopes they choose.
Choose one default:
* **Allow all scopes by default:** All users can use MCP within their normal MindBridge permission bounds.
* **No MCP access by default:** No users can use MCP unless you add an override. Use this for testing MCP with a subset of your users.
* **Allow specific scopes by default:** Limit the maximum scopes users can approve. For example, allow analysis metadata without analysis result data (row access).
**User overrides** are exceptions to that default. You can grant a named user all scopes, a subset of scopes, or no MCP access. Select **Add user** to choose the person. Overrides are ignored if **MCP access** is set to **Off**.
For a cautious rollout, turn **MCP access** on, set **No MCP access by default**, then add user overrides for the people who should connect.
## Active grants
**Active grants** lists each current connection: user, application domain, application name, scopes, and last used. Search the list by user or application.
To stop further MCP access through an application, revoke that grant.
Revoke a grant when someone stops using that assistant, leaves a role that should not have this access, or you notice unexpected sharing or tool behavior.
Revoking a grant stops further MCP access through that application. It does not change the user’s ability to open analyses in MindBridge, and it does not delete information already retrieved by the assistant.
Manage retained conversations, generated files, and other copies through the AI provider’s controls and your organization’s procedures.
If you notice unexpected access, sharing, or tool behavior, stop the workflow, revoke the grant, and contact your administrator or security team.
When a user is disabled in MindBridge, their connected agents automatically lose access within a few minutes.
## Save settings
Select **Save settings** after you change **MCP access**, default scopes, or user overrides. Changing a radio button without saving does not apply the policy.
Saving a tighter policy updates existing grants and removes scopes that are no longer allowed. Review the saved policy for your environment rather than assuming a default.
# Security, Privacy, and Responsible Use
Source: https://developer.mindbridge.ai/mcp/security-privacy-and-responsible-use
MCP gives a compatible AI assistant read-only access to completed analyses the signed-in user can already see in MindBridge. The main risk is not that the assistant can change MindBridge records. It is that analysis data can leave your MindBridge environment and then be processed, stored, or shared in ways MindBridge does not control. Use of MCP remains subject to your organization’s applicable agreement with MindBridge, including the Terms of Use and related service documentation. By enabling MCP access, you acknowledge that you have reviewed the considerations described on this page and are authorized by your organization to enable the connection.
Use this page for a security or acceptable-use review. Connection steps are in [Get Started](/mcp/get-started). Retention and regional processing are in [Data Processing and Retention](/mcp/data-processing-and-retention).
## Data can leave your MindBridge environment
The assistant queries results directly from your environment. Retrieved data may include sensitive transaction, vendor, employee, customer, or journal information, depending on the analysis.
After that data is returned, it is handled according to the assistant provider’s terms. That can include a different region, different retention, model training, or subprocessors. MindBridge’s data protections do not automatically extend to the external assistant. MindBridge does not operate or control third-party AI assistants.
Before you allow a connection, ensure that the provider’s data retention, model training, processing locations, and sharing practices meet your organization’s requirements. Your organization’s approval to use an assistant is separate from the consent an individual grants when they connect.
## Access is read-only in MindBridge, not elsewhere
The connection cannot create, change, or delete MindBridge records, ingest data, run analyses, or perform Insights workflows. There is no write permission for this connection.
Read-only access still allows the assistant to retrieve and reproduce data. If the same assistant can send email, create documents, or publish content, it may share retrieved information through those tools. Review the assistant’s other connections and do not pair MCP with tools that send or publish automatically unless your organization has approved that combination.
Analysis field values are source data, not instructions. A transaction description or other retrieved text can contain wording that tries to redirect the assistant, for example by asking it to send data elsewhere. Treat that text as data. Do not treat it as permission to act.
## Who can connect, and what they can see
MCP is not enabled by default. An App Admin must enable the global toggle on the settings screen. Each user then authorizes their own connection with OAuth 2.1, using their normal sign-in and your organization’s existing identity controls. You do not need API keys, service accounts, or shared credentials.
Every request runs with that user’s MindBridge permissions. The assistant can access only the analyses available to that user. Restricting or removing their MindBridge access also restricts the connection.
Users choose which read-only permissions to grant:
* **Analysis metadata** to find analyses, describe their structure, and explain control points.
* **Analysis result data** to query specific result rows or aggregates.
Granting only metadata access limits the assistant to structure and explanations. It cannot retrieve underlying result rows.
## What MindBridge logs, and what it does not delete
MindBridge logging of MCP use is limited and depends on your contract. For customers on *standard terms*, MindBridge may retain anonymized tool call inputs for 30 days, such as analysis identifiers, keyword searches, and SQL generated by the assistant. If your organization has contracted out of *section 5.2* of the *standard terms*, MindBridge logs tool names but not their inputs. See [Data Processing and Retention](/mcp/data-processing-and-retention).
Do not assume MindBridge logging is a complete record of what an assistant retrieved, stored, or shared. Copies in conversations, generated files, and the provider’s systems are outside MindBridge.
Revoking a connection in **Admin → MCP** stops further access through that application. It does not delete information already retrieved. Manage those copies through the AI provider’s controls and your organization’s procedures. See [Manage or Revoke Access](/mcp/manage-or-revoke-access).
## Answers can be wrong or incomplete
An assistant may misinterpret a field, apply an incorrect filter, summarize only part of an analysis or generate conclusions that are not fully supported by the underlying analysis results. Before relying on an answer:
* Confirm that it used the intended analysis, risk score, and filters.
* Check whether the result is a limited list or represents all relevant records.
* Verify important figures and explanations against the analysis in MindBridge.
* Review generated content before sharing it or using it in reports or audit documentation.
A high-risk score alone is not evidence of fraud, error or non-compliance. Use MindBridge results alongside the analysis context and your professional judgment.
MindBridge is responsible for operating the MCP Server and enforcing access controls within MindBridge. Customers are responsible for selecting and governing their AI assistant and reviewing AI-generated responses for their intended use.
# Troubleshooting
Source: https://developer.mindbridge.ai/mcp/troubleshooting
## FAQs
### I cannot find MCP settings.
Contact your MindBridge administrator or account team to confirm availability. MindBridge must enable MCP for your environment before you can connect.
### My assistant cannot connect.
Check that you used the URL copied from MindBridge, that the assistant supports remote MCP and OAuth, and that you completed sign-in and consent.
### I cannot find an analysis.
Confirm that you can access it in MindBridge and that it has completed. Ask the assistant to search by name or keyword; the recent-analysis list returns up to 50 analyses.
### The assistant finds an analysis but cannot retrieve its result data.
Check that you granted analysis result data access as well as analysis metadata access. If needed, reconnect and review the requested permissions.
### An answer appears incorrect or incomplete.
Ask the assistant to identify its analysis, fields, filters, and result limits, then compare the answer with MindBridge.
## Get Help
Your MindBridge account team can walk you through the connection, arrange a demonstration using your analyses, or provide more information for your organization’s security review.
# Versioned notes
Source: https://developer.mindbridge.ai/release-notes/versioned-notes
# Release 26.09
## v1.8.6
### Risk segmentation configs
Adds a new entity, risk segmentation config, which stores saved views for the Risk Segmentation dashboard on an analysis. Each config
describes how results should be broken down (the segments), which summary columns appear in the table, and optional dashboard filters.
Configs belong to one analysis. There is no update operation; to change a config, delete it and create a new one.
* Adds a new `POST /risk-segmentation-configs` endpoint, which creates a new risk segmentation config.
* Adds a new `GET /risk-segmentation-configs/{riskSegmentationConfigId}` endpoint, which returns a risk segmentation config identified by
its ID.
* Adds a new `POST /risk-segmentation-configs/query` endpoint, which queries risk segmentation configs based on a provided filter.
* Adds a new `DELETE /risk-segmentation-configs/{riskSegmentationConfigId}` endpoint, which deletes a risk segmentation config identified by
its ID.
### GDPdU unpack jobs
Adds a new entity, GDPdU unpack job, which records asynchronous archive unpack operations and the File Manager files and directories they
create. Unpack jobs are started from the File Manager transform endpoint and can be read or queried afterward.
* Adds a new `POST /file-manager/transform/gdpdu-unpack` endpoint, which starts unpacking a GDPdU archive stored in File Manager and returns
an async result whose target is the created GDPdU unpack job.
* Adds a new `GET /gdpdu-unpack-jobs/{gdpduUnpackJobId}` endpoint, which returns a GDPdU unpack job identified by its ID.
* Adds a new `POST /gdpdu-unpack-jobs/query` endpoint, which queries GDPdU unpack jobs based on a provided filter.
### Webhooks
* Adds connection webhook events: `connection.created`, `connection.deleted`, `connection.data.complete`, and `connection.test.complete`.
* Removes the `data.added` webhook event. Connection data transfer completion is now reported as `connection.data.complete`.
* Adds MCP webhook events: `mcp.grant.approved`, `mcp.grant.denied`, `mcp.grant.revoked`, and `mcp.admin-settings.updated`.
* The `mcp.admin-settings.updated` payload `userOverrides` field lists user IDs whose MCP override was added, changed, or removed.
# Release 26.08
## v1.8.5
### Data flows
Adds a new entity, data flow, which transforms data from a data catalog entry. The source catalog is identified by
`inputDataCatalogEntryId`, and transformations are applied in order by the `operations` list. The first supported operation type is
`REMAP`, which renames or duplicates columns. Data flows can be queried for data or used as a data catalog source.
* Adds a new `POST /data-flows` endpoint, which creates a new data flow.
* Adds a new `GET /data-flows/{dataFlowId}` endpoint, which returns a data flow identified by its ID.
* Adds a new `PUT /data-flows/{dataFlowId}` endpoint, which updates a data flow identified by its ID.
* Adds a new `POST /data-flows/query` endpoint, which queries data flows based on a provided filter.
* Adds a new `DELETE /data-flows/{dataFlowId}` endpoint, which deletes a data flow identified by its ID.
* Adds a new `POST /data-flows/{dataFlowId}/validate` endpoint, which validates a data query against a data flow, returning any validation
errors.
* Adds a new `POST /data-flows/{dataFlowId}/get-data` endpoint, which imports data from a data flow into a data table.
### Data catalog entry
* Data catalog entries can now use a data flow as a source. These entries must set `source` to `DATA_FLOW` and provide a valid `dataFlowId`.
Circular dependencies between data flows and catalogs are rejected.
* Added `precision` and `scale` fields to data catalog entry columns. `precision` is returned on read; `scale` can be set on create and
update.
### Connections
* The Connection get-data endpoint now also requires the `api.data-tables.write` permission.
* Added `precision` and `scale` fields to the Tabular Schema Column model. `precision` is returned on read; `scale` can be set on create.
# Release 26.07
## v1.8.5
### Data catalog entry
Adds a new entity, data catalog entry, which can be used to model remote and local data for use in MindBridge. Data can be imported from a
remote or local source through a data catalog. Each import creates a Data Source Import Task entity that tracks the status of the import job.
* Adds a new `POST /data-catalog-entries` endpoint, which creates a new data catalog entry.
* Adds a new `GET /data-catalog-entries/{dataCatalogEntryId}` endpoint, which returns a data catalog entry identified by its ID.
* Adds a new `PUT /data-catalog-entries/{dataCatalogEntryId}` endpoint, which updates a data catalog entry identified by its ID.
* Adds a new `POST /data-catalog-entries/query` endpoint, which queries data catalog entries based on a provided filter.
* Adds a new `DELETE /data-catalog-entries/{dataCatalogEntryId}` endpoint, which deletes a data catalog entry identified by its ID.
* Adds a new `POST /data-catalog-entries/{dataCatalogEntryId}/validate` endpoint, which validates a data catalog entry's source
configuration, returning any validation errors.
* Adds a new `POST /data-catalog-entries/{dataCatalogEntryId}/get-data` endpoint, which retrieves data from the data catalog entry's source.
* Adds a new `GET /data-source-import-tasks/{dataSourceImportTaskId}` endpoint, which returns a data source import task identified by its ID.
* Adds a new `POST /data-source-import-tasks/query` endpoint, which queries data source import tasks based on a provided filter.
### Connection data source
The Connection Data Source entity and its endpoints have been removed and replaced by the Data Catalog feature.
### Data tables
* The Query Data Table endpoint accepts a query string parameter, `include-unstable-schemas=true`, to allow querying unstable table schema.
Unstable table schema may be removed or modified in future versions.
* Added `apiStability` field to the data table entity, indicating whether a table's schema is stable or may change in future API versions.
This field is queryable.
* The Data Table Data endpoint maximum page size has been increased from 100 to 2000.
### Connections
* The `name` field on the Connection entity is now queryable.
* Added `sortProperties` field to the Connection get-data request, allowing callers to specify sort order when retrieving data.
* Added `displayName` and `description` fields to the Tabular Schema and Tabular Schema Column models, providing richer metadata for
connection table schemas.
### Analysis source
* The Update Analysis Source endpoint now validates the workflow state before allowing updates. Updates are only permitted when the source
is in one of the following states: `FORMAT_DETECTED`, `COLUMNS_ANALYZED`, `DATA_VALIDATION_CONFIRMED`,
`EFFECTIVE_DATE_METRICS_ANALYZED`, `INTEGRITY_CHECKED`, `PARSED`, or `FUNDS_REVIEWED`.
* The Update and Delete Analysis Source endpoints now reject requests when asynchronous jobs are in progress for the source.
### Async results
* Added `DATA_SOURCE_IMPORT_TASK` as a new async result entity type, used to track data catalog import operations.
### Webhooks
* Simplified webhook URL restrictions. URLs must use HTTPS, use a fully qualified hostname, and must not use an IP address.
# Release 26.05
## v1.8.4
### Engagements
* Added `emailSubscriptions` field to Engagement. This field links subscriptions to users, and is required on update.
### Analysis Source
* Added presetHeaderRowIndex to Analysis Source. This field enables explicit header row declaration, which enables the overriding the automatic header detection algorithm.
### Connections
* Added `name` field to Connections. This required field provides a user-readable name for the external data source connection.
### Validation Strictness
* Increased validation across multiple entities (Engagement, Analysis Source, File Manager, Filters):
* String fields that accept values now require at least one non-blank character.
* Array fields that accept collections now require at least one element.
* Some existing payloads containing empty strings or empty arrays may now fail validation.
# Release 26.03
## v1.8.3
### Admin reports
* Adds new `POST /admin-reports/analysis-overview-report/run` endpoint – The Analysis overview report lists analyses and the associated risk score results.
### Connections
Adds a new set of entities for managing external data source connections (such as Databricks), allowing users to connect to external databases, test connectivity, discover available tables, and retrieve data for use in MindBridge.
* Adds a new `POST /connections` endpoint, which creates a new connection.
* Adds a new `GET /connections/{connectionId}` endpoint, which returns a connection identified by its ID.
* Adds a new `POST /connections/query` endpoint, which queries connections based on a provided filter.
* Adds a new `DELETE /connections/{connectionId}` endpoint, which deletes a connection identified by its ID.
* Adds a new `POST /connections/{connectionId}/test` endpoint, which tests connectivity for a connection.
* Adds a new `POST /connections/{connectionId}/tables` endpoint, which discovers available tables from a connection.
* Adds a new `POST /connections/{connectionId}/get-data` endpoint, which retrieves data from a specific table in a connection.
### Databricks Authorization
Adds a new entity for managing Databricks connection credentials and authentication configuration.
* Adds a new `POST /databricks-auth` endpoint, which creates a new Databricks authorization.
* Adds a new `GET /databricks-auth/{authorizationId}` endpoint, which returns a Databricks authorization identified by its ID.
* Adds a new `PUT /databricks-auth` endpoint, which updates a Databricks authorization.
* Adds a new `DELETE /databricks-auth/{authorizationId}` endpoint, which deletes a Databricks authorization identified by its ID.
* Adds a new `POST /databricks-auth/query` endpoint, which queries Databricks authorizations based on a provided filter.
### Connection Test Results
Adds a new read-only entity for viewing the results of connection test operations.
* Adds a new `GET /connection-test-results/{connectionTestResultId}` endpoint, which returns a connection test result identified by its ID.
* Adds a new `POST /connection-test-results/query` endpoint, which queries connection test results based on a provided filter.
### Connection Tables Results
Adds a new read-only entity for viewing the results of table discovery operations on connections.
* Adds a new `GET /connection-tables-results/{connectionTablesResultId}` endpoint, which returns a connection tables result identified by its ID.
* Adds a new `POST /connection-tables-results/query` endpoint, which queries connection tables results based on a provided filter.
### Connection Tables
Adds a new read-only entity for viewing individual tables discovered from a connection.
* Adds a new `GET /connection-tables/{connectionTableId}` endpoint, which returns a connection table identified by its ID.
* Adds a new `POST /connection-tables/query` endpoint, which queries connection tables based on a provided filter.
### Connection Data Sources
Adds a new entity for registering specific tables from a connection for use in MindBridge.
* Adds a new `POST /connection-data-source` endpoint, which creates a new connection data source.
* Adds a new `GET /connection-data-source/{connectionDataSourceId}` endpoint, which returns a connection data source identified by its ID.
* Adds a new `POST /connection-data-source/query` endpoint, which queries connection data sources based on a provided filter.
* Adds a new `DELETE /connection-data-source/{connectionDataSourceId}` endpoint, which deletes a connection data source identified by its ID.
* Adds a new `POST /connection-data-source/{connectionDataSourceId}/get-data` endpoint, which retrieves data from a connection data source.
### File Manager
* Adds a new `POST /file-manager/import-from-data-table` endpoint, which creates a new file manager file by exporting data from a data table as a CSV file.
# Release 25.11
## v1.8.2
### General validation
Several changes were made to make validation more strict, and remove invalid or impossible combinations.
* Many required fields now require at least one nonblank character or entry be submitted to be valid.
* Many types cleaned up to only accept one type of value, instead of a large list of types.
* Many fields restricted to be integers or strings as appropriate.
* Discriminators added to better restrict types, instead of being overly permissive.
* Defaults added to many types, especially when there is only one valid type, making it optional in those cases.
### Analysis
* Optional `reportingPeriodConfigurationId` field added. If not included, the analysis inherits the reporting period configuration from
the engagement. If the engagement has no custom configuration, the analysis uses a standard reporting period.
### Analysis source
* New workflow states have been added: `SCANNING_TRANSACTION_COMBINATIONS`, `PARSING_ICEBERG`, `PREPARING_ICEBERG`.
### Data Tables
* For data table exports larger than 2 million rows, sorting is disabled to improve performance.
### File manager
* Adds new `POST /file-manager/create-from-chunked-file` endpoint, which completes a chunked file import, given by its ID in the message body, and creates a file manager file entity.
* Deprecated `POST /file-manager/import-from-chunked-file/{chunked-file-id}`, due to using nonstandard path parameters.
### Filter group condition
* Added required `conditions` property, listing the entries within the condition group.
### Libraries
* Allow analysis types to be added or removed from in-use libraries
### Reporting periods
* Adds new `POST /reporting-period-config endpoint`, which creates a reporting period configuration.
* Adds new `GET /reporting-period-config endpoint`, which reads an existing reporting period template entity, identified by its ID.
* Adds new `DELETE /reporting-period-config/{reportingPeriodConfigurationId}` endpoint to delete an existing configuration, identified by
its ID.
* Adds new `POST /reporting-period-config/query` endpoint, which queries existing configuration on id, type, name, or originalName.
* Added `reportingPeriodConfigurationId` property to the Analysis and Engagement model. This can replace `accountingPeriod`, but one of the two are required.
* `reporting-period-config` permissions added.
### Run activity report request
* PROCEDURE\_INSTANCE added as item type.
* Correctly report errors when required `start` and `end` fields are not present.
### Saved filters
* Changes to types, restricting acceptable values, such as removing BETWEEN as a valid monetaryValueType for Filter Monetary Value Condition, but being the only valid type for Filter Monetary Range Condition.
### Webhooks
* Added field `role` to the user.invited and user.role webhook payloads.
* Adds webhook payload information for more types to the OpenAPI specification describing how to receive and authenticate webhook payloads sent by MindBridge.
* Webhooks can no longer be EXPIRED.
# Release 25.09
## v1.8.1
### Webhooks
* Added eventId to the webhook payload, deprecated the usage of it within the data object.
* Added tenantId to the webhook payload
* Adds new analysis, engagement and user webhook events.
### Webhook event logs
Adds a new entity, Webhook event logs, that provides a log of all the attempts to deliver webhooks to third party services. This includes in progress requests,
as well as completed and failed requests.
* Adds a new `GET /webhook-event-logs/{webhookEventLogId}` endpoint, which returns a webhook event log identified by its ID.
* Adds a new `POST /webhook-event-logs/query` endpoint, which queries webhook event logs based on a provided filter.
# Release 25.07
## v1.8.0
### Webhooks
Adds a new set of endpoints for managing the Webhooks entity, which allows users to manage webhook configurations.
* Adds a new `GET /webhooks/{webhookId}` endpoint, which returns a webhook identified by its ID.
* Adds a new `POST /webhooks` endpoint, which creates a new webhook entity.
* Adds a new `PUT /webhooks/{webhookId}` endpoint, which updates a webhook entity identified by its ID.
* Adds a new `DELETE /webhooks/{webhookId}` endpoint, which deletes a webhook entity identified by its ID.
* Adds a new `POST /webhooks/query` endpoint, which queries webhooks based on a provided filter.
* Adds webhook payload information to the OpenAPI specification, and API Reference, describing how to receive and authenticate webhook payloads sent by
MindBridge.
### File Infos
Adds a new set of endpoints for the *File Info* entity, which allows users to view the metadata of files related to analysis sources and
file manager files.
* Adds a new `GET/file-info/{fileInfoId}` endpoint, which returns a file info identified by its id.
* Adds a new `POST/file-info/query` endpoint, which queries file infos based on a provided filter.
### Analysis source
Deprecates the existing `fileInfo` field on the analysis source, adding in links to file info and file manager fields.
* Deprecates the `fileManagerFileId` and `fileInfo` fields of the analysis source entity, replacing them with the `fileInfoVersions` and `fileManagerFiles`
fields.
* Adds a new `fileInfoVersions` field to analysis source, which provides a map of the available file infos related to the analysis source. This replaces the
fileInfo field.
* Adds a new `fileManagerFiles` field to analysis source, which provides a map of the available file manager files related to the analysis source. This replaces
the current `fileManagerFileId`, which only linked to the latest file manager file.
### File Manager
Adds a new `fileInfoId` field, providing access to the related file info entity.
* Adds a new field `fileInfoId` to the file manager file entity, identifying the associated file info.
### Transaction ID Preview
Fixes some bugs with the Transaction ID Preview entity.
* Deprecates the `engagementId` and `analysisId` fields.
* Fixes an issue where the `analysisSourceId`, `columnSelection`, `type` and `smartSplitter` fields were not being set correctly.
# Release 25.05
## v1.7.0
### Filters
Adds a new entity, *Saved Filter*, which allows users to manage saved library, organization, engagement and private filters.
* Adds a new `GET /saved-filters/{savedFilterId}` endpoint, which returns a saved filter identified by its ID.
* Adds a new `POST /saved-filters` endpoint, which creates a new saved filter entity.
* Adds a new `PUT /saved-filters/{savedFilterId}` endpoint, which updates a saved filter entity identified by its ID.
* Adds a new `DELETE /saved-filters/{savedFilterId}` endpoint, which deletes a saved filter entity identified by its ID.
* Adds a new `POST /saved-filters/query` endpoint, which queries saved filters based on a provided filter.
* Adds a new `POST /saved-filters/validate` endpoint, which returns a list of errors and warnings if the saved filter cannot be applied to
the specified data table.
### Populations
Adds new functionality to the *Populations* entity, allowing users to create, update, and delete populations.
* Adds a new `POST /populations` endpoint, which creates a new population entity.
* Adds a new `PUT /populations/{populationId}` endpoint, which updates a population entity identified by its ID.
* Adds a new `DELETE /populations/{populationId}` endpoint, which deletes a population entity identified by its ID.
* The following fields have been added to the population entity: `analysisTypeId`, `condition`, `legacyFilterFormat`, `displayCurrencyCode`
and `displayLocale`.
### Risk ranges
Adds a new entity, *Risk Range*, which enables customizing the low, medium, and high risk thresholds for their related risk scores.
* Adds a new `GET /risk-ranges/{riskRangeId}` endpoint, which returns a risk range identified by its ID.
* Adds a new `POST /risk-ranges` endpoint, which creates a new risk range entity.
* Adds a new `PUT /risk-ranges/{riskRangeId}` endpoint, which updates a risk range entity identified by its ID.
* Adds a new `DELETE /risk-ranges/{riskRangeId}` endpoint, which deletes a risk range entity identified by its ID.
* Adds a new `POST /risk-ranges/query` endpoint, which queries risk ranges based on a provided filter.
### Analysis type configuration
Adds a new entity, *Analysis Type Configuration*, which can be used to configure analysis settings at the library, engagement, and analysis
level.
* Adds a new `GET /analysis-type-configuration/{analysisTypeConfigurationId}` endpoint, which returns an analysis type configuration
identified by its
ID.
* Adds a new `PUT /analysis-type-configuration/{analysisTypeConfigurationId}` endpoint, which updates an analysis type configuration entity
identified by its ID.
* Adds a new `POST /analysis-type-configuration/query` endpoint, which queries analysis type configurations based on a provided filter.
### Engagement account groups
Adds new endpoints allowing for the creation, updating, and deletion of engagement account groups.
* Adds a new `POST /api/v1/engagement-account-groups` endpoint, which creates a new engagement account group.
* Adds a new `PUT /api/v1/engagement-account-groups/{engagementAccountGroupId}` endpoint, which updates an engagement account groups.
* Adds a new `DELETE /api/v1/engagement-account-groups/{engagementAccountGroupId}` endpoint, which deletes an engagement account group.
* The field `hidden` can now be used as part of a query filter.
### Data tables
Adds new fields to the data table column model:
* `mindBridgeField` - The MindBridge Field name this column is mapped to.
* `typeaheadDataTableId` - The ID of the typeahead table this column is related to.
### Engagements
* Removes `subscribedUserIds` field.
### Libraries
* Adds a new `riskRangeEditPermission` field, which informs if risk scores within this library can have their risk ranges adjusted.
# Q1 Release 2025
## v.1.6.1
### Libraries
The industry tags field (`industryTags`) has been removed from the library creation endpoint.
### Account groups
The industry tags field (`industryTags`) has been removed from the account group update endpoint.
# Q4 Release 2024
## v1.6.0
### Tasks
Adds the following new fields to the Task model:
* `taskApprovalStatus` - The approval status of the task.
* `dueDate` - The due date of the task.
* `approvalId` - The ID of the approval associated with the task.
* `tags` - classification tags for the task.
* `amounts` - dollar value amounts associated with the task.
### Task History
Adds a new entity, *Task History*, to store the history of task changes.
* Adds a new `GET /task-histories/{taskHistoryId}` endpoint, which returns a task history entity identified by its ID.
* Adds a new `POST /task-histories/query` endpoint, which queries task histories results based on a given filter.
### Users
* Adds a new field, `recentLogins`, which shows when and via which IP the account was last used.
# Q3 Release 2024
## v1.5.0
### Analysis Results
A new entity, *Analysis Result*, has been added. This entity is the new primary entity for storing analysis results (currently limited to
`data tables` and `tasks`). Now, instead of being limited to viewing only the most recent analysis results, the results from multiple runs
of a given analysis can be accessed. This enhancement allows for a comprehensive history of analysis runs, and improves tracking of changes
over time.
* Adds a new `GET /analysis-results/{analysisResultsId}` endpoint, which returns an analysis result entity identified by its ID.
* Adds a new `POST /analysis-results/query` endpoint, which queries analysis results based on a given filter.
### Tasks
* Adds a new field to tasks called `analysisResultId`, which is queryable.
* Removes the requirement to include an `analysisId` term when querying tasks.
### Data Tables
* Adds a new field to data tables called `analysisResultId`, which is queryable.
* Removes the requirement to include an `analysisId` term when querying data tables.
### Account Mappings
A new entity, *Account Mapping*, has been added. This entity represents mappings between the accounts in General Ledger
and Chart of Accounts file types to MindBridge Account Classification (MAC) codes. These must be configured and
validated before running General Ledger analyses.
* Adds a new `GET /account-mapping/{accountMappingId}` endpoint, which returns an account mapping entity identified by
its ID.
* Adds a new `POST /account-mapping/query` endpoint, which queries account mappings based on a given filter.
* Adds a new `PUT /account-mapping/{accountMappingId}` endpoint, which updates an account mapping entity identified by
its ID.
* Adds a new `POST /account-mapping/verify` endpoint, which verifies all account mappings within the given engagement.
* Adds a new `POST /account-mapping/delete-unused` endpoint, which deletes all unused account mappings of a given
engagement.
### Engagement Account Group
A new entity, *Engagement Account Group*, has been added to provide access to the account groups within engagement account groupings.
* Adds a new `GET /engagement-account-groups/{engagementAccountGroupId}` endpoint, which returns an engagement account
group identified by its ID.
* Adds a new `POST /engagement-account-groups/query` endpoint, which queries engagement account groups given a filter.
### JSON Tables
A new entity, *JSON Table*, has been added, which provides the ability to import data from a JSON-based source.
* Adds a new `GET /json-tables/{jsonTableId}` endpoint, which returns a JSON table entity identified by its ID.
* Adds a new `POST /json-tables` endpoint, which allows for the creation of a new JSON table.
* Adds a new `POST /json-tables/{jsonTableId}/append` endpoint, which allows data to be appended to an existing JSON
table entry.
* Adds a new `POST /file-manager/import-from-json-table` endpoint, which enables creating a new file manager file from
the data imported to a JSON table entry.
### File Manager Data Transformation: Merge Files
* Adds a new `POST /file-manager/transform/merge` endpoint, which merges data from various file sources and creates a consolidated file with
the aggregated data.
### Other
* Marked some fields on the Page entity as deprecated, to be removed in a future release.
* Platform-level rate limits provide additional protection on a per-IP address basis, but are set high enough that they should not be
encountered during regular use. If the HTTP status `429` is returned, requests can be retried after approximately 30 seconds. Refer to the
*Rate Limits* section of the API reference document for more information.
# Q2 Release 2024
## v1.4.1
### Libraries
* Adds a new field to the Library model, `riskScoreAndGroupsSelectionPermission`.
### Data Tables
* Adds a new field to the Data Table Column model, `originalName`.
## v1.4.0
### Account Groupings and Account Groups
Two new entities, Account Groupings and Account Groups, have been added. These entities are used to map a set of
accounts in a financial hierarchy to MindBridge Account Classification (MAC) codes for use in analyses and reports.
* Adds new `GET /account-groupings/{accountGroupingId}` endpoint, which returns an account grouping identified by its
ID.
* Adds new `PUT /account-groupings/{accountGroupingId}` endpoint, which updates an account grouping identified by its
ID.
* Adds new `DELETE /account-groupings/{accountGroupingId}` endpoint, which deletes an account grouping identified by its
ID.
* Adds new `POST /account-groupings/query` endpoint, which queries account groupings given a filter.
* Adds new `POST /account-groupings/export` endpoint, which exports an account grouping and all of its account groups
within an Excel file.
* Adds new `POST /account-groupings/import-from-chunked-file` endpoint, which creates a new account grouping and account
groups based on a provided Excel file.
* Adds new `POST /account-groupings/{accountGroupingId}/append-from-chunked-file` endpoint, which adds new account
groups to an existing account grouping based on a provided Excel file.
* Adds new `GET /account-groups/{accountGroupId}` endpoint, which returns an account group identified by its ID.
* Adds new `POST /account-groups/query` endpoint, which queries account groups given a filter.
* Adds new `PUT /account-groups/{accountGroupId}` endpoint, which updates an account group identified by its ID.
### Engagement Account Groupings
A new entity, Engagement Account Grouping, has been added. This entity is the parent record to Engagement Account
Groups, which are used to map accounts to MindBridge Account Classification (MAC) codes for use in analyses and reports
in the context of an Engagement.
* Adds new `GET /engagement-account-groupings/{engagementAccountGroupingId}` endpoint, which returns an engagement
account grouping identified by its ID.
* Adds new `POST /engagement-account-groupings/query` endpoint, which queries engagement account groupings given a
filter.
* Adds new `POST /engagement-account-groupings/export` endpoint, which exports an engagement account grouping and all of
its account groups within an Excel file.
# Q1 Release 2024
## v1.3.1
### Analysis Source Types
* Adds new `mindbridgeFieldNameForNonMacGroupings` and `requiredForNonMacGroupings` fields to document exceptional cases
where a MindBridge column name and required status may change dependent on if a MAC based account grouping is being
used as part of an analysis.
## v1.3.0
### Analysis Types
A new entity, Analysis Type, has been added. This describes the features of an analysis, as well as the source types
used as part of the analysis. This replaces the table of analysis types in the "Analysis" section of the API
documentation.
* Adds new `GET /analysis-types/{analysisTypeId}` endpoint, which returns an analysis type identified by its id.
* Adds new `POST /analysis-types/query` endpoint, which queries analysis types given a filter.
### Analysis Source Types
A new entity, Analysis Source Type, has been added. This describes the steps required when ingesting a source with this
type, as well as the column mappings. This replaces the table of analysis source types in the "Analysis Source" section
of the API documentation.
* Adds new `GET /analysis-source-types/{analysisTypeId}` endpoint, which returns an analysis source type identified by
its id.
* Adds new `POST /analysis-source-types/query` endpoint, which queries analysis source types given a filter.
### Analysis
* Adds new `POST /analyses/engagement-roll-forward` endpoint, which allows for the creation of a new analysis from an
existing analysis that's part of another engagement.
### Libraries
* Adds new `POST /libraries/` endpoint, which allows for the creation of a new library.
* Adds new `PUT /libraries/{libraryId}` endpoint, which allows for the updating of a library.
* Adds new `DELETE /libraries/{libraryId}` endpoint, which allows for the deletion of a library.
* Adds new fields to the Library model, including `system` and `archived`, which are queryable.
# Q3 Release 2023
## v1.2.0
### Analyses
* Added `periodic` field, which indicates if an analysis is a periodic analysis. This can be set when creating a new
analysis.
* The values of `ApiAnalysisStatus`'s `preflightErrors` have changed with the addition of `periodic`. The `ready` field
should be used to determine if an analysis can be run.
### Tasks
* Using the `/query` endpoint now requires that an `analysisId` term be included.
### Data Tables
* Using the `/query` endpoint now requires that an `analysisId` term be included.
* Adds a new `type` field, which indicates the type of data table. It serves a similar purpose to the `logicalName`
field, but is used in different contexts.
# Get started
Source: https://developer.mindbridge.ai/sdk/python/get-started
The MindBridge Python SDK implements the official [Python API client library](https://pypi.org/project/mindbridge-api-python-client/) published on PyPI as `mindbridge-api-python-client`.
Install the package using `pip`:
```bash theme={null}
pip install mindbridge-api-python-client
```
For reliable environment management and to avoid dependency conflicts, use a Python virtual environment. You may use the standard library’s `venv` module or a third-party tool such as `uv`.
# Authenticate and connect
Generate an API token within your MindBridge tenant by following [Create an API token](/api-explorer/create-api-token).
MindBridge recommends securely managing your API credentials. In these examples, environment variables are used:
* `MINDBRIDGE_API_URL`: The full MindBridge tenant URL (for example, *\[subdomain]*.mindbridge.ai)
* `MINDBRIDGE_API_TOKEN`: The API token generated for your account
The following example connects to your MindBridge tenant and retrieves the authenticated user’s profile by calling the `/v1/users/current` endpoint:
```python theme={null}
import os
import mindbridgeapi as mbapi
url = os.environ.get("MINDBRIDGE_API_URL", "")
token = os.environ.get("MINDBRIDGE_API_TOKEN", "")
server = mbapi.Server(url=url, token=token)
user = server.users.get_current()
print(f"Name: {user.first_name} {user.last_name}")
print(f"Role: {user.role}")
print(f"ID: {user.id}")
```
# Analyses
Source: https://developer.mindbridge.ai/sdk/python/tutorials/analyses
This section guides you through creating a general ledger analysis, creating a TRA vendor analysis, retrieving an analysis by its identifier, and querying analyses using the Python SDK.
# Creating a general ledger analysis
To set up an analysis, you first need to create or select an existing [organization](/sdk/python/tutorials/organizations) and [engagement](/sdk/python/tutorials/engagements). For details on how to work with these resources, see their respective guides.
If you omit `library_id` from the `EngagementItem`, the MindBridge SDK creates a library using the `MindBridge for-profit (Mac v2) Library`. That library includes the general ledger, accounts payable, and accounts receivable analysis types by default.
```python theme={null}
# get-or-create our organization
organization_name = "Chapter 3 - Creating an Analysis"
try:
organization = next(server.organizations.get({"name": organization_name}))
print(f"Organization '{organization_name}' already exists.")
except StopIteration:
new_organization_item = mbapi.OrganizationItem(
name=organization_name,
external_client_code="My Client ID", # Optional
manager_user_ids=[user.id], # Optional
)
organization_item = mbapi.OrganizationItem(name=organization_name)
organization = server.organizations.create(organization_item)
print(f"Organization '{organization_name}' created.")
engagement_name = "Engagement - MindBridge for-profit Library"
try:
new_engagement_item = mbapi.EngagementItem(
organization_id=organization.id,
name=engagement_name,
engagement_lead_id=user.id,
)
engagement = server.engagements.create(new_engagement_item)
print(f"Created the new engagement {engagement.name}")
except mbapi.exceptions.ValidationError:
engagement = next(
server.engagements.get(
{"organizationId": organization.id, "name": engagement_name}
)
)
print(
f"Fetched the engagement '{engagement.name}' from the organization with id "
f"{organization.id}"
)
```
After the engagement **Engagement - MindBridge for-profit Library** exists, create an analysis within it.
```python theme={null}
from datetime import date
new_gl_analysis_item = mbapi.AnalysisItem(
name="GL Analysis",
engagement_id=engagement.id,
currency_code="CAD",
analysis_periods=[
mbapi.AnalysisPeriod(end_date=date(2024, 12, 31), start_date=date(2024, 1, 1))
],
analysis_type_id=mbapi.AnalysisTypeItem.GENERAL_LEDGER,
)
analysis = server.analyses.create(new_gl_analysis_item)
print(
f"https://{os.getenv('MINDBRIDGE_URL')}/app/organization/{organization.id}/"
f"engagement/{engagement.id}/analysis-list"
)
```
At the link printed above, an analysis is ready for data upload.
# Creating a custom analysis
To create a custom analysis, you first need a library with your desired analysis type. Then create an engagement that uses that library.
In this example, you set up a TRA vendor analysis by creating an analysis type from the `TRA Vendor Template` that MindBridge provides.
Create a TRA vendor analysis type in the Analysis Designer:
1. Open the Analysis Designer.
2. Find the analysis type named **TRA Vendor Template**.
3. Duplicate **TRA Vendor Template** and set the name to **SDK TRA Vendor**.
4. Click **Save**.
5. Return to the Analysis Designer page.
6. Select **Publish** on **SDK TRA Vendor**.
Then create a library that includes that analysis type:
1. Open the Libraries page.
2. Select **Create Library**.
3. Set the name to **SDK TRA Vendor Library**.
4. Set the base library to **MindBridge for-profit (MAC v.2)**.
5. Add **SDK TRA Vendor** to the analysis types.
6. Set the account grouping to **Mac v.2**.
7. Select **Create Library**. You should now have a library named **SDK TRA Vendor Library** that contains the analysis type **SDK TRA Vendor**.
Create an engagement that uses this library by setting `library_id` on the `EngagementItem`.
```python theme={null}
all_libraries = server.libraries.get()
vendor_library = next(
library for library in all_libraries if library.name == "SDK TRA Vendor Library"
)
organization_name = "Chapter 3 - Creating an Analysis"
try:
organization = next(server.organizations.get({"name": organization_name}))
print(f"Organization '{organization_name}' already exists.")
except StopIteration:
new_organization_item = mbapi.OrganizationItem(
name=organization_name,
external_client_code="My Client ID", # Optional
manager_user_ids=[user.id], # Optional
)
organization_item = mbapi.OrganizationItem(name=organization_name)
organization = server.organizations.create(organization_item)
print(f"Organization '{organization_name}' created.")
engagement_name = "Engagement - SDK TRA Vendor Library"
try:
new_engagement_item = mbapi.EngagementItem(
organization_id=organization.id,
name=engagement_name,
engagement_lead_id=user.id,
library_id=vendor_library.id,
)
engagement = server.engagements.create(new_engagement_item)
print(f"Created the new engagement '{engagement.name}'")
except mbapi.exceptions.ValidationError:
engagement = next(
server.engagements.get(
{"organizationId": organization.id, "name": engagement_name}
)
)
print(
f"Fetched the engagement '{engagement.name}' from the organization with id "
f"{organization.id}"
)
```
After the engagement **Engagement - SDK TRA Vendor Library** exists, create an analysis within it. Fetch the analysis type from the engagement as shown below.
```python theme={null}
from datetime import date
all_libraries = server.libraries.get()
vendor_library = next(
library for library in all_libraries if library.name == "SDK TRA Vendor Library"
)
available_analysis_types = list(vendor_library.analysis_types)
print(f"These are the Analysis Types available in the library '{vendor_library.name}'")
for at in available_analysis_types:
print(at.name)
tra_vendor_analysis_type = next(
analysis_type
for analysis_type in available_analysis_types
if analysis_type.name == "SDK TRA Vendor"
)
new_gl_analysis_item = mbapi.AnalysisItem(
name="GL Analysis",
engagement_id=engagement.id,
currency_code="CAD",
analysis_periods=[
mbapi.AnalysisPeriod(end_date=date(2024, 12, 31), start_date=date(2024, 1, 1))
],
analysis_type_id=tra_vendor_analysis_type.id,
)
analysis = server.analyses.create(new_gl_analysis_item)
print(
f"https://{os.getenv('MINDBRIDGE_URL')}/app/organization/{organization.id}/"
f"engagement/{engagement.id}/analysis-list"
)
```
# Engagements
Source: https://developer.mindbridge.ai/sdk/python/tutorials/engagements
An engagement represents a service or activity performed for one of your clients. When you create an engagement within an organization, it will always be associated with that organization. Engagements house the analyses you run within MindBridge, like the general ledger analysis.
Because engagements belong to an organization, see [Organizations](/sdk/python/tutorials/organizations) for how to work with organizations using the Python SDK.
## Create a new engagement
As in the web application, you can [create an engagement](https://support.mindbridge.ai/hc/en-us/articles/360055739694-Create-an-engagement) using the Python SDK.
```python theme={null}
organization = server.organizations.get_by_id("6793acbf7bd84f04412b114e") # (1)!
engagement = mbapi.EngagementItem( # (2)!
name="The Engagement Name",
organization_id=organization.id,
engagement_lead_id=organization.created_user_info.id,
)
engagement = server.engagements.create(engagement)
print(f"{engagement.id=}\n{engagement.name=}")
#> engagement.id='695fcdfa1bcebb393be82967'
#> engagement.name='The Engagement Name'
```
1. See [Organizations](/sdk/python/tutorials/organizations) for how to create the `server` and create an organization.
2. It is assumed you have imported the module with `import mindbridgeapi as mbapi`.
## Retrieving an engagement by ID
You can retrieve an existing engagement by `id`. The example below uses the `id` of the engagement you created above.
```python theme={null}
engagement = server.engagements.get_by_id("695fcdfa1bcebb393be82967")
print(f"{engagement.id=}\n{engagement.name=}")
#> engagement.id='695fcdfa1bcebb393be82967'
#> engagement.name='The Engagement Name'
```
## Querying engagements
Query engagements, optionally applying a filter. Engagements can be searched using the MindBridge Query Language, as described in the MindBridge API Reference. The `get` function returns a [generator](https://docs.python.org/3/reference/expressions.html#generator-expressions), allowing you to iterate over search results or use the [`next()`](https://docs.python.org/3/library/functions.html#next) function.
To list engagements for an existing organization, use the `engagements` property of the organization, which yields a generator of engagements within that organization.
```python theme={null}
organization = server.organizations.get_by_id("6793acbf7bd84f04412b114e")
try:
engagement = next(organization.engagements)
print(f"{engagement.id=}\n{engagement.name=}")
except StopIteration:
print("This organization has no engagements.")
#> engagement.id='695fcdfa1bcebb393be82967'
#> engagement.name='The Engagement Name'
```
# Organizations
Source: https://developer.mindbridge.ai/sdk/python/tutorials/organizations
**Organizations** represent each business/client/company/entity that you analyze with MindBridge. Organizations house all of your client’s
engagements (audit/analysis), account mappings, and any other data imported into MindBridge for that client.
See [Get Started](/sdk/python/get-started) for how to use the Python SDK with a `Server`.
## Create a new organization
As in the web application, you can [create a new organization](https://support.mindbridge.ai/hc/en-us/articles/360057583033-Organization-management#01G66KHAB9Y1G7JKPK4PF6CD0C) using the Python SDK.
```python theme={null}
organization = mbapi.OrganizationItem(name="The Organization Name") # (1)!
organization = server.organizations.create(organization) # (2)!
print(f"{organization.id=}\n{organization.name=}")
#> organization.id='6793acbf7bd84f04412b114e'
#> organization.name='The Organization Name'
```
1. It is assumed you have imported the module with `import mindbridgeapi as mbapi`.
2. See [Get Started](/sdk/python/get-started) for how to create the `server`.
The organization is now created in the web application, and the create action returns information about the created organization, including its `id`.
## Retrieving an organization by ID
You can retrieve an existing organization by `id`. The example below uses the `id` of the organization you created above.
```python theme={null}
organization = server.organizations.get_by_id("6793acbf7bd84f04412b114e")
print(f"{organization.id=}\n{organization.name=}")
#> organization.id='6793acbf7bd84f04412b114e'
#> organization.name='The Organization Name'
```
## Querying organizations
Query organizations, optionally applying a filter. Organizations can be searched using the MindBridge Query Language, as described in the MindBridge API Reference. The `get` function returns a [generator](https://docs.python.org/3/reference/expressions.html#generator-expressions), allowing you to iterate over search results or use the [`next()`](https://docs.python.org/3/library/functions.html#next) function.
```python theme={null}
try:
organization = next(server.organizations.get({"name": "The Organization Name"}))
print(f"{organization.id=}\n{organization.name=}")
except StopIteration:
print("No matching organization found.")
```
# Auto-Assign Tasks After Analysis
Source: https://developer.mindbridge.ai/sdk/python/workflow-examples/task-assignment
Learn how to use the Python SDK to export filtered rows from an analysis and automatically assign review tasks to designated users.
This example demonstrates how to automatically assign review tasks using the [Python SDK](https://pypi.org/project/mindbridge-api-python-client/) after an analysis is completed. You will connect to an existing analysis, export a filtered set of rows from a data table, and assign entry tasks to appropriate MindBridge users based on values in your data, such as company code.
## Prerequisites
Complete [Get started](/sdk/python/get-started) so the Python SDK is installed and configured.
You also need:
* A MindBridge analysis URL for an engagement that you can access.
* The logical name of the data table you want to export, such as `gl_journal_lines`.
## Overview
In this guide you will:
* Parse an analysis URL to extract the MindBridge host and analysis result ID.
* Authenticate with the MindBridge API and map business keys to user IDs by email for task assignment.
* Export filtered rows to a CSV file, and create tasks only when no matching task exists (idempotent).
## Configure Your Inputs
Adjust the values in the **Configure inputs** section at the top of the script below to match your analysis and task assignment requirements. Typically, you only need to update that section; the rest of the script follows a standard process.
* **`analysis_url`**: The full MindBridge URL for the analysis. The script parses this to extract the server host and analysis result ID. You can also supply these values directly if your workflow provides them.
* **`data_table_query`**: Filters applied to the data table to identify which rows should receive tasks (for example, by date range or minimum risk). Modify the fields and operators as needed.
* **`data_table_logical_name`**: The logical name of the data table to export. This table must exist in the analysis. The script will print available logical names to help confirm your selection.
* **`column_for_assigning`**: The column whose values determine the assignee, for example, `company_code`. You must provide a mapping for each expected value.
* **`assigned_user_map`**: A mapping from values in `column_for_assigning` to MindBridge user email addresses. The script will look up each email and assign the task to the associated user.
The listing below is one continuous script you can save and run. Step boundaries are marked with comments inside the code.
## Complete example
```python theme={null}
import csv
import os
from datetime import date
from pathlib import Path
from tempfile import NamedTemporaryFile
from urllib3.util import parse_url
import mindbridgeapi as mbapi
# --- Configure inputs (edit for your environment) ---
# Replace with the full analysis URL from your browser.
# Host and path IDs must match your tenant.
analysis_url = (
"https://{your-tenant}.mindbridge.ai"
"/app/organization/{ORG_ID}"
"/engagement/{ENGAGEMENT_ID}"
"/analysis/{ANALYSIS_RESULT_ID}"
"/analyze/financial-statements"
"?productCode=GENERAL_LEDGER"
)
data_table_query = {
"effective_date": {
"$gte": date(2022, 4, 1),
"$lt": date(2022, 6, 1),
},
"risk": {"$gte": 15_00},
}
data_table_logical_name = "gl_journal_lines"
column_for_assigning = "company_code"
# Keys must match values in your data column.
# Values must be real user emails in your tenant.
assigned_user_map = {
"001": "reviewer-one@yourcompany.com",
"002": "reviewer-two@yourcompany.com",
}
# --- Step 1: Parse the analysis URL ---
parsed_url = parse_url(analysis_url)
mindbridge_url = parsed_url.host
parsed_url_path = parsed_url.path.split("/")
analysis_idx = parsed_url_path.index("analysis")
analysis_result_id = parsed_url_path[analysis_idx + 1]
# --- Step 2: Connect, load analysis, resolve assignees ---
# Load the API token, connect, fetch the analysis and
# data tables, print logical names, restart data tables
# for a fresh export, and resolve each assignee email
# to a user ID. Errors if an email is missing or
# ambiguous.
token = os.environ.get("MINDBRIDGE_API_TOKEN", "")
server = mbapi.Server(url=mindbridge_url, token=token)
analysis_result = server.analysis_results.get_by_id(
analysis_result_id
)
analysis = server.analyses.get_by_id(analysis_result.analysis_id)
print("Available data tables:")
for data_table in analysis.data_tables:
print(
f"- logical_name: {data_table.logical_name} "
f"(type: {data_table.type}, id: {data_table.id})"
)
server.analyses.restart_data_tables(analysis)
data_table = next(
dt
for dt in analysis.data_tables
if dt.logical_name == data_table_logical_name
)
print(
f"Using logical_name: {data_table.logical_name} "
f"(type: {data_table.type}, id: {data_table.id})"
)
assigned_user_map_id = {}
for key, assigned_user_email in assigned_user_map.items():
results = server.users.get(json={"email": assigned_user_email})
user, *others = results
if not user:
raise ValueError(
f"User with email '{assigned_user_email}' "
"not found."
)
if others:
raise Exception(
f"Multiple users found with email "
f"'{assigned_user_email}'. "
"Please resolve duplicates."
)
assigned_user_map_id[key] = user.id
# --- Step 3: Export data and assign tasks ---
# Export the selected table to CSV. For each row, create
# an entry task for the mapped user unless a task already
# exists for the same analysis, result, transaction, and
# row (safe to rerun).
with NamedTemporaryFile(delete=False) as temp_file:
temp_file_path = Path(temp_file.name)
print(f"Exporting to: {temp_file_path}")
async_result = server.data_tables.export(
data_table,
fields=[
"rowid",
"txid",
"risk",
"effective_date",
column_for_assigning,
],
query=data_table_query,
)
server.data_tables.wait_for_export(async_result)
temp_file_path = server.data_tables.download(
async_result, output_file_path=temp_file_path
)
with temp_file_path.open(newline="", encoding="utf_8") as infile:
reader = csv.DictReader(infile)
print("Assigning tasks for the following rows:")
for row in reader:
row_id = row["rowid"]
transaction_id = row["txid"]
print(
f"- row_id: {row_id}, "
f"transaction_id: {transaction_id}, "
f"risk: {row['risk']}, "
f"effective_date: {row['effective_date']}"
)
assigned_id = assigned_user_map_id[row[column_for_assigning]]
task = mbapi.TaskItem(
row_id=row_id,
transaction_id=transaction_id,
type=mbapi.TaskType.ENTRY,
status=mbapi.TaskStatus.OPEN,
engagement_id=analysis.engagement_id,
analysis_result_id=analysis_result.id,
audit_areas=["Audit Area 1"],
assigned_id=assigned_id,
)
existing_task = next(
server.tasks.get(
json={
"analysisId": analysis.id,
"analysisResultId": task.analysis_result_id,
"transactionId": task.transaction_id,
"rowId": task.row_id,
}
),
None,
)
if existing_task:
print(
f" - Task already exists "
f"(ID: {existing_task.id})"
)
else:
created_task = server.tasks.create(task)
print(f" - Created task (ID: {created_task.id})")
print("Task assignment complete.")
temp_file_path.unlink()
```
***
When the script finishes, the filtered rows appear as tasks in MindBridge, assigned to the users specified in `assigned_user_map`. To modify this workflow, adjust the export `fields`, the `data_table_query`, or the `TaskItem` fields (such as audit areas or task type) to fit your organization's review process.