Custodial Accounts
Requests authenticate with the Authorization: Bearer {clientID}:{apiKey} header. The examples below read the host and credentials from $TAPI_HOST, $TAPI_CLIENT_ID and $TAPI_API_KEY — see Running the Examples.
Sandbox base URL: https://api-sandboxdash.norcapsecurities.com — the examples read it from $TAPI_HOST.
Endpoints
POST /v3/createCustodyAccountRequest
This method is used to request a custodial account. This is the first step to opening a custodial account through North Capital Private Securities. The Custody Agreement Attestation (createCustodyAgreementAttestation) must be affirmatively recorded before the request can be made.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyAccountRequest" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=A12345
Response
| Field | Type | Description |
custodialAccountDetails | array | Array of custodial account request records (one element) |
| Field | Type | Description |
accountId | string | Account ID generated by the API with createAccount |
custAccStatus | string | Request status: Pending, Need More Info, Approved, Rejected, New Info Added |
accountStatus | string | Status of the custody account: Pending, Open, Closed |
custAccRequestID | string | Custodial Account Request Id |
createdDate | string | Date and timestamp of the request |
approvalStatus | string | Approval status of the underlying TAPI account (from createAccount) |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodialAccountDetails": [
{
"accountId": "A98780788",
"custAccStatus": "Pending",
"accountStatus": "Pending",
"custAccRequestID": "yNHHDX2",
"createdDate": "2024-11-22 16:22:10",
"approvalStatus": "Pending"
}
]
}
POST /v3/createCustodyAccountSupplement
This method is used to request a custodial account. This is the first step to opening a custodial account through North Capital Private Securities. This is specifically for IRA accounts.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
appointmentOfInvestmentManager | string | No | 1 - I/We wish to appoint an investment manager. Complete Part 1A 2 - No appointment at this time |
proxyVotingPreferences | string | No | 1 - Receive all proxy materials 2 - Send all proxy marterials to an investment manager 3 - Do not send proxy material |
otherServices | string | No | Please provide the details of the other services required. |
methodOfContributionOrFunding | string | No | 1 - Transfer Direct movement of assets from an IRA into this IRA 2 - Regular Contribution Includes catch-up contributions. 3 - Roth Conversion A taxable movement from a Traditional or Simple IRA into this Roth IRA. By selecting this transaction, you irrevocably designate this contribution as a conversion. 4 - Rollover Distribution from an IRA or eligible employersponsored retirement plan that is being deposited into this IRA. By selecting this transaction, you irrevocably designate this contribution as a rollover. 5 - SEP Contribution Contribution made under a SEP plan. SEP contributions are reported for the year in which the contribution is made |
methodOfContributionTaxYear | string | No | If "methodOfContributionOrFunding is option 2 - this is required to complete "Contribution for Tax Year 'YYYY'. |
internationalAccountNumber | string | No | If the account is an international account, please include the account number here. |
bankFirmName1 | string | No | Name of the bank/firm where the assets are currently held. |
bankCountry1 | string | No | Country of the bank/firm where the assets are currently held. |
bankAccountName1 | string | No | Name on the account where the assets are currently held. |
bankAccountNumber1 | string | No | Account number of the account where the assets are currently held. |
bankFirmName2 | string | No | Name of the bank/firm where the assets are currently held. |
bankCountry2 | string | No | Country of the bank/firm where the assets are currently held. |
bankAccountName2 | string | No | Name on the account where the assets are currently held. |
bankAccountNumber2 | string | No | Account number of the account where the assets are currently held. |
maritalStatus | string | No | 1 - Not married. 2 - Married If you designate a primary benefiicary other than or in addition to your spouse, spousal consent may be required. |
mailingAddressLine1 | string | Yes | Mailing Address Line 1 |
mailingAddressLine2 | string | No | Mailing Address Line 2 |
mailingCity | string | Yes | Mailing Address City |
mailingState | string | Yes | Mailing Address State |
mailingZipCode | string | Yes | Mailing Address Zip Code |
mailingCountry | string | Yes | Mailing Address Country |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyAccountSupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=someaccountid \
-d proxyVotingPreferences=proxyVotingPreferences \
-d otherServices=otherServices \
-d methodOfContributionOrFunding=type \
-d "methodOfContributionTaxYear=some year" \
-d internationalAccountNumber=internationalAccountNumber \
-d bankFirmName1=bankFirmName1 \
-d bankCountry1=bankCountry1 \
-d bankAccountName1=bankAccountName1 \
-d bankAccountNumber1=bankAccountNumber1 \
-d bankFirmName2=bankFirmName \
-d bankCountry2=bankCountry \
-d bankAccountName2=bankAccountName \
-d bankAccountNumber2=bankAccountNumber \
-d maritalStatus=1 \
-d "mailingAddressLine1=Mailing Address Line 1" \
-d "mailingAddressLine2=Mailing Address Line 2" \
-d "mailingCity=Mailing Address City" \
-d "mailingState=Mailing Address State" \
-d "mailingZipCode=Mailing Address Zip Code" \
-d "mailingCountry=Mailing Address Country"
Response
| Field | Type | Description |
accountDetails | object | The stored custodial account supplement record |
| Field | Type | Description |
accountId | string | Account ID that is generated by the API once an account is created (createAccount) |
appointmentOfInvestmentManager | string | 1 or 2 |
proxyVotingPreferences | string | 1, 2, or 3 |
otherServices | string | Details of the other services required. |
methodOfContributionOrFunding | string | 1, 2, 3, 4, or 5, |
methodOfContributionTaxYear | string | YYYY |
internationalAccountNumber | string | International account number |
bankFirmName1 | string | Name of the bank/firm where the assets are currently held. |
bankCountry1 | string | Country of the bank/firm where the assets are currently held. |
bankAccountName1 | string | Account name of the account where the assets are currently held. |
bankAccountNumber1 | string | Account number of the account where the assets are currently held. |
bankFirmName2 | string | Country of the bank/firm where the assets are currently held. |
bankCountry2 | string | Country of the bank/firm where the assets are currently held. |
bankAccountName2 | string | Name of the bank/firm where the assets are currently held. |
bankAccountNumber2 | string | Account number of the account where the assets are currently held. |
maritalStatus | string | 1 - Not married. 2 - Married |
mailingAddressLine1 | string | Mailing address |
mailingAddressLine2 | string | Mailing address |
mailingCity | string | Mailing city |
mailingState | string | Mailing state |
mailingZipCode | string | Mailing zip code |
mailingCountry | string | Mailing country |
Example Response
{
"statusCode": "101",
"statusDesc": "Account added successfully.",
"accountDetails": {
"accountId": "A3091454",
"appointmentOfInvestmentManager": "2",
"proxyVotingPreferences": "2",
"otherServices": "",
"methodOfContributionOrFunding": "4",
"methodOfContributionTaxYear": "",
"internationalAccountNumber": "",
"bankFirmName1": "Bank of America",
"bankCountry1": "US",
"bankAccountName1": "",
"bankAccountNumber1": "123456789",
"bankFirmName2": "",
"bankCountry2": "",
"bankAccountName2": "",
"bankAccountNumber2": "",
"maritalStatus": "1",
"mailingAddressLine1": "",
"mailingAddressLine2": "",
"mailingCity": "",
"mailingState": "",
"mailingZipCode": "",
"mailingCountry": ""
}
}
POST /v3/createCustodyAgreementAttestation
This method is used to record when a party attests to North Capital account terms and conditions.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount). |
isAttested | boolean | Yes | true (accepted) |
documentUrl | string | Yes | URL for attestation document |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyAgreementAttestation" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=A2624258 \
-d isAttested=true \
-d documentUrl=https://example.com
Response
| Field | Type | Description |
attestation | object | attestation details |
| Field | Type | Description |
accountId | string | Account ID that has attested |
isAttested | boolean | 1 = true, the party has attested |
documentUrl | string | URL for attestation |
createdDate | string | Date and timestamp of the attestation |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"attestation": {
"accountId": "A98780730",
"isAttested": "1",
"documentUrl": "https://example.com",
"createdDate": "2024-11-26 17:05:16"
}
}
POST /v3/createCustodyFundDisbursement
This method requests a disbursement (withdrawal) of funds from a custody account. ACH disbursements send funds to the external bank account linked to the TAPI account; wire disbursements send funds to the bank identified by bankId and bankAccountId. The disbursement is created in a pending state.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID generated from createAccount |
amount | string | Yes | Amount of funds to be transferred |
type | string | Yes | Type options: ach, wire_domestic, wire_international |
bankId | string | No | Required for wire transfers only. |
bankAccountId | string | No | Required for wire transfers only. |
additionalDetails | string | No | Open text field to provide any additional instructions required to successfully send the wire transfer |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyFundDisbursement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=someaccountid \
-d amount=22.23 \
-d type=wire_domestic \
-d bankId=122100024 \
-d bankAccountId=123456789
Response
| Field | Type | Description |
custodyFundDisbursement | object | The created disbursement request. See fields below. |
Response Fields
| Field | Type | Description |
requestId | string (UUID) | Unique disbursement request identifier. |
accountId | string | TAPI Account ID the disbursement is drawn from. |
amount | string | Disbursement amount, with two decimal places. |
type | string | Transfer type. One of ach, wire_domestic, wire_international. |
bankId | string | null | Destination bank/routing identifier (wire transfers); null for ACH. |
bankAccountId | string | null | Destination bank account identifier (wire transfers); null for ACH. |
additionalDetails | string | null | Additional instructions provided on the request; null when not provided. |
status | string | Disbursement status. One of pending, processing, on_hold, approved, rejected, scheduled, in_review, completed, terminated, failed, reopened. Newly created disbursements start at pending. |
createdDate | string | Date and timestamp the disbursement was created. |
updatedDate | string | Date and timestamp the disbursement was last updated. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyFundDisbursement": {
"requestId": "a49a68b7-f0ab-45b5-ac07-6ed555259d27",
"accountId": "A3110006",
"amount": "1.20",
"type": "wire_domestic",
"bankId": "122100024",
"bankAccountId": "123456789",
"additionalDetails": null,
"status": "pending",
"createdDate": "2024-12-10 23:29:13",
"updatedDate": "2024-12-10 23:29:13"
}
}
POST /v3/createCustodyFundMove
This method initiates a fund move (deposit) into a custody account by debiting the external bank account linked to the supplied TAPI account. The deposit is created in a Pending state and is submitted to the bank for ACH processing at 6:00 PM Eastern Time each business day. The amount is limited based on the client's risk assessment and per-transaction ACH cap.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
amount | string | Yes | The amount to be debited from the external account. The amount is limited based on client risk assessment and is capped at $100,000.00 |
description | string | No | Description of the fund move |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyFundMove" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=985742 \
-d amount=10000.50 \
-d "description=Example Transaction"
Response
| Field | Type | Description |
custodyTransaction | object | The created fund move transaction. See fields below. |
Response Fields
| Field | Type | Description |
accountId | string | TAPI Account ID the deposit was initiated for. |
bankName | string | null | Name of the external bank, when available. |
amount | string | Amount of the fund move (decimal string). |
accountNumber | string | External bank account number (decoded). Empty string when not exposed. |
routingNumber | string | External bank routing number (decoded). |
accountName | string | Name on the external bank account. |
referenceNumber | string | API-generated reference number identifying this fund move. |
description | string | Description provided on the request. |
approvalStatus | string | Internal approval state. Pending for live transactions; TEST ENTRY when the external account uses a test nickname. |
status | string | Fund move (fundStatus) state. One of Pending, Submitted, Settled, Returned, Voided, Declined. Newly created fund moves start at Pending. |
routingNumberStatus | string | Routing number verification result (e.g. Verified). |
errors | string | Error detail associated with the transaction; empty string when none. |
createdDate | string | Date and timestamp the fund move was created. |
updatedDate | string | Date and timestamp the fund move was last updated. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyTransaction": {
"accountId": "A3110006",
"bankName": null,
"amount": "7.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "339846456",
"description": "",
"approvalStatus": "Pending",
"status": "Pending",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-10 22:49:06",
"updatedDate": "2024-12-10 22:49:06"
}
}
POST /v3/createCustodyPartySupplement
This method is used to add additional fields that may be required in order to open a custodial account through North Capital Private Securities.
Parameters
| Parameter | Type | Required | Description |
partyId | string | Yes | Party ID that is generated by the API once a party is created (createParty) |
relationship | string | No | The party's relationship to the account owner. Put "owner" if this is the account owner. |
salutation | string | No | The party's title. Enum: Mr., Mrs., Ms., Dr. Deprecated aliases: 1 (Mr.), 2 (Mrs.), 3 (Ms.), 4 (Dr.). The field is not validated, so any other value is stored as sent. |
countryOfCitizenship | string | No | Party's country of citizenship. |
authorizedSigner | string | No | Is this party the authorized signer for the account? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
controlPerson | string | No | Is this party a control person for the account? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
politicallyExposedPerson | string | No | Is this person considered a politically exposed person? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
politicallyExposedPersonDetails | string | No | If the person selects "Yes" that they are a politically exposed person, then this field is required. Please provide the details of the politically exposed person. |
beneficiaryType | string | No | The beneficiary type, if this party is a beneficiary for the account. Enum: Spouse, Non-Spouse, Trust/Entity. Deprecated aliases: 1 (Spouse), 2 (Non-Spouse), 3 (Trust/Entity). The field is not validated, so any other value is stored as sent. |
beneficiaryPercentage | string | No | If this party is a beneficiary for the account, please provide the percentage. Stored as sent and not validated. |
mailingAddressLine1 | string | No | Mailing Address Line 1 |
mailingAddressLine2 | string | No | Mailing Address Line 2 |
mailingCity | string | No | Mailing Address City |
mailingState | string | No | Mailing Address State |
mailingZipCode | string | No | Mailing Address Zip Code |
mailingCountry | string | No | Mailing Address Country |
publicCompany | string | No | Is this party associated with a public company? Enum (case-insensitive, stored lowercase): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
companyTicker | string | No | Company Ticker if the party is associated with a public company |
associatedFirm | string | No | If the party is associated with a broker dealer, please indicate the name of the Associated Firm |
createdIpAddress | string | No | IP address recorded against the record |
Example Request
curl -X POST "$TAPI_HOST/v3/createCustodyPartySupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d partyId=somepartyid \
-d relationship=owner \
-d salutation=Mr \
-d countryOfCitizenship=citizenship \
-d authorizedSigner=yes \
-d controlPerson=yes \
-d politicallyExposedPerson=yes \
-d "politicallyExposedPersonDetails=some details" \
-d beneficiaryType=Spouse \
-d beneficiaryPercentage=100 \
-d mailingAddressLine1=address1 \
-d mailingAddressLine2=address2 \
-d mailingCity=city \
-d mailingState=state \
-d mailingZipCode=54321 \
-d mailingCountry=US \
-d publicCompany=yes \
-d companyTicker=test \
-d associatedFirm=test
Response
| Field | Type | Description |
party details | object | The stored party details |
| Field | Type | Description |
partyId | string | Party ID that is generated by the API once a party is created (createParty) |
relationship | string | The party's relationship to the account owner, as sent |
salutation | string | Mr., Mrs., Ms., Dr., or the value sent |
countryOfCitizenship | string | Party's country of citizenship. |
authorizedSigner | string | Yes, No, or an empty string |
controlPerson | string | Yes, No, or an empty string |
politicallyExposedPerson | string | Yes, No, or an empty string |
politicallyExposedPersonDetails | string | Details of the politically exposed person |
beneficiaryType | string | Spouse, Non-Spouse, Trust/Entity, or the value sent |
beneficiaryPercentage | string | The percentage as sent |
mailingAddressLine1 | string | Mailing Address Line |
mailingAddressLine2 | string | Mailing Address Line |
mailingCity | string | Mailing Address City |
mailingState | string | Mailing Address State |
mailingZipCode | string | Mailing Address Zip |
mailingCountry | string | Mailing Address Country |
Example Response
{
"statusCode": "101",
"statusDesc": "Party added successfully.",
"party details": {
"partyId": "P2726935",
"relationship": "owner",
"salutation": "Mr",
"countryOfCitizenship": "citizenship",
"authorizedSigner": "Yes",
"controlPerson": "Yes",
"politicallyExposedPerson": "Yes",
"politicallyExposedPersonDetails": "some details",
"beneficiaryType": "Spouse",
"beneficiaryPercentage": "100",
"mailingAddressLine1": "address1",
"mailingAddressLine2": "address2",
"mailingCity": "city",
"mailingState": "state",
"mailingZipCode": "54321",
"mailingCountry": "US"
}
}
A party can only have one supplement record. Calling this a second time for the same party returns statusCode 200 with Error(s) set to This partyId already added. — use updateCustodyPartySupplement to change an existing record.
GET /v3/custody/accounts/{id}/positions
Fetch the security positions held in a single custody account. The endpoint resolves the supplied TAPI account ID ({id}) to its underlying brokerage (custody) account and returns one aggregated row per security, where units is the net of all credit and debit security transactions for that security.
Permissions
This method requires the scope custody_account.read to be granted to the calling API key. The scope can be assigned by system admins through the API or Transact Portal.
Authorization
Authenticate with the Authorization header. The account must belong to one of the API keys owned by the authenticated client.
Path Parameters
| Parameter | Type | Required | Description |
id | string | Yes | TAPI Account ID (e.g. A12345) generated by createAccount. Resolved internally to the linked brokerage/custody account. |
Response Fields
The positions array contains one entry per security held in the account.
| Field | Type | Description |
id | string | Security identifier (CUSIP or symbol) of the held security. |
date | string | Date (YYYY-MM-DD) of the most recent security transaction for this security in the account. |
units | string | Net number of units held: the sum of credit transaction units minus debit transaction units. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"positions": [
{
"id": "02587DM96",
"date": "2019-03-20",
"units": "27"
},
{
"id": "40434YGR2",
"date": "2019-03-21",
"units": "1"
},
{
"id": "38148JA92",
"date": "2019-03-22",
"units": "1"
},
{
"id": "DELL12",
"date": "2019-03-20",
"units": "10"
}
]
}
GET /v3/custody/accounts/{id}/statements
Fetch the statements and tax documents generated for the specified custody account. The endpoint resolves the supplied TAPI account ID ({id}) to its underlying brokerage (custody) account and returns one row per document, newest first (by year, then month, then record ID). Where a month's statement has been regenerated, only the most recent copy is returned. Each pdfurl is a short-lived presigned link (valid for approximately 5 minutes). Results are cursor-paginated: pass pagination.nextCursor back as cursor to fetch the next page.
Permissions
This method requires the scope custody_account.read to be granted to the calling API key; a key without it receives 403 required scopes not granted. The scope can be assigned by system admins through the API or Transact Portal.
Authorization
Header: Authorization: Bearer clientId:apiKey
Path Parameters
| Parameter | Type | Required | Description |
id | string | Yes | TAPI Account ID (e.g. A12345) generated by createAccount. Resolved internally to the linked brokerage/custody account. |
Query Parameters
| Parameter | Type | Default | Description |
limit | integer | 100 | The maximum number of documents to return. Must be an integer between 1 and 500. |
cursor | string | | Opaque cursor taken from pagination.nextCursor of the previous page. A cursor is bound to the account it was issued for and is rejected if replayed against a different account. |
Response Fields
The custodyStatements array contains one entry per document.
| Field | Type | Description |
id | integer | Custodian document record identifier. |
monthGenerated | integer | Month the document was generated (1-12). 0 for documents that are not month-specific (e.g. annual tax documents). |
yearGenerated | integer | Year the document was generated. |
type | string | Custodian document type flag, 0 or 1, as stored on the custodian record. |
generatedBy | string | How the document was produced, as recorded by the custodian (e.g. system, manual, Corrected Statement, Tax Document). |
pdfurl | string | Short-lived presigned URL to download the document. |
| Field | Type | Description |
limit | integer | The page size applied to the request. |
hasMore | boolean | Whether further documents exist beyond this page. |
nextCursor | string | null | Cursor for the next page. null on the last page. |
Errors
Validation and lookup failures are returned as a problem-details object (type, title, status, detail) with a matching HTTP status: 400 with title invalid limit or invalid cursor, and 404 with title not found when the TAPI account or its brokerage account cannot be resolved.
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyStatements": [
{
"id": 48213,
"monthGenerated": 3,
"yearGenerated": 2025,
"type": "0",
"generatedBy": "system",
"pdfurl": "https://prodriaclientrepository.s3.us-east-2.amazonaws.com/statements/2025-03.pdf?...&X-Amz-Signature=..."
},
{
"id": 47990,
"monthGenerated": 0,
"yearGenerated": 2024,
"type": "1",
"generatedBy": "Tax Document",
"pdfurl": "https://prodriaclientrepository.s3.us-east-2.amazonaws.com/statements/2024-tax.pdf?...&X-Amz-Signature=..."
}
],
"pagination": {
"limit": 100,
"hasMore": false,
"nextCursor": null
}
}
GET /v3/custody/accounts/{id}/transactions
Fetch a list of custodian ledger transactions for the specified custody account. This is the authoritative record of cash activity: the status field reflects the custodian's settlement state (Pending, Settled, or Returned), and referenceNumber ties each transaction back to the originating fund move. Transactions are ordered by transaction date with the most recent at index zero.
Permissions
This method requires the scope custody_transaction.read to be granted to the calling API key. Transaction records are PII-high: unless the key holds the pii_high level for this scope, all but a base set of fields (including name) are redacted from the response.
This scope can be assigned by system admins through the API or Transact Portal.
Authorization
Header: Authorization: Bearer clientId:apiKey
Query Parameters
| Parameter | Type | Default | Description |
offset | integer | 0 | The row index at which to begin the query. Zero represents the first transaction in the list. |
limit | integer | 10 | The maximum number of transactions to return. Max value is 500. |
deleted | boolean | false | Include deleted transactions in response. |
filter | string (JSON) | | Filter results by specific fields (e.g. referenceNumber, status). |
Response Fields
| Field | Type | Description |
id | string | Custodian transaction identifier. |
method | string | Processing method: ACH, Wire, Check, Transfer, or Fee. Casing is not normalized by the custodian, so compare case-insensitively. |
date | string (YYYY-MM-DD) | Transaction date. |
name | string | Customer name (PII; redacted without pii_high). |
amountCents | integer | Transaction amount in cents. Always positive; use type for direction. |
type | string | Direction of the cash movement: Credit (funds into the account) or Debit (funds out). |
subtype | string | Cash transaction category from the custodian's configurable list (e.g. MMF - Purchase, MMF - Redemption). Not a fixed enumeration. |
brokerageAccountId | string | Custodian brokerage account identifier. |
notes | string | Free-form notes. |
status | string | Settlement state: Pending (awaiting settlement), Settled (completed), or Returned (rejected/reversed). Only Settled transactions count toward the account's available cash balance. |
referenceNumber | string | Reference number linking the transaction to the originating fund move (the value passed to createCustodyFundMove). |
accountId | string | TAPI account identifier. |
settledDate | string (YYYY-MM-DD) | Scheduled/actual settlement date. Settlement is keyed off this date, so it is known before status becomes Settled. |
checkNumber | string | Check number, when method is Check. |
deleted | boolean | Whether the transaction has been logically deleted (custodian virtualStatus of DELETED). Deleted rows are excluded unless deleted=true is passed. |
createdDate | string (YYYY-MM-DD HH:MM:SS) | Record creation timestamp. |
updatedDate | string (YYYY-MM-DD HH:MM:SS) | Record last-updated timestamp. |
cashSendConfirmation | string | Cash send confirmation reference, when applicable. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"barc_transactions": [
{
"id": "BT0001234",
"method": "ACH",
"date": "2025-02-12",
"name": "John Investor",
"amountCents": 150000,
"type": "Credit",
"subtype": "MMF - Purchase",
"brokerageAccountId": "1042",
"notes": "",
"status": "Settled",
"referenceNumber": "481724317",
"accountId": "A07545866",
"settledDate": "2025-02-14",
"checkNumber": "",
"deleted": false,
"createdDate": "2025-02-12 17:11:17",
"updatedDate": "2025-02-14 06:00:02",
"cashSendConfirmation": ""
}
],
"pagination": {
"totalRecords": 1,
"startIndex": 0,
"endIndex": 0
}
}
GET /v3/custody/accounts
This endpoint retrieves a paginated list of custody account records owned by the authenticated client. Each record represents the custody (custodial account request) state for a TAPI account. It supports pagination and filtering.
Permissions
This method requires the scope custody_account.read to be granted to the calling API key; a key without it receives 403 permission denied. Custody account records are PII-high: unless the key holds the pii_high level for this scope, PII fields are redacted from the response rather than the request being denied.
Authorization
Authenticate with the Authorization header. Only custody accounts owned by the authenticated client's API keys are returned.
Query Parameters
| Parameter | Type | Default | Description |
offset | integer | 0 | The row index at which to begin the query. Zero represents the first record in the list. |
limit | integer | 10 | The maximum number of records to return. Max value is 500. |
deleted | boolean | false | Include deleted records in the response. |
filter | string (JSON) | | Filter results by specific fields (full-equality only). |
Response Fields
The custody_accounts array contains one entry per custody account.
| Field | Type | Description |
accountId | string | TAPI Account ID (e.g. A00000003) the custody record belongs to. |
requestId | string | Custodial account request ID (custAccRequestID). |
status | string | Custody account request status. One of Pending, Need More Info, Approved, Rejected, New Info Added. |
relationship | string | null | Nature of the relationship (natureOfRelationship); null when not set. |
restrictedStatus | string | Whether the account is restricted. One of Yes, No. |
restrictedReason | string | null | Reason the account is restricted. One of Missing Data, Acceptance of Terms, KYC/AML, Suitability, or null when not restricted. |
principalReviewBy | string | Principal who reviewed the request (custprincipalReviewedBy); empty string when none. |
approvalDate | string | Date and timestamp the request was approved (custApprovalDate). |
notes | string | Free-text notes on the custody account. |
createdDate | string | Date and timestamp the record was created. |
updatedDate | string | Date and timestamp the record was last updated. |
| Field | Type | Description |
totalRecords | integer | Total number of matching records. |
startIndex | integer | Zero-based index of the first record returned. |
endIndex | integer | Zero-based index of the last record returned. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custody_accounts": [
{
"accountId": "A00000003",
"requestId": "1BIBe0V",
"status": "Approved",
"relationship": null,
"restrictedStatus": "No",
"restrictedReason": null,
"principalReviewBy": "",
"approvalDate": "2025-02-12 17:11:18",
"notes": "",
"createdDate": "2025-02-12 17:11:17",
"updatedDate": "2025-02-12 17:11:18"
}
],
"pagination": {
"totalRecords": 1001,
"startIndex": 0,
"endIndex": 0
}
}
GET /v3/custody/accounts/{id}
This endpoint retrieves a single custody account record by its TAPI Account ID. The response object uses the same fields as the list endpoint, returned under the custody_account key. Returns a 404 if no matching custody account is found for the authenticated client.
Permissions
This method requires the scope custody_account.read to be granted to the calling API key; a key without it receives 403 permission denied. Custody account records are PII-high: unless the key holds the pii_high level for this scope, PII fields are redacted from the response rather than the request being denied.
Authorization
Authenticate with the Authorization header. The account must be owned by one of the authenticated client's API keys.
Path Parameters
| Parameter | Type | Required | Description |
id | string | Yes | TAPI Account ID (e.g. A00000003) of the custody account to retrieve. |
Response Fields
| Field | Type | Description |
accountId | string | TAPI Account ID the custody record belongs to. |
requestId | string | Custodial account request ID (custAccRequestID). |
status | string | Custody account request status. One of Pending, Need More Info, Approved, Rejected, New Info Added. |
relationship | string | null | Nature of the relationship (natureOfRelationship); null when not set. |
restrictedStatus | string | Whether the account is restricted. One of Yes, No. |
restrictedReason | string | null | Reason the account is restricted. One of Missing Data, Acceptance of Terms, KYC/AML, Suitability, or null when not restricted. |
principalReviewBy | string | Principal who reviewed the request (custprincipalReviewedBy); empty string when none. |
approvalDate | string | Date and timestamp the request was approved (custApprovalDate). |
notes | string | Free-text notes on the custody account. |
createdDate | string | Date and timestamp the record was created. |
updatedDate | string | Date and timestamp the record was last updated. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custody_account": {
"accountId": "A00000003",
"requestId": "1BIBe0V",
"status": "Approved",
"relationship": null,
"restrictedStatus": "No",
"restrictedReason": null,
"principalReviewBy": "",
"approvalDate": "2025-02-12 17:11:18",
"notes": "",
"createdDate": "2025-02-12 17:11:17",
"updatedDate": "2025-02-12 17:11:18"
}
}
GET /v3/custody/positions
Fetch the aggregated security positions across every custody account owned by the authenticated client. The endpoint collects all custodial accounts belonging to the client's API keys, resolves them to their brokerage accounts, and returns one aggregated row per security where units is the net of all credit and debit security transactions across those accounts.
Permissions
This method requires the scope custody_account.read to be granted to the calling API key. The scope can be assigned by system admins through the API or Transact Portal.
Authorization
Authenticate with the Authorization header. Only custody accounts owned by the authenticated client's API keys are included.
Response Fields
The positions array contains one entry per security held across the client's custody accounts.
| Field | Type | Description |
id | string | Security identifier (CUSIP or symbol) of the held security. |
date | string | Date (YYYY-MM-DD) of the most recent security transaction for this security. |
units | string | Net number of units held: the sum of credit transaction units minus debit transaction units. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"positions": [
{
"id": "02587DM96",
"date": "2019-03-20",
"units": "27"
},
{
"id": "40434YGR2",
"date": "2019-03-21",
"units": "1"
},
{
"id": "38148JA92",
"date": "2019-03-22",
"units": "1"
},
{
"id": "DELL12",
"date": "2019-03-20",
"units": "10"
}
]
}
GET /v3/custody/distributions
This endpoint retrieves a paginated list of custody distribution records. A distribution represents a fund movement out of a brokerage (custody) account to either a linked external bank account or to explicit banking details. Records are returned newest-first (ordered by creation time descending). It supports pagination and filtering.
Permissions
This method requires the scope custody_distribution.read to be granted to the calling API key; a key without it receives 403 permission denied. Distribution records are PII-high: unless the key holds the pii_high level for this scope, PII fields are redacted from the response rather than the request being denied. Creating distributions via the POST /v3/custody/distributions counterpart requires the custody_distribution.write scope. These scopes can be assigned by system admins through the API or Transact Portal.
Authorization
Authenticate with the Authorization header. The response includes only custody distributions owned by the authenticated client.
Query Parameters
| Parameter | Type | Default | Description |
offset | integer | 0 | The row index at which to begin the query. Zero represents the first record in the list. |
limit | integer | 10 | The maximum number of records to return. Max value is 500. |
filter | string (JSON) | | Filter results by specific fields (full-equality only). |
Response Fields
The custody_distributions array contains one entry per distribution.
| Field | Type | Description |
id | string (UUID) | Unique distribution identifier. |
submissionId | string (UUID) | Identifier shared by all distributions created in the same submission batch. |
clientId | string | Client identifier that owns the distribution (PII; redacted without pii_high). |
brokerageAccountId | string | Brokerage (custody) account the funds are distributed from. |
amountCents | integer | Distribution amount in cents. |
status | string | Distribution status. One of pending, processing, on_hold, approved, rejected, scheduled, in_review, completed, terminated, failed, reopened. |
accountId | string | null | TAPI Account ID whose linked external bank account receives the funds (mutually exclusive with bankId/bankAccountId). |
bankId | string | null | Bank/routing identifier when distributing to explicit banking details. |
bankAccountId | string | null | Bank account identifier when distributing to explicit banking details. |
transactionType | string | null | Transfer rail. One of ach, wire. |
transactionMemo | string | null | Free-text memo for the transaction. |
createdAt | string (datetime) | Timestamp the distribution was created. |
updatedAt | string (datetime) | Timestamp the distribution was last updated. |
| Field | Type | Description |
totalRecords | integer | Total number of matching records. |
startIndex | integer | Zero-based index of the first record returned. |
endIndex | integer | Zero-based index of the last record returned. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custody_distributions": [
{
"id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d",
"submissionId": "f0e1d2c3-b4a5-4968-8776-5a4b3c2d1e0f",
"clientId": "someclientid",
"brokerageAccountId": "BR000123",
"amountCents": 25000,
"status": "pending",
"accountId": "A00000003",
"bankId": null,
"bankAccountId": null,
"transactionType": "ach",
"transactionMemo": "Quarterly distribution",
"createdAt": "2025-02-12 17:11:17",
"updatedAt": "2025-02-12 17:11:18"
}
],
"pagination": {
"totalRecords": 100,
"startIndex": 0,
"endIndex": 0
}
}
GET /v3/custody/distributions/{id}
This endpoint retrieves a single custody distribution record by its distribution id. The response object uses the same fields as the list endpoint, returned under custody_distribution instead of custody_distributions.
Permissions
This method requires the scope custody_distribution.read to be granted to the calling API key; a key without it receives 403 permission denied. Distribution records are PII-high: unless the key holds the pii_high level for this scope, PII fields are redacted from the response rather than the request being denied.
Authorization
Authenticate with the Authorization header. The distribution must be owned by the authenticated client; a distribution belonging to another client returns 404.
Path Parameters
| Parameter | Type | Required | Description |
id | string (UUID) | Yes | Distribution identifier as returned by GET /v3/custody/distributions or POST /v3/custody/distributions. |
Example Request
curl -X GET "$TAPI_HOST/v3/custody/distributions/a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY"
Response Fields
The custody_distribution object carries the same fields as one entry of the list endpoint's custody_distributions array.
Errors
| HTTP | statusCode | statusDesc |
| 403 | 1403 | Forbidden: permission denied |
| 404 | 1404 | Resource not found: {id} does not exist |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custody_distribution": {
"id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d",
"submissionId": "f0e1d2c3-b4a5-4968-8776-5a4b3c2d1e0f",
"clientId": "someclientid",
"brokerageAccountId": "BR000123",
"amountCents": 25000,
"status": "pending",
"accountId": "A00000003",
"bankId": null,
"bankAccountId": null,
"transactionType": "ach",
"transactionMemo": "Quarterly distribution",
"createdAt": "2025-02-12 17:11:17",
"updatedAt": "2025-02-12 17:11:18"
}
}
POST /v3/custody/distributions
Create one or more custody distributions in a single submission. A distribution moves funds out of a brokerage (custody) account to either the external bank account linked to a TAPI account (accountId) or to explicit banking details (bankId and bankAccountId); each entry must supply exactly one of the two. Every entry is validated before anything is written, and the first failure rejects the whole submission. All distributions created by one request share a submissionId and start in status pending.
Permissions
This method requires the scope custody_distribution.write to be granted to the calling API key; a key without it receives 403 required scopes not granted. Reading distributions back via the GET /v3/custody/distributions counterpart requires the custody_distribution.read scope. These scopes can be assigned by system admins through the API or Transact Portal.
Authorization
Header: Authorization: Bearer clientId:apiKey
Request Body
A JSON object (Content-Type: application/json) with a newDistributions array.
| Field | Type | Required | Description |
newDistributions | array | Yes | One or more distributions to create. |
newDistributions[].brokerageAccountId | string | Yes | Brokerage (custody) account the funds are distributed from (e.g. NC95156). Must exist at the custodian. |
newDistributions[].amountCents | integer | Yes | Distribution amount in cents (e.g. 1234 = $12.34). |
newDistributions[].accountId | string | Conditional | TAPI Account ID whose linked external bank account receives the funds. Required when bankId/bankAccountId are not supplied. The account must belong to the authenticated client and have an external account linked (createExternalAccount). |
newDistributions[].bankId | string | Conditional | Destination bank identifier: a 9-digit US ABA routing number (checksum validated), or otherwise treated as an 8-11 character BIC/SWIFT code. Required together with bankAccountId when accountId is not supplied. |
newDistributions[].bankAccountId | string | Conditional | Destination bank account number. With a routing number: 6-17 digits. With a SWIFT code: an IBAN (14-34 alphanumeric characters), or a 6-10 digit Australian or 7-12 digit Canadian account number. |
newDistributions[].transactionType | string | No | Transfer rail, ach or wire. Stored as sent and not validated; null when omitted. |
newDistributions[].transactionMemo | string | No | Free-text memo for the transaction. null when omitted. |
Example Request
curl -X POST "$TAPI_HOST/v3/custody/distributions" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"newDistributions": [{"brokerageAccountId": "NC95156", "amountCents": 1234, "accountId": "A00000003", "transactionType": "ach", "transactionMemo": "Quarterly distribution"}]}'
Response
| Field | Type | Description |
distributions | array | The created distribution records, one per entry in newDistributions. See fields below. |
Response Fields
| Field | Type | Description |
id | string (UUID) | Unique distribution identifier. |
submissionId | string (UUID) | Identifier shared by all distributions created in this submission. |
brokerageAccountId | string | Brokerage (custody) account the funds are distributed from. |
amountCents | integer | Distribution amount in cents. |
status | string | Distribution status. Always pending on creation. |
accountId | string | null | TAPI Account ID whose linked external bank account receives the funds; null when banking details were supplied. |
bankId | string | null | Bank routing number or BIC/SWIFT code; null when accountId was supplied. |
bankAccountId | string | null | Bank account number or IBAN; null when accountId was supplied. |
transactionType | string | null | Transfer rail as submitted (ach or wire). |
transactionMemo | string | null | Memo as submitted. |
createdAt | string (datetime) | Timestamp the distribution was created. |
updatedAt | string (datetime) | Timestamp the distribution was last updated. |
Errors
| HTTP | statusCode | statusDesc |
| 400 | 1400 | Bad request: account ID or banking info required |
| 400 | 1400 | Bad request: only one of account ID or banking info may be specified |
| 400 | 1400 | Bad request: brokerage account '{brokerageAccountId}' does not exist |
| 400 | 1400 | Bad request: '{accountId}' is not a valid account ID |
| 400 | 1400 | Bad request: '{accountId}' is not linked to an external account |
| 422 | 1422 | Invalid request semantics: not a valid bank routing number, not a bank account number, not a valid swift code or not a valid iban |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"distributions": [
{
"id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d",
"submissionId": "f0e1d2c3-b4a5-4968-8776-5a4b3c2d1e0f",
"brokerageAccountId": "NC95156",
"amountCents": 1234,
"status": "pending",
"accountId": "A00000003",
"bankId": null,
"bankAccountId": null,
"transactionType": "ach",
"transactionMemo": "Quarterly distribution",
"createdAt": "2025-02-12 17:11:17",
"updatedAt": "2025-02-12 17:11:17"
}
]
}
POST /v3/deleteCustodyAccountSupplement
This method is used to delete the additional fields stored for a custodial account through createCustodyAccountSupplement. The record is soft deleted and a new supplement can be created for the same account afterwards.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
createdIpAddress | string | No | IP address recorded against the deletion |
Example Request
curl -X POST "$TAPI_HOST/v3/deleteCustodyAccountSupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=someaccountid
Response
| Field | Type | Description |
accountDetails | object | The identifiers of the deleted record |
Example Response
{
"statusCode": "101",
"statusDesc": "Account deleted successfully.",
"accountDetails": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"accountId": "A3091454"
}
}
If the account does not exist or is inactive for the authenticated client, the response is statusCode 148 with statusDesc Account does not exist/active.. Deleting a record that is already deleted returns statusCode 200 with Error(s) set to Account already deleted. If the account never had a supplement record, the response is statusCode 200 with Error(s) set to This accountId is not added in addCustodyAccountSupplement. — the error text names the deprecated alias addCustodyAccountSupplement, not the current endpoint.
POST /v3/getCustodyAccountRequest
This method returns the current status of a custodial account request for the supplied TAPI account.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyAccountRequest" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=A12716
Response
| Field | Type | Description |
custodialAccountDetails | array | Array of custodial account request records (one element). See fields below. |
Response Fields
| Field | Type | Description |
accountId | string | TAPI Account ID the request belongs to. |
custAccStatus | string | Custodial account request status. One of Pending, Need More Info, Approved, Rejected, New Info Added. |
accountStatus | string | Custody account lifecycle status. One of Pending, Open, Closed. |
custAccRequestID | string | Custodial account request ID. |
restrictedStatus | string | Whether the account is restricted. One of Yes, No. |
reasonForStatus | string | null | Reason the account is restricted. One of Missing Data, Acceptance of Terms, KYC/AML, Suitability, or null when not restricted. |
createdDate | string | Date and timestamp the request was created. |
approvalStatus | string | Approval status of the underlying TAPI account (from transact_account). |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodialAccountDetails": [
{
"accountId": "A3177046",
"custAccStatus": "Pending",
"accountStatus": "Pending",
"custAccRequestID": "ROE6ovs",
"restrictedStatus": "No",
"reasonForStatus": null,
"createdDate": "2025-01-03 21:07:24",
"approvalStatus": "Approved"
}
]
}
POST /v3/getCustodialDocuments
This method returns the statements and tax forms generated for a North Capital Private Securities custodial account. Each document URL is a short-lived presigned link (valid for approximately 5 minutes).
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodialDocuments" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=accountId
Response
| Field | Type | Description |
accountDetails | array | Array of available documents for the account. See fields below. |
Response Fields
| Field | Type | Description |
Document Type | string | Document classification. One of Statement, Corrected Statement, Tax Document. |
Month | string | Month the document was generated (1-12). 0 for documents that are not month-specific (e.g. annual tax documents). |
Year | string | Year the document was generated. |
StatementURL | string | Short-lived presigned URL to download the document. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"accountDetails": [
{
"Document Type": "Statement",
"Month": "4",
"Year": "2023",
"StatementURL": "https://prodriaclientrepository.s3.amazonaws.com/...&X-Amz-Signature=..."
}
]
}
POST /v3/getCustodyAccountSupplement
This method is used to retrieve the additional fields stored for a custodial account through createCustodyAccountSupplement.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyAccountSupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=someaccountid
Response
| Field | Type | Description |
accountDetails | object | The stored custodial account supplement record |
The response carries clientID, a masked developerAPIKey, accountId and the stored value of every field accepted by createCustodyAccountSupplement.
Example Response
{
"statusCode": "200",
"statusDesc": "Ok",
"accountDetails": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"accountId": "A3091454",
"appointmentOfInvestmentManager": "2",
"proxyVotingPreferences": "2",
"otherServices": "",
"methodOfContributionOrFunding": "4",
"methodOfContributionTaxYear": "",
"internationalAccountNumber": "",
"bankFirmName1": "Bank of America",
"bankCountry1": "US",
"bankAccountName1": "",
"bankAccountNumber1": "123456789",
"bankFirmName2": "",
"bankCountry2": "",
"bankAccountName2": "",
"bankAccountNumber2": "",
"maritalStatus": "1",
"mailingAddressLine1": "123 Testing Way",
"mailingAddressLine2": "",
"mailingCity": "Orem",
"mailingState": "UT",
"mailingZipCode": "84097",
"mailingCountry": "US"
}
}
If the account does not exist or is inactive for the authenticated client, the response is statusCode 148 with statusDesc Account does not exist/active.. If the account has no supplement record, the response is statusCode 200 with Error(s) set to This accountId is not added in addCustodyAccountSupplement. — the error text names the deprecated alias addCustodyAccountSupplement, not the current endpoint.
POST /v3/getCustodyBalances
This method is used to get the Cash, Securities, and Total account values of a custody account.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyBalances" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=accountId
Response
| Field | Type | Description |
custodyBalances | array | Array of custody account balances and intents (one entry per account) |
| Field | Type | Description |
accountId | string | Account the request is being made against |
fundMoveIntents | number | The total amount of intended deposits (fund movements into the account), in decimal dollars. Deposits that have been registered with the payment processor but have not been submitted to the bank for processing. |
disbursementIntents | number | The total amount of intended withdrawals (disbursements from the account), in decimal dollars. Withdrawals that have been registered with the payment processor but have not been processed nor initiated. |
cashAvailableBalance | number | The available cash balance of all settled transactions in the account, in decimal dollars. |
cashTotalBalance | number | The total cash balance in the account, including any pending transactions, in decimal dollars. |
securitiesPosition | number | The total value of securities held in the account, in decimal dollars. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyBalances": [
{
"accountId": "A50648187",
"fundMoveIntents": 200000000,
"disbursementIntents": 1000,
"cashAvailableBalance": 261266.75,
"cashTotalBalance": 262290.2,
"securitiesPosition": 16810
}
]
}
POST /v3/getCustodyCashTransactions
This method returns the paginated cash transaction history (deposits, withdrawals, fees, and other cash activity) for a custody account. Withdrawals/debits are returned as negative amounts. Results are ordered by transaction date, most recent first.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
offset | integer | No | The row index at which to begin the query. Zero represents the first transaction in the list. Defaults to 0. |
limit | integer | No | The maximum number of transactions to return. Defaults to 10. Max value is 500. |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyCashTransactions" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=accountId \
-d offset=0 \
-d limit=10
Response
| Field | Type | Description |
brokerageTransactions | array | Array of cash transactions. See fields below. |
pagination | object | Pagination metadata. |
Response Fields
Each entry in brokerageTransactions:
| Field | Type | Description |
id | string | Brokerage transaction identifier (brokerage_transaction_id). |
date | string | Transaction date (YYYY-MM-DD). |
name | string | Customer / counterparty name on the transaction. |
notes | string | Free-text notes on the transaction. |
status | string | Transaction status (e.g. Pending, Settled). |
referenceNumber | string | Reference number associated with the transaction. |
settledDate | string | Date the transaction settled (YYYY-MM-DD), or 0000-00-00 if not yet settled. |
createdDate | string | Date and timestamp the transaction was created. |
updatedDate | string | Date and timestamp the transaction was last updated. |
amount | string | Signed cash amount; debits (fund_move = Debit) are returned as negative values. |
| Field | Type | Description |
totalRecords | integer | Total number of matching transactions. |
startIndex | integer | Zero-based index of the first transaction returned. |
endIndex | integer | Zero-based index of the last transaction returned. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"brokerageTransactions": [
{
"id": "CT000021436",
"date": "2024-10-03",
"name": "Chelsea Elting",
"notes": "TEST",
"status": "Settled",
"referenceNumber": "339846456",
"settledDate": "0000-00-00",
"createdDate": "2024-10-03 18:31:44",
"updatedDate": "0000-00-00 00:00:00",
"amount": "100.00"
},
{
"id": "CT000021437",
"date": "2024-10-03",
"name": "Chelsea Elting",
"notes": "TESTING",
"status": "Settled",
"referenceNumber": "417184939",
"settledDate": "0000-00-00",
"createdDate": "2024-10-03 18:35:57",
"updatedDate": "0000-00-00 00:00:00",
"amount": "-5.37"
}
],
"pagination": {
"totalRecords": 2,
"startIndex": 0,
"endIndex": 1
}
}
POST /v3/getCustodyFundMove
Get information about a custody fund move intent (deposit)
Parameters
| Parameter | Type | Required | Description |
referenceNumber | string | Yes | Reference Number that is generated by the API once fund move is completed (fundCustodyAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyFundMove" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=accountId \
-d referenceNumber=somereferencenumber
Response
| Field | Type | Description |
custodyTransaction | object | The fund move transaction. See fields below. |
Response Fields
| Field | Type | Description |
accountId | string | TAPI Account ID the fund move belongs to. |
bankName | string | null | Name of the external bank, when available. |
amount | string | Amount of the fund move (decimal string). |
accountNumber | string | External bank account number (decoded). Empty string when not exposed. |
routingNumber | string | External bank routing number (decoded). |
accountName | string | Name on the external bank account. |
referenceNumber | string | API-generated reference number identifying this fund move. |
description | string | Description provided on the request. |
approvalStatus | string | Internal approval state. |
status | string | Fund move (fundStatus) state. One of Pending, Submitted, Settled, Returned, Voided, Declined. |
routingNumberStatus | string | Routing number verification result (e.g. Verified). |
errors | string | Error detail associated with the transaction; empty string when none. |
createdDate | string | Date and timestamp the fund move was created. |
updatedDate | string | Date and timestamp the fund move was last updated. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyTransaction": {
"accountId": "A3110006",
"bankName": null,
"amount": "7.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "339846456",
"description": "",
"approvalStatus": "approved",
"status": "Pending",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-10 22:49:06",
"updatedDate": "2024-12-10 22:49:06"
}
}
POST /v3/getCustodyFundMoves
Get the list of custody fund move intents for a given custody account
Parameters
| Parameter | Type | Required | Description |
accountId | string | No | Account ID that is generated by the API once an account is created (createAccount) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyFundMoves" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=accountId
Response
| Field | Type | Description |
custodyTransactions | array | Array of fund move transactions. Each entry carries the same fields as the custodyTransaction object returned by getCustodyFundMove. |
pagination | object | Pagination metadata. |
| Field | Type | Description |
totalRecords | integer | Total number of matching fund moves. |
startIndex | integer | Zero-based index of the first fund move returned. |
endIndex | integer | Zero-based index of the last fund move returned. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyTransactions": [
{
"accountId": "A3110006",
"bankName": null,
"amount": "7.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "339846456",
"description": "",
"approvalStatus": "approved",
"status": "Pending",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-10 22:49:06",
"updatedDate": "2024-12-10 22:49:06"
},
{
"accountId": "A3110006",
"bankName": null,
"amount": "0.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "417184939",
"description": "",
"approvalStatus": "approved",
"status": "Pending",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-03 21:56:24",
"updatedDate": "2024-12-03 21:56:24"
},
{
"accountId": "A3110006",
"bankName": null,
"amount": "0.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "916079744",
"description": "",
"approvalStatus": "approved",
"status": "Pending",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-03 21:47:21",
"updatedDate": "2024-12-03 21:47:21"
},
{
"accountId": "A3110006",
"bankName": null,
"amount": "100.000000",
"accountNumber": "MTExMTIyMjIzMzMzMDAwMA==",
"routingNumber": "MDExMDAxNzI2",
"accountName": "Chelsea Elting",
"referenceNumber": "879361244",
"description": "",
"approvalStatus": "approved",
"status": "SETTLED",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-11-26 17:06:53",
"updatedDate": "2024-12-03 21:09:38"
},
{
"accountId": "A3110006",
"bankName": null,
"amount": "51.250000",
"accountNumber": "MTExMTIyMjIzMzMzMDAwMA==",
"routingNumber": "MDExMDAxNzI2",
"accountName": "Chelsea Elting",
"referenceNumber": "520284442",
"description": "investment in ABC",
"approvalStatus": "approved",
"status": "Voided",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-10-18 19:13:16",
"updatedDate": "2024-11-04 23:21:17"
}
],
"pagination": {
"totalRecords": 5,
"startIndex": 0,
"endIndex": 4
}
}
POST /v3/getCustodyFundDisbursements
This method returns a paginated list of the custody fund disbursement requests created through createCustodyFundDisbursement, including the current status of each request. Only disbursements owned by the authenticated client are returned.
Parameters
| Parameter | Type | Required | Description |
filter | string | No | filter by parameters such as {"requestId":"",accountId":""} |
offset | integer | No | The row index at which to begin the query. Zero represents the first record in the list. Defaults to 0. |
limit | integer | No | The maximum number of records to return. Defaults to 10. |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyFundDisbursements" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY"
Response
| Field | Type | Description |
custodyFundDisbursements | array | Array of disbursement requests. See fields below. |
pagination | object | Pagination metadata. |
Response Fields
| Field | Type | Description |
requestId | string (UUID) | Unique disbursement request identifier. |
accountId | string | TAPI Account ID the disbursement is drawn from. |
amount | string | Disbursement amount, with two decimal places. |
type | string | Transfer type. One of ach, wire_domestic, wire_international. |
bankId | string | null | Destination bank/routing identifier (wire transfers); empty or null for ACH. |
bankAccountId | string | null | Destination bank account identifier (wire transfers); empty or null for ACH. |
additionalDetails | string | null | Additional instructions provided on the request. |
status | string | Disbursement status. One of pending, processing, on_hold, approved, rejected, scheduled, in_review, completed, terminated, failed, reopened. |
createdDate | string | Date and timestamp the disbursement was created. |
updatedDate | string | Date and timestamp the disbursement was last updated. |
| Field | Type | Description |
totalRecords | integer | Total number of matching records. |
startIndex | integer | Zero-based index of the first record returned. |
endIndex | integer | Zero-based index of the last record returned. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyFundDisbursements": [
{
"requestId": "baca4059-e3af-43a4-a86b-4838c91be975",
"accountId": "A98780730",
"amount": "20.20",
"type": "wire_domestic",
"bankId": "122100024",
"bankAccountId": "12345688",
"additionalDetails": "",
"status": "pending",
"createdDate": "2024-11-26 20:51:40",
"updatedDate": "2024-11-26 20:52:43"
},
{
"requestId": "953cfa35-37c2-4360-b2ed-78db9fb8b331",
"accountId": "A98780730",
"amount": "20.20",
"type": "ach",
"bankId": "",
"bankAccountId": "",
"additionalDetails": "",
"status": "pending",
"createdDate": "2024-11-26 17:23:05",
"updatedDate": "2024-11-26 17:23:05"
},
{
"requestId": "002717a3-a612-4e94-b517-3f4dbd79b523",
"accountId": "A98780730",
"amount": "20.20",
"type": "ach",
"bankId": "",
"bankAccountId": "",
"additionalDetails": "test",
"status": "pending",
"createdDate": "2024-11-26 15:45:51",
"updatedDate": "2024-11-26 15:45:51"
}
],
"pagination": {
"totalRecords": 3,
"startIndex": 0,
"endIndex": 2
}
}
POST /v3/updateCustodyAccountRequest
This method is used to update the status of an existing custody account request (createCustodyAccountRequest) when new information has been added. You must update the status to "New Info Added" in order to initiate a re-review of the account. The deprecated alias updateCustodialAccountRequest routes to the same handler (see Deprecated Endpoints).
Parameters
| Parameter | Type | Required | Description |
custAccRequestID | string | Yes | Request ID Generated by the createCustodyAccountRequest method |
custAccRequestStatus | string | Yes | Custody Account status. One of Pending, New Info Added. Set to New Info Added to initiate a re-review of the account. |
notes | string | No | Notes |
updatedIpAddress | string | No | IP Address associated with the updateCustodyAccountRequest method call |
Example Request
curl -X POST "$TAPI_HOST/v3/updateCustodyAccountRequest" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d custAccRequestID=hut67yt \
-d "custAccRequestStatus=New Info Added" \
-d "notes=Need Info" \
-d updatedIpAddress=10.0.0.1
Response
| Field | Type | Description |
custodialAccountDetails | array | Array of custodial account request records (one element) |
Response Fields
| Field | Type | Description |
accountId | string | TAPI Account ID the request belongs to. |
custAccStatus | string | Custodial account request status after the update. |
accountStatus | string | Custody account lifecycle status. One of Pending, Open, Closed. |
custAccRequestID | string | Custodial account request ID. |
createdDate | string | Date and timestamp the request was created. |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodialAccountDetails": [
{
"accountId": "A43969",
"custAccStatus": "New Info Added",
"accountStatus": "Pending",
"custAccRequestID": "ttsUaKo",
"createdDate": "2018-10-06 07:24:52"
}
]
}
POST /v3/updateCustodyAccountSupplement
This method is used to update the additional fields stored for a custodial account through createCustodyAccountSupplement. Fields omitted from the request keep their stored values.
Parameters
| Parameter | Type | Required | Description |
accountId | string | Yes | Account ID that is generated by the API once an account is created (createAccount) |
appointmentOfInvestmentManager | string | No | 1 - I/We wish to appoint an investment manager. Complete Part 1A 2 - No appointment at this time |
proxyVotingPreferences | string | No | 1 - Receive all proxy materials 2 - Send all proxy marterials to an investment manager 3 - Do not send proxy material |
otherServices | string | No | Please provide the details of the other services required. |
methodOfContributionOrFunding | string | No | 1 - Transfer 2 - Regular Contribution 3 - Roth Conversion 4 - Rollover 5 - SEP Contribution. See createCustodyAccountSupplement for the full description of each option. |
methodOfContributionTaxYear | string | No | If "methodOfContributionOrFunding is option 2 - this is required to complete "Contribution for Tax Year 'YYYY'. |
internationalAccountNumber | string | No | If the account is an international account, please include the account number here. |
bankFirmName1 | string | No | Name of the bank/firm where the assets are currently held. |
bankCountry1 | string | No | Country of the bank/firm where the assets are currently held. |
bankAccountName1 | string | No | Name on the account where the assets are currently held. |
bankAccountNumber1 | string | No | Account number of the account where the assets are currently held. |
bankFirmName2 | string | No | Name of the bank/firm where the assets are currently held. |
bankCountry2 | string | No | Country of the bank/firm where the assets are currently held. |
bankAccountName2 | string | No | Name on the account where the assets are currently held. |
bankAccountNumber2 | string | No | Account number of the account where the assets are currently held. |
maritalStatus | string | No | 1 - Not married. 2 - Married If you designate a primary benefiicary other than or in addition to your spouse, spousal consent may be required. |
mailingAddressLine1 | string | No | Mailing Address Line 1 |
mailingAddressLine2 | string | No | Mailing Address Line 2 |
mailingCity | string | No | Mailing Address City |
mailingState | string | No | Mailing Address State |
mailingZipCode | string | No | Mailing Address Zip Code |
mailingCountry | string | No | Mailing Address Country |
createdIpAddress | string | No | IP address recorded against the update |
Example Request
curl -X POST "$TAPI_HOST/v3/updateCustodyAccountSupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d accountId=someaccountid \
-d methodOfContributionOrFunding=2 \
-d methodOfContributionTaxYear=2025 \
-d "mailingAddressLine1=123 Testing Way" \
-d mailingCity=Orem \
-d mailingState=UT \
-d mailingZipCode=84097 \
-d mailingCountry=US
Response
| Field | Type | Description |
accountDetails | object | The identifiers of the updated record |
Example Response
{
"statusCode": "101",
"statusDesc": "Account updated successfully.",
"accountDetails": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"accountId": "A3091454"
}
}
If the account does not exist or is inactive for the authenticated client, the response is statusCode 148 with statusDesc Account does not exist/active.. If the account has no supplement record, the response is statusCode 200 with Error(s) set to This accountId is not added in addCustodyAccountSupplement. — the error text names the deprecated alias addCustodyAccountSupplement, not the current endpoint.
POST /v3/updateCustodyFundMove
This method is used to update the pending ACH transaction to void. This can only be used on a transaction that is in a "Pending" status. "Pending" transactions are submitted for processing at 6:00 PM Eastern Time every business day.
Parameters
| Parameter | Type | Required | Description |
referenceNumber | string | Yes | Reference Number that is generated by the API once an fund custodial Account is initiated ( createCustodyFundMove ) |
status | string | Yes | Set value to "void" to update the pending ACH transaction. This can only be used on a transaction that is in a "Pending" status. "Pending" transactions are submitted for processing at 6:00 PM Eastern Time every business day. |
Example Request
curl -X POST "$TAPI_HOST/v3/updateCustodyFundMove" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d referenceNumber=313889266 \
-d status=void
Response
| Field | Type | Description |
custodyTransaction | object | Custody transaction details |
Example Response
{
"statusCode": "101",
"statusDesc": "Ok",
"custodyTransaction": {
"accountId": "A3110006",
"bankName": null,
"amount": "7.000000",
"accountNumber": "",
"routingNumber": "011001726",
"accountName": "",
"referenceNumber": "339846456",
"description": "",
"approvalStatus": "approved",
"status": "void",
"routingNumberStatus": "Verified",
"errors": "",
"createdDate": "2024-12-10 22:49:06",
"updatedDate": "2024-12-10 23:20:06"
}
}
POST /v3/updateCustodyPartySupplement
This method is used to update the additional fields that may be required in order to open a custodial account through North Capital Private Securities.
Parameters
| Parameter | Type | Required | Description |
partyId | string | Yes | Party ID that is generated by the API once a party is created (createParty) |
relationship | string | No | The party's relationship to the account owner. Put "owner" if this is the account owner. |
salutation | string | No | The party's title. Enum: Mr., Mrs., Ms., Dr. Deprecated aliases: 1 (Mr.), 2 (Mrs.), 3 (Ms.), 4 (Dr.). The field is not validated, so any other value is stored as sent. |
countryOfCitizenship | string | No | Party's country of citizenship. |
authorizedSigner | string | No | Is this party the authorized signer for the account? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
controlPerson | string | No | Is this party a control person for the account? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
politicallyExposedPerson | string | No | Is this person considered a politically exposed person? Enum (case-insensitive): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
politicallyExposedPersonDetails | string | No | If the person selects "Yes" that they are a politically exposed person, then this field is required. Please provide the details of the politically exposed person. |
beneficiaryType | string | No | The beneficiary type, if this party is a beneficiary for the account. Enum: Spouse, Non-Spouse, Trust/Entity. Deprecated aliases: 1 (Spouse), 2 (Non-Spouse), 3 (Trust/Entity). The field is not validated, so any other value is stored as sent. |
beneficiaryPercentage | string | No | If this party is a beneficiary for the account, please provide the percentage. Stored as sent and not validated. |
mailingAddressLine1 | string | No | Mailing Address Line 1 |
mailingAddressLine2 | string | No | Mailing Address Line 2 |
mailingCity | string | No | Mailing Address City |
mailingState | string | No | Mailing Address State |
mailingZipCode | string | No | Mailing Address Zip Code |
mailingCountry | string | No | Mailing Address Country |
publicCompany | string | No | Is this party associated with a public company? Enum (case-insensitive, stored lowercase): Yes, No. Deprecated aliases: 1 (Yes), 2 (No). Any other value stores an empty string. |
companyTicker | string | No | Company Ticker if the party is associated with a public company |
associatedFirm | string | No | If the party is associated with a broker dealer, please indicate the name of the Associated Firm |
createdIpAddress | string | No | IP address recorded against the record |
Example Request
curl -X POST "$TAPI_HOST/v3/updateCustodyPartySupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d partyId=somepartyid \
-d relationship=owner \
-d salutation=Mr \
-d countryOfCitizenship=citizenship \
-d authorizedSigner=yes \
-d controlPerson=yes \
-d politicallyExposedPerson=yes \
-d "politicallyExposedPersonDetails=some details" \
-d beneficiaryType=Spouse \
-d beneficiaryPercentage=100 \
-d mailingAddressLine1=address1 \
-d mailingAddressLine2=address2 \
-d mailingCity=city \
-d mailingState=state \
-d mailingZipCode=54321 \
-d mailingCountry=US \
-d publicCompany=yes \
-d companyTicker=test \
-d associatedFirm=test
Response
| Field | Type | Description |
party details | object | The identifiers of the updated record |
Fields omitted from the request keep their stored values. If the party has no supplement record, the response is statusCode 200 with Error(s) set to This partyId is not added in addCustodyPartySupplement. — the error text names the deprecated alias addCustodyPartySupplement, not the current endpoint.
Example Response
{
"statusCode": "101",
"statusDesc": "Party updated successfully.",
"party details": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"partyId": "P43256"
}
}
POST /v3/getCustodyPartySupplement
This method is used to retrieve the additional fields stored for a party through createCustodyPartySupplement.
Parameters
| Parameter | Type | Required | Description |
partyId | string | Yes | Party ID that is generated by the API once a party is created (createParty) |
Example Request
curl -X POST "$TAPI_HOST/v3/getCustodyPartySupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d partyId=somepartyid
Response
| Field | Type | Description |
party details | object | The stored party details |
The response carries the stored values for every field accepted by createCustodyPartySupplement, plus partyType (Individual or Entity). salutation is returned as primappTitle. developerAPIKey is masked.
Example Response
{
"statusCode": "200",
"statusDesc": "Ok",
"party details": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"partyId": "P2726935",
"partyType": "Individual",
"primappTitle": "Mr.",
"relationship": "owner",
"countryOfCitizenship": "usa",
"authorizedSigner": "Yes",
"controlPerson": "No",
"politicallyExposedPerson": "No",
"politicallyExposedPersonDetails": "",
"beneficiaryType": "Spouse",
"beneficiaryPercentage": "100",
"mailingAddressLine1": "123 Testing Way",
"mailingAddressLine2": "",
"mailingCity": "Orem",
"mailingState": "UT",
"mailingZipCode": "84097",
"mailingCountry": "usa",
"publicCompany": "no",
"companyTicker": "",
"associatedFirm": ""
}
}
If the party has no supplement record, the response is statusCode 200 with Error(s) set to This partyId is not added in addCustodyPartySupplement. — the error text names the deprecated alias addCustodyPartySupplement, not the current endpoint.
POST /v3/deleteCustodyPartySupplement
This method is used to delete the additional fields stored for a party. The record is soft deleted and a new supplement can be created for the same party afterwards.
Parameters
| Parameter | Type | Required | Description |
partyId | string | Yes | Party ID that is generated by the API once a party is created (createParty) |
createdIpAddress | string | No | IP address recorded against the deletion |
Example Request
curl -X POST "$TAPI_HOST/v3/deleteCustodyPartySupplement" \
-H "Authorization: Bearer $TAPI_CLIENT_ID:$TAPI_API_KEY" \
-d partyId=somepartyid
Response
| Field | Type | Description |
party details | object | The identifiers of the deleted record |
Example Response
{
"statusCode": "101",
"statusDesc": "Party deleted successfully.",
"party details": {
"clientID": "someclientid",
"developerAPIKey": "XXXXXXXXXXXXXXX",
"partyId": "P43256"
}
}
Deleting a record that is already deleted returns statusCode 200 with Error(s) set to Party already deleted. If the party never had a supplement record, the response is statusCode 200 with Error(s) set to This partyId is not added in addCustodyPartySupplement. — the error text names the deprecated alias, not the current endpoint.