Service status ·A8 Core™ · The Operating System for Financial Accounts ·The account operating system · API-first
API reference v1
A8 Core™ API · v1

API reference

A8 Core™ — the operating system for financial accounts — exposes account, client, financial, and reporting operations as a JSON API over HTTPS. This reference documents the request and response contract for each operation.

Production API base URL

BASEhttps://api.a8core.io/v1

A8 Core™ documentation and developer resources are published on a8core.com. API requests are transmitted to the A8 Core™ web service at api.a8core.io. All v1 endpoint paths shown in this documentation are relative to https://api.a8core.io/v1.

Environment hosts and base URLs are provisioned per institution. The base URL shown is the documentation default; your sandbox and production hosts are issued with your API credentials during onboarding.

Service families

Every operation in this reference belongs to one of five service families. The family tells you what a call does to the record; the method and path tell you which record.

  • Create

    Create Client, Account and Asset records.

  • Manage

    Manage existing Client, Account and Asset records.

  • Update

    Update existing Client, Account and Asset records.

  • Financial

    Deposit and send funds to and from a client account by ACH or card.

  • Utility

    Administrative APIs for operating A8 Core.

The five A8 Core service families. Every endpoint in the API belongs to exactly one of them. Personal identifiers submitted to the Create family are designed to be held in a separate vault and replaced in the record by a random surrogate token; see data protection and PII handling for the design and its current status.

Authentication

Every request is authenticated with a hash-based message authentication code (HMAC). Build a canonical base from the method, URL, timestamp and JSON body, sign it with your shared secret using HMAC-SHA256, and pass the result in the Authorization header as HMAC keyId:signature:timestamp. Requests without a valid signature are rejected.

request headers
Content-Type: application/json
Authorization: HMAC key_live_8fa2c1e4:9f86d081884c7d65...:1782925451
Keep your secret server-side. Signatures should be computed at request time over the exact JSON body; any modification to the payload invalidates the signature.

Conventions

A few patterns hold across the entire API:

Field naming & identifiers

Field names use PascalCase. Resource identifiers — ClientId, AccountId — are Guid values. Reference IDs you supply (such as ProviderReferenceId) are free-form strings scoped to your provider.

The response envelope

Operations return a consistent envelope: a RequestId that identifies the call, and a Status indicating the outcome. Resource operations add the resulting identifier (e.g. AccountId).

Status: 1 — request passed
Status: 0 — request failed

RequestId is a 13-digit long; log it on your side so any call can be traced end to end through the platform’s audit log.

Getting started

Idempotency, pagination & errors

A few conventions apply to every operation. Following them keeps integrations safe to retry and easy to debug.

Idempotency

Send a stable ProviderReferenceId on every POST that creates or moves money (Fund Account, Transact, Create Client). A8 Core™ treats a repeated ProviderReferenceId from the same provider as the same operation, so a retried request never double-applies.

Pagination

List operations accept PageNumber and PageSize and return a TotalCount alongside the records, so you can page deterministically.

Errors

Every response carries the standard envelope. On a handled application error the call still returns HTTP 200 with Status = 0 and a ResponseStatus object describing the failure; transport, authentication, and signature failures return a non-2xx HTTP status.

Error envelope
"RequestId": 1736472902501,
"Status": 0,
"ResponseStatus": { "ErrorCode": "ClientNotFound", "Message": "No client matches the supplied ClientId." }
Accounts

Create Account

Opens a new A8 Core™ account of a given type for an existing client, optionally linked to a sponsor investment.

POSThttps://api.a8core.io/v1/accountsoperation: CreateAccount

Request

NameTypeDescription
ProviderReferenceIdstringoptionalYour internal reference ID for the account being created.
ClientIdGuidrequiredThe A8 Core™ Client ID the account belongs to.
AccountTypeCodestringrequiredAccount type slug, e.g. roth-ira. Required parameters vary by nature — see the type’s own page.
InstitutionIdGuidconditionalRequired for CustodialHolding, PlanHolding, and DepositLiability.
TrusteeIdGuidconditionalRequired for PlanHolding (ERISA § 403(a)).
InvestmentIdlongoptionalLinks the account to a specific sponsor investment.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
AccountIdGuidThe newly created A8 Core™ Account ID.

Example request

POST https://api.a8core.io/v1/accounts
"ProviderReferenceId": "acct-10293",
"ClientId": "8fa2c1e4-5b6d-4f3a-9c2e-7d1a2b3c4d5e",
"AccountTypeCode": "roth-ira",
"InstitutionId": "b4c1e770-9d33-4a02-91ef-2c6a8b5d0f14",
"InvestmentId": 84217

Example response

200 OK
"RequestId": 1736472901835,
"Status": 1,
"AccountId": "3c7b1f90-2a44-4e21-8d6c-9b0e5a1f7c22"
Reference

Account types

A8 Core™ does not have one kind of account. It has five natures, distinguished by who holds title and who owes what to whom. Nature is a type, not a column.

Pass the slug as AccountTypeCode on Create Account. Each type below has its own reference page with required parameters, a worked example, error codes, and the rules that govern it.

CustodialHolding — Beneficial owner holds title; the institution holds possession. Off balance sheet.

PlanHolding — Assets held in trust under a plan. A named trustee is required.

BenefitObligation — No assets. An employer obligation and a claims ledger.

DepositLiability — The institution owes the customer money. On balance sheet. May go negative.

ServicingRecord — Recorded, not held. No assets and no obligation.

Why nature is a type. ERISA § 403(a) requires plan assets be held in trust by a named trustee, so PlanHolding.TrusteeId is non-nullable. A BenefitObligation holds no securities, so it does not implement IHoldsAssets. A deposit is a liability of the institution, not a holding of the customer — so DepositLiability has no holdings collection and its balance may go negative.

Availability is computed, not declared

Every account type declares the authorities an institution must hold before it may open one. Within a requirement group, any one authority satisfies it. Across groups, all must be satisfied.

AuthorityLegal basis
IrsNonbankCustodianTreas. Reg. § 1.408-2(e). Scoped by asset class in the approval letter.
Bank12 U.S.C. § 1813(a), or a state bank charter. For IRAs, § 408(n).
StateTrustCompanyState trust charter with fiduciary powers.
InsuredDepositoryInstitution12 U.S.C. § 1813(c). The only authority that permits taking deposits.
HsaTrusteeOrCustodianI.R.C. § 223(d)(1)(B): a bank, an insurance company, or an IRS-approved nonbank trustee.
EsaTrusteeOrCustodianI.R.C. § 530(b)(1)(B).
TrumpAccountTrusteeA § 408(n) bank, or an IRS-approved nonbank trustee of a Trump account. An entity approved as an IRA nonbank trustee on or before 2025-12-31 is automatically approved, but must notify the IRS under Treas. Reg. § 1.408-2(e)(6)(iv). Notice 2025-68 Q&A A-3.
TreasuryFinancialAgentSelected by Treasury under I.R.C. § 530A(g) to serve as trustee of INITIAL Trump accounts. Rollover Trump account trustees are not subject to this selection.
ErisaTrusteeERISA § 403(a). Capacity to hold plan assets in trust.
BrokerDealerExchange Act § 15(b) registration.
QualifiedCustodianAdvisersActAdvisers Act Rule 206(4)-2(d)(6). Not implied by any other authority.
StateQtpServicingAgreementContract with a State qualified tuition program. I.R.C. § 529(b)(1).
PermittedPaymentStablecoinCustodianGENIUS Act, Pub. L. 119-27. Supervised entities only.
resolution
available = institution satisfies the type's authority requirements
           provider is contracted for the type
           type status is shippable, or the gate is satisfied

Call GET https://api.a8core.io/v1/account-types to resolve it. The directory above is the superset the platform supports, not the list any one institution may offer.

Only an insured depository institution may take deposits. A nonbank custodian approved under Treas. Reg. § 1.408-2(e) does not qualify — that approval says nothing about deposit-taking authority.
TaxType is gone. It hid two independent facts: whether a contribution is deductible, and how earnings are taxed. A Trump account has mixed contribution treatment with tax-deferred earnings. No single value could say that.
Accounts

Get Account

GEThttps://api.a8core.io/v1/accounts/{AccountId}operation: GetAccount

Request

NameTypeDescription
AccountIdGuidrequiredThe A8 Core™ Account ID, supplied as a path parameter.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
AccountIdGuidThe A8 Core™ Account ID.
AccountNumberstringThe account number.
ClientIdGuidThe client the account belongs to.
AccountTypeCodestringAccount type slug.
PhasestringStandard, GrowthPeriod, PostGrowth, or InheritedDistribution.
AccountStatusstringCurrent account status.
EstablishedDatedatetimeWhen the account was established.
AccountBalanceAccountBalanceAvailable and settled balance.

Example request

GET https://api.a8core.io/v1/accounts/{AccountId}
GET https://api.a8core.io/v1/accounts/3c7b1f90-2a44-4e21-8d6c-9b0e5a1f7c22

Example response

200 OK
"RequestId": 1736472901835,
"Status": 1,
"AccountId": "3c7b1f90-2a44-4e21-8d6c-9b0e5a1f7c22",
"AccountNumber": "100023481",
"AccountTypeCode": "roth-ira",
"Phase": "Standard",
"AccountStatus": "Active"
Accounts

Update Account

PATCHhttps://api.a8core.io/v1/accounts/{AccountId}operation: UpdateAccount

Request

NameTypeDescription
AccountIdGuidrequiredThe A8 Core™ Account ID, supplied as a path parameter.
ProviderReferenceIdstringoptionalYour internal reference for the account.
AccountStatusstringoptionalNew account status.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
AccountIdGuidThe updated A8 Core™ Account ID.

Example request

PATCH https://api.a8core.io/v1/accounts/{AccountId}
"ProviderReferenceId": "acct-10293-v2",
"AccountStatus": "Active"

Example response

200 OK
"RequestId": 1736472901922,
"Status": 1,
"AccountId": "3c7b1f90-2a44-4e21-8d6c-9b0e5a1f7c22"
Clients

Create Client

POSThttps://api.a8core.io/v1/clientsoperation: CreateClient

Request

NameTypeDescription
ProviderReferenceIdstringoptionalYour internal reference for the client.
ClientTypestringrequiredThe client type, e.g. Individual or Entity.
ContactContactrequiredName and contact details for the client.
SponsorIdGuidoptionalLinks the client to a sponsor.
OFACOFACInfooptionalOptional OFAC screening information.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
ClientIdGuidThe newly created A8 Core™ Client ID.

Example request

POST https://api.a8core.io/v1/clients
"ProviderReferenceId": "cli-55021",
"ClientType": "Individual",
"Contact": { "FirstName": "Jordan", "LastName": "Rivera" }

Example response

200 OK
"RequestId": 1736472902004,
"Status": 1,
"ClientId": "8fa2c1e4-5b6d-4f3a-9c2e-7d1a2b3c4d5e"
Clients

Get Client

GEThttps://api.a8core.io/v1/clients/{ClientId}operation: GetClient

Request

NameTypeDescription
ClientIdGuidrequiredThe A8 Core™ Client ID, supplied as a path parameter.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
ClientIdGuidThe A8 Core™ Client ID.
ClientNumberstringThe client number.
ClientTypestringThe client type.
ContactContactClient contact details.
ClientStatusstringCurrent client status.
CreatedDatedatetimeWhen the client was created.

Example request

GET https://api.a8core.io/v1/clients/{ClientId}
GET https://api.a8core.io/v1/clients/8fa2c1e4-5b6d-4f3a-9c2e-7d1a2b3c4d5e

Example response

200 OK
"RequestId": 1736472902110,
"Status": 1,
"ClientId": "8fa2c1e4-5b6d-4f3a-9c2e-7d1a2b3c4d5e",
"ClientType": "Individual",
"ClientStatus": "Active"
Financial

Fund Account

POSThttps://api.a8core.io/v1/accounts/{AccountId}/fundoperation: FundAccount

Request

NameTypeDescription
AccountIdGuidrequiredThe account to fund, supplied as a path parameter.
AmountdecimalrequiredThe deposit amount.
CurrencystringrequiredISO currency code, e.g. USD.
PaymentMethodTypestringrequiredHow the deposit is made, e.g. ECheck.
TaxYearintoptionalValidated against the type’s ContributionYearRule. A Trump account is CalendarYearOnly: there is no prior-year election.
PlanYearintconditionalRequired for BenefitObligation.
ContributionSourcestringconditionalRequired for a Trump account. Drives both cap participation and basis.
ProviderReferenceIdstringoptionalYour reference; used as the idempotency key.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
TransactionIdGuidThe resulting transaction ID.

Example request

POST https://api.a8core.io/v1/accounts/{AccountId}/fund
"Amount": 5000.00,
"Currency": "USD",
"PaymentMethodType": "ECheck",
"TaxYear": 2026,
"ProviderReferenceId": "fund-90233"

Example response

200 OK
"RequestId": 1736472902255,
"Status": 1,
"TransactionId": "d99c0a31-7e0b-4a18-9f55-1c2d3e4f5a01"
Financial

Transact

POSThttps://api.a8core.io/v1/accounts/{AccountId}/transactoperation: Transact

Request

NameTypeDescription
AccountIdGuidrequiredThe account to transact against, supplied as a path parameter.
EntryTypestringrequiredThe transaction entry type, e.g. Fee or Distribution.
AmountdecimalrequiredThe transaction amount.
CurrencystringrequiredISO currency code, e.g. USD.
PaymentMethodTypestringoptionalPayment method, where applicable.
DescriptionstringoptionalFree-form description.
ProviderReferenceIdstringoptionalYour reference; used as the idempotency key.

Response

NameTypeDescription
RequestIdlong13-digit ID for the API request that was made.
StatusintOutcome of the request: 1 for pass, 0 for fail.
TransactionIdGuidThe resulting transaction ID.

Example request

POST https://api.a8core.io/v1/accounts/{AccountId}/transact
"EntryType": "Distribution",
"Amount": 1200.00,
"Currency": "USD",
"Description": "Q2 scheduled distribution",
"ProviderReferenceId": "txn-44120"

Example response

200 OK
"RequestId": 1736472902390,
"Status": 1,
"TransactionId": "a71b9c20-3d44-4e55-8c66-9b0e5a1f7c33"

Webhooks

A8 Core™ pushes account, client, and financial events to your endpoints as signed webhooks, so you react to activity without polling.

You register one HTTPS endpoint per event type. When the event fires, A8 Core™ POSTs a signed JSON envelope to your URL. Every delivery is signed per RFC 9421 HTTP Message Signatures, so you verify authenticity before acting.

Event catalog

EventFires when
account.createdAn account was opened.
account.updatedAn account’s details or status changed.
client.createdA client was created.
client.updatedA client’s details or status changed.
deposit.postedA deposit directive posted to an account.
withdrawal.postedA withdrawal directive posted.
transfer.completedA transfer directive completed.
rollover.completedA rollover directive completed.
investment.purchasedAn investment purchase directive completed.
investment.soldAn investment sale directive completed.
Neither event fires for a BenefitObligation or a DepositLiability. Both reject investment directives with ErrorCode: "AccountTypeNotInvestable".
recharacterization.completedA recharacterization directive completed.
rothconversion.completedA Roth conversion directive completed.

Delivery payload

POST to your endpoint
Signature-Input: sig1=("@authority" "content-digest");created=1782925451;keyid="a8core-ed25519-2026a";alg="ed25519"
Signature: sig1=:k8r2...c1Qe:

"EventId": "e51b7c44-9a02-4c18-bb31-77a0d2e9f410",
"EventType": "deposit.posted",
"OccurredAt": "2026-08-01T17:04:11Z",
"Data": { "AccountId": "3c7b1f90-...", "TransactionId": "d99c0a31-...", "Amount": 5000.00, "Status": "Posted" }

Verifying a delivery

Webhook signatures follow RFC 9421. The Signature-Input header carries the covered components, a created timestamp, a keyid, and the alg; the Signature header carries the signature bytes. You choose the algorithm when you register an endpoint:

algModelHow you verify
hmac-sha256Shared secret (default)Recompute the HMAC-SHA256 over the signing base with your secret and compare in constant time.
ed25519Asymmetric (recommended for third-party endpoints)Verify the signature against A8 Core™’s published Ed25519 public key. There is no shared secret to leak, so a compromise on your side cannot forge A8 Core™ deliveries.

Both algorithms are registered in RFC 9421. Fetch the current Ed25519 public keys (with their keyids) from the webhook signing keys endpoint; keys rotate, so resolve by keyid rather than pinning one. Also confirm created and the payload’s OccurredAt are recent to guard against replay. Signing proves authenticity and integrity — it does not encrypt — so always receive over TLS.

Webhook signing keys

When you verify with ed25519, check deliveries against A8 Core™’s published public keys. Keys are served as a JWKS document and rotate on a rolling schedule, with the old and new key both valid during an overlap window. Resolve the key by the keyid carried in the delivery’s Signature-Input rather than pinning a single key, and cache the set with a short TTL.

GEThttps://api.a8core.io/v1/webhooks/keysoperation: GetWebhookKeys
200 OK — JWKS
"keys": [
  { "kty": "OKP", "crv": "Ed25519", "use": "sig", "alg": "EdDSA", "kid": "a8core-ed25519-2026a", "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo" },
  { "kty": "OKP", "crv": "Ed25519", "use": "sig", "alg": "EdDSA", "kid": "a8core-ed25519-2026b", "x": "kPrK_qmxVWaYVA9wwBF6Iuo3vVzz7TxHCTwXBygrS4k" }
]
The keys endpoint is public — no signature is required to fetch it. hmac-sha256 endpoints verify with the shared secret set at registration and do not use this endpoint. Host and path shown are illustrative; confirm them against your deployment.

Delivery & retries

Acknowledge with any 2xx promptly and do heavier work asynchronously. Non-2xx or timeouts are retried with exponential backoff for up to 24 hours. Deliveries may repeat, so make consumers idempotent by de-duplicating on EventId.

More operations

The platform exposes the full account lifecycle — beneficiaries, investments, transfers, rollovers, recharacterizations, Roth conversions, IRS forms, and required minimum distributions — all following the authentication, idempotency, and response-envelope conventions documented above. See Asset classes for what each account may hold. Request API access for the complete operation set.

Reference

Asset classes

A holding is described on four orthogonal axes. Overloading one field with all four is what produced an enum in which Cash, RealEstate, and Brokerage were siblings.

AxisQuestion it answersExample
AssetClassWhat kind of thing is this, to an investor?RealEstate
InstrumentTypeWhat is it, legally?TaxLiens
CustodyModelHow is possession actually held?ContractualOnly
ValuationMethodHow is fair market value established?IndependentAppraisal

The ten classes

PublicEquity Stocks & ETFsMutualFund Mutual fundsFixedIncome Bonds & fixed incomeCashAndEquivalents Cash & money marketRealEstate Real estatePrivateEquityAndVenture Private equity & venturePrivateCreditAndNotes Private credit & notesPreciousMetals Precious metalsDigitalAssets Digital assetsStablecoins Stablecoins

Eligibility

The matrix is the account-type dimension only. What an account may hold is the intersection of the account-type rule, the asset-class rule, any instrument predicates, and the institution’s authority asset scope. Approval to hold publicly traded securities is not approval to hold real estate.

PermittedConditionalNot permittedNot applicable
Account-type to asset-class eligibility. Not investment, legal, or tax advice.
Account familyStocks
& ETFs
Mutual
funds
Bonds
& fixed income
Cash
& money market
Real
estate
Private
equity & venture
Private
credit & notes
Precious
metals
Digital
assets
Stablecoins
IRA — not self-directedtraditional-ira roth-ira sep-ira simple-iraPermittedPermittedPermittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
IRA — self-directed+ SelfDirected capabilityPermittedPermittedPermittedPermittedConditionalConditionalConditionalConditionalConditionalConditional
Inherited IRAinherited-traditional-ira inherited-roth-iraPermittedPermittedPermittedPermittedConditionalConditionalConditionalConditionalConditionalConditional
Trump account — growth periodtrump-account-initial trump-account-rolloverConditionalConditionalNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Trump account — after growth periodsame accounts, phase = PostGrowthPermittedPermittedPermittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Automatic Rollover IRAautomatic-rollover-iraNot permittedConditionalNot permittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Solo 401(k)solo-401k-*PermittedPermittedPermittedPermittedConditionalConditionalConditionalConditionalConditionalConditional
Profit-sharing / ESOPprofit-sharing-plan employee-stock-ownership-planPermittedPermittedPermittedPermittedConditionalConditionalConditionalConditionalConditionalConditional
Coverdell ESAcoverdell-esaPermittedPermittedPermittedPermittedConditionalConditionalConditionalNot permittedConditionalConditional
Health Savings Accounthealth-savings-accountPermittedPermittedPermittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Emergency Savings — PLESAemergency-savings-plesaNot permittedNot permittedNot permittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Emergency Savings — taxableemergency-savings-taxableNot permittedConditionalNot permittedPermittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
FSA · HRA · LSA · commuter · COBRABenefitObligationNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permittedNot permitted
Demand deposit · MMDA · time depositDepositLiabilityNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicable
Taxable brokeragetaxable-brokeragePermittedPermittedPermittedPermittedPermittedPermittedPermittedPermittedConditionalConditional
Trustrevocable-trust irrevocable-trustPermittedPermittedPermittedPermittedPermittedPermittedPermittedPermittedConditionalConditional
1031 exchange escrow1031-exchange-escrowNot permittedNot permittedNot permittedPermittedConditionalNot permittedNot permittedNot permittedNot permittedNot permitted
Private fund custodyprivate-fund-custodyNot permittedNot permittedNot permittedPermittedNot permittedPermittedPermittedNot permittedNot permittedNot permitted
529 servicing529-servicingNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicable
Stablecoinstablecoin-accountNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicableNot applicable
Prohibited assets. An IRA may not hold life insurance (§ 408(a)(3)) or collectibles (§ 408(m)). Bullion and coins are the narrow exception in § 408(m)(3). There is deliberately no Collectible or LifeInsurance instrument type — reject the asset rather than mapping it to Other.
Prohibited transactions have split authority. Reorganization Plan No. 4 of 1978 gave the Department of Labor interpretive authority over I.R.C. § 4975 and the power to grant exemptions from it, while the IRS collects the excise tax. Screen against both.

A8 Core™ is a directed, non-discretionary recordkeeper. Availability of an instrument type is not a determination that it is suitable, prudent, or lawful for any account.

Scroll to Top