Mesh Managed Account Authentication API
The recommended approach for account authentication. Front manages multiple authentication flows and handles all authentication steps such as MFA codes and OAuth redirect through our web and mobile SDKs.
The recommended approach for account authentication. Front manages multiple authentication flows and handles all authentication steps such as MFA codes and OAuth redirect through our web and mobile SDKs.
openapi: 3.0.1
info:
title: Mesh Connect Integration Assets Managed Account Authentication API
description: '
Mesh allows users to connect accounts of financial institutions,
crypto exchanges, and self-custody wallets. Mesh handles credential
validation, MFA, and error handling for each integration. After
an account is connected, Mesh allows client applications to read holdings,
transaction history and balances and execute crypto transfers (with user approval).'
version: '1.0'
servers:
- url: https://integration-api.meshconnect.com
security:
- Client-Secret: []
Client-Id: []
tags:
- name: Managed Account Authentication
description: The recommended approach for account authentication. Front manages multiple authentication flows and handles all authentication steps such as MFA codes and OAuth redirect through our web and mobile SDKs.
paths:
/api/v1/cataloglink:
get:
tags:
- Managed Account Authentication
summary: Get catalog link
description: Get personalized catalog link for client
parameters:
- name: UserId
in: query
description: "A unique Id representing the end user. Typically this will be a user Id from the\r\nclient application. Personally identifiable information, such as an email address or phone number,\r\nshould not be used. 50 characters length maximum."
required: true
schema:
maxLength: 50
type: string
- name: BrokerType
in: query
description: "Type of integration to redirect to. Will redirect to catalog if not provided.\r\nNot supported types: DeFiWallet, CryptocurrencyAddress, CryptocurrencyWallet."
schema:
allOf:
- $ref: '#/components/schemas/BrokerType'
- name: EnableTransfers
in: query
description: "Link Configuration identifier - an optional paramater for used configuration.\r\nIf not provided default configuration with all avaialbe integrations will be used."
schema:
type: boolean
- name: RestrictMultipleAccounts
in: query
description: "The final screen of Link allows users to “continue” back to your app or “Link another account.”\r\nIf this param is present then this button will be hidden."
schema:
type: boolean
responses:
'200':
description: Catalog link created.
content:
application/json:
schema:
$ref: '#/components/schemas/CatalogLinkApiResult'
example:
content:
url: https://web.meshconnect.com/broker-connect?auth_code={authCode}
iFrameUrl: https://web.meshconnect.com/b2b-iframe/{clientId}/broker-connect?auth_code={authCode}
status: ok
message: ''
errorType: ''
'404':
description: API Client not found.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: notFound
message: Error message
displayMessage: Optional display message
errorType: missingField
'400':
description: "BadRequest can happen in following cases:\r\n<list type=\"number\"><item><description>userId parameter not specified</description></item><item><description>Callback url parameter is invalid</description></item><item><description>Client does not have callback url specified</description></item></list>"
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: badRequest
message: Error message
displayMessage: Optional display message
errorType: missingField
'401':
description: 'Unauthorized: Client Id or Client Secret are not correct or missing.'
content:
application/json:
schema: {}
deprecated: true
post:
tags:
- Managed Account Authentication
summary: Get catalog link with parameters
description: Get personalized catalog link for client supplying parameters for Link actions, such as transfers
parameters:
- name: UserId
in: query
description: "A unique Id representing the end user. Typically this will be a user Id from the\r\nclient application. Personally identifiable information, such as an email address or phone number,\r\nshould not be used. 50 characters length maximum."
required: true
schema:
maxLength: 50
type: string
- name: BrokerType
in: query
description: "Type of integration to redirect to. Will redirect to catalog if not provided.\r\nNot supported types: DeFiWallet, CryptocurrencyAddress, CryptocurrencyWallet."
schema:
allOf:
- $ref: '#/components/schemas/BrokerType'
- name: EnableTransfers
in: query
description: "Link Configuration identifier - an optional paramater for used configuration.\r\nIf not provided default configuration with all avaialbe integrations will be used."
schema:
type: boolean
- name: RestrictMultipleAccounts
in: query
description: "The final screen of Link allows users to “continue” back to your app or “Link another account.”\r\nIf this param is present then this button will be hidden."
schema:
type: boolean
requestBody:
description: Data to execute transfer.
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/InitializeTransfersForLinkRequest'
example:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
clientFee: 0
isCustomClientFeeProvided: false
isInclusiveFeeEnabled: false
text/json:
schema:
allOf:
- $ref: '#/components/schemas/InitializeTransfersForLinkRequest'
example:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
clientFee: 0
isCustomClientFeeProvided: false
isInclusiveFeeEnabled: false
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/InitializeTransfersForLinkRequest'
example:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
clientFee: 0
isCustomClientFeeProvided: false
isInclusiveFeeEnabled: false
responses:
'200':
description: Catalog link created.
content:
application/json:
schema:
$ref: '#/components/schemas/CatalogLinkApiResult'
example:
content:
url: https://web.meshconnect.com/broker-connect?auth_code={authCode}
iFrameUrl: https://web.meshconnect.com/b2b-iframe/{clientId}/broker-connect?auth_code={authCode}
status: ok
message: ''
errorType: ''
'404':
description: API Client not found.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: notFound
message: Error message
displayMessage: Optional display message
errorType: missingField
'400':
description: "BadRequest can happen in following cases:\r\n<list type=\"number\"><item><description>userId parameter not specified</description></item><item><description>Callback url parameter is invalid</description></item><item><description>Client does not have callback url specified</description></item></list>"
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: badRequest
message: Error message
displayMessage: Optional display message
errorType: missingField
'401':
description: 'Unauthorized: Client Id or Client Secret are not correct or missing.'
content:
application/json:
schema: {}
deprecated: true
/api/v1/linktoken:
post:
tags:
- Managed Account Authentication
summary: Get Link token with parameters
description: Get a short lived, one-time use token for initializing a Link session using the client-side SDKs
requestBody:
description: Create Link token request.
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/GetLinkTokenRequest'
example:
userId: UserId
configurationId: 18a20b11-e47f-43b9-8546-94284e9ee547
restrictMultipleAccounts: true
transferOptions:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
amountInFiat: 10
isInclusiveFeeEnabled: false
text/json:
schema:
allOf:
- $ref: '#/components/schemas/GetLinkTokenRequest'
example:
userId: UserId
configurationId: 18a20b11-e47f-43b9-8546-94284e9ee547
restrictMultipleAccounts: true
transferOptions:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
amountInFiat: 10
isInclusiveFeeEnabled: false
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/GetLinkTokenRequest'
example:
userId: UserId
configurationId: 18a20b11-e47f-43b9-8546-94284e9ee547
restrictMultipleAccounts: true
transferOptions:
toAddresses:
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: ETH
address: '0x00000000000000000000000'
- networkId: e3c7fdd8-b1fc-4e51-85ae-bb276e075611
symbol: USDC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: MATIC
address: '0x00000000000000000000000'
- networkId: 7436e9d0-ba42-4d2b-b4c0-8e4e606b2c12
symbol: USDC
address: '0x00000000000000000000000'
amountInFiat: 10
isInclusiveFeeEnabled: false
responses:
'200':
description: Link token created.
content:
application/json:
schema:
$ref: '#/components/schemas/LinkTokenModelApiResult'
example:
content:
linkToken: aHR0cHM6Ly93ZWIuZ2V0ZnJvbnQuY29tL2IyYi1pZnJhbWUve2NsaWVudElkfS9icm9rZXItY29ubmVjdD9hdXRoX2NvZGU9e2F1dGhDb2RlfQ==
status: ok
message: ''
errorType: ''
'404':
description: API Client not found.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: notFound
message: Error message
displayMessage: Optional display message
errorType: missingField
'400':
description: "BadRequest can happen in following cases:\r\n<list type=\"number\"><item><description>userId parameter not specified</description></item></list>"
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: badRequest
message: Error message
displayMessage: Optional display message
errorType: missingField
'401':
description: 'Unauthorized: Client Id or Client Secret are not correct or missing.'
content:
application/json:
schema: {}
/api/v1/token/refresh:
post:
tags:
- Managed Account Authentication
summary: Refresh auth token
description: "Refresh auth token of the connected institution.\r\nSome institutions do not require tokens to be refreshed.\r\n \r\nThe following institutions require custom flows:\r\n \r\nWeBull: AuthToken should be provided along with the RefreshToken\r\n \r\nVanguard: security settings may activate MFA, requiring user action.\r\nIf MFA is triggered, a second refresh request should be sent.\r\nSecond request should contain MFA code and access token obtained from initial response.\r\n \r\nBitfinex Direct: Expired Access Token is used as Refresh token. Use this endpoint to\r\ntrade it for a new one"
requestBody:
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/BrokerRefreshTokenRequest'
example:
refreshToken: Secret refresh token
type: coinbase
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/B2BBrokerRefreshTokenResponseApiResult'
example:
content:
status: succeeded
expiresInSeconds: 86400
brokerAccountTokens:
- accessToken: New secret token
refreshToken: New secret refresh token
status: ok
message: ''
errorType: ''
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: badRequest
message: Unauthorized token
displayMessage: Could not refresh the authentication token. The provided data is not correct
errorType: badRequest
'401':
description: Unauthorized
content:
application/json:
schema: {}
/api/v1/account:
delete:
tags:
- Managed Account Authentication
summary: Remove connection
description: Remove connection to the financial institution and erase all related data completely.
requestBody:
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/BrokerBaseRequest'
example:
authToken: Secret authentication token
type: robinhood
text/json:
schema:
allOf:
- $ref: '#/components/schemas/BrokerBaseRequest'
example:
authToken: Secret authentication token
type: robinhood
application/*+json:
schema:
allOf:
- $ref: '#/components/schemas/BrokerBaseRequest'
example:
authToken: Secret authentication token
type: robinhood
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: ok
message: ''
errorType: ''
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiResult'
example:
status: badRequest
message: Error message
displayMessage: Optional display message
errorType: missingField
'401':
description: Unauthorized
content:
application/json:
schema: {}
/api/v1/status:
get:
tags:
- Managed Account Authentication
summary: Get health status
description: Get the list of supported institutions and their health statuses.
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/B2BBrokersHealthStatusListApiResult'
example:
content:
- type: robinhood
name: Robinhood
isUp: true
supportedProducts:
- balance
- holdings
- identity
- orders
- transfers
- type: celsius
name: Celsius
isUp: false
description: Temporarily disabled
downTimeStart: 1655891444
supportedProducts:
- balance
- orders
- transfers
- holdings
- type: deFiWallet
name: MetaMask
isUp: false
supportedProducts:
- transfers
- holdings
deFiWalletData:
id: 00000000-0000-0000-0000-000000000000
name: MetaMask
status: ok
message: ''
errorType: ''
'401':
description: Unauthorized
content:
application/json:
schema: {}
/api/v1/integrations:
get:
tags:
- Managed Account Authentication
summary: Retrieve the list of all available integrations.
description: "Returns a list of integrations with details including the integration ID, name, type,\r\nDeFi wallet provider ID, and categories."
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/IntegrationsResponseApiResult'
example:
content:
items:
- id: b7efa542-0b16-4a2a-8f89-00143298e615
name: CoinbasePro
type: coinbasePro
logo:
logoWhiteUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Logo_White.svg
logoBlackUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Logo_Black.svg
logoColorUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Logo_Color.svg
iconWhiteUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Icon_White.svg
iconBlackUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Icon_Black.svg
iconColorUrl: https://frontuserfilecdn.azureedge.net/public/logos/Coinbase_Icon_Color.svg
cryptoTransfersSupported: true
- id: 3d8f5c31-9fc0-4b61-bdfb-00fb18cbb9ad
name: CoinCircle
type: deFiWallet
deFiWalletProviderId: 36d8d9c0c7fe2957149ce8e878f3a01...
categories:
- deFiWallet
logo:
logoColorUrl: https://frontuserfilecdn.azureedge.net/public/logos/CoinCircle_Logo_Color.svg
iconColorUrl: https://frontuserfilecdn.azureedge.net/public/logos/CoinCircle_Icon_Color.svg
cryptoTransfersSupported: true
status: ok
message: ''
errorType: ''
components:
schemas:
BrokerFiatBalance:
type: object
properties:
symbol:
type: string
description: Account balance currency
nullable: true
buyingPower:
type: number
description: "BuyingPower indicates total amount of money the user can spend for buying stock. Always includes cash and\r\ncan also include margin"
format: double
nullable: true
cryptoBuyingPower:
type: number
description: BuyingPower indicates total amount of money the user can spend for buying crypto.
format: double
nullable: true
cash:
type: number
description: Account cash indicates total amount of money
format: double
nullable: true
additionalProperties: false
IntegrationLogo:
type: object
properties:
logoWhiteUrl:
type: string
description: White logo url.
nullable: true
logoBlackUrl:
type: string
description: Black logo url.
nullable: true
logoColorUrl:
type: string
description: Colored logo url.
nullable: true
iconWhiteUrl:
type: string
description: White icon url.
nullable: true
iconBlackUrl:
type: string
description: Balck icon url.
nullable: true
iconColorUrl:
type: string
description: Colored logo url.
nullable: true
additionalProperties: false
description: Integreation logos.
IntegrationsResponseApiResult:
type: object
properties:
status:
enum:
- ok
- serverFailure
- permissionDenied
- badRequest
- notFound
- conflict
- tooManyRequest
- locked
allOf:
- $ref: '#/components/schemas/ApiResultStatus'
readOnly: true
message:
type: string
description: A message generated by the API
nullable: true
displayMessage:
type: string
description: User-friendly display message that can be presented to the end user
nullable: true
errorType:
type: string
description: "Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation."
nullable: true
errorData:
nullable: true
readOnly: true
content:
allOf:
- $ref: '#/components/schemas/IntegrationsResponse'
description: Integration response.
nullable: true
additionalProperties: false
GetLinkTokenRequest:
required:
- userId
type: object
properties:
userId:
maxLength: 50
minLength: 1
type: string
description: "A unique Id representing the end user. Typically this will be a user Id from the\r\nclient application. Personally identifiable information, such as an email address or phone number,\r\nshould not be used. 50 characters length maximum."
brokerType:
allOf:
- $ref: '#/components/schemas/BrokerType'
description: "Type of integration to redirect to. Will redirect to catalog if not provided.\r\nNot supported types: DeFiWallet, CryptocurrencyAddress, CryptocurrencyWallet."
nullable: true
deprecated: true
restrictMultipleAccounts:
type: boolean
description: "The final screen of Link allows users to “continue” back to your app or “Link another account.”\r\nIf this param is present then this button will be hidden."
transferOptions:
allOf:
- $ref: '#/components/schemas/LinkTokenTransferOptions'
description: Encapsulates transaction-related parameters, including destination addresses and the amount to transfer in fiat currency.
nullable: true
integrationId:
type: string
description: A unique identifier representing a specific integration obtained from the list of available integrations.
format: uuid
nullable: true
additionalProperties: false
B2BBrokersHealthStatus:
type: object
properties:
type:
enum:
- robinhood
- eTrade
- alpaca
- tdAmeritrade
- weBull
- stash
- interactiveBrokers
- public
- coinbase
- kraken
- coinbasePro
- cryptoCom
- openSea
- binanceUs
- gemini
- cryptocurrencyAddress
- cryptocurrencyWallet
- okCoin
- bittrex
- kuCoin
- etoro
- cexIo
- binanceInternational
- bitstamp
- gateIo
- acorns
- okx
- bitFlyer
- coinlist
- huobi
- bitfinex
- deFiWallet
- krakenDirect
- vanguard
- binanceInternationalDirect
- bitfinexDirect
- bybit
- paxos
- coinbasePrime
allOf:
- $ref: '#/components/schemas/BrokerType'
description: Type of the integration
name:
type: string
description: Name of the integration
nullable: true
isUp:
type: boolean
description: Is the communication with the integration up
description:
type: string
description: Description of the outage
nullable: true
downTimeStart:
type: integer
description: Unix timestamp in seconds indicating when the outage occurred
format: int64
nullable: true
downTimeEnd:
type: integer
description: Unix timestamp in seconds indicating expected end of the outage
format: int64
nullable: true
supportedProducts:
type: array
items:
$ref: '#/components/schemas/BrokerFeature'
description: Get products supported by the financial institution
nullable: true
deFiWalletData:
allOf:
- $ref: '#/components/schemas/DeFiWalletHealthStatusInfo'
description: Short information about DeFiWallet
nullable: true
additionalProperties: false
B2BBrokersHealthStatusListApiResult:
type: object
properties:
status:
enum:
- ok
- serverFailure
- permissionDenied
- badRequest
- notFound
- conflict
- tooManyRequest
- locked
allOf:
- $ref: '#/components/schemas/ApiResultStatus'
readOnly: true
message:
type: string
description: A message generated by the API
nullable: true
displayMessage:
type: string
description: User-friendly display message that can be presented to the end user
nullable: true
errorType:
type: string
description: "Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation."
nullable: true
errorData:
nullable: true
readOnly: true
content:
type: array
items:
$ref: '#/components/schemas/B2BBrokersHealthStatus'
nullable: true
additionalProperties: false
IntegrationModel:
type: object
properties:
id:
type: string
description: Integration unique identifier.
format: uuid
name:
type: string
description: Integration name.
nullable: true
type:
enum:
- robinhood
- eTrade
- alpaca
- tdAmeritrade
- weBull
- stash
- interactiveBrokers
- public
- coinbase
- kraken
- coinbasePro
- cryptoCom
- openSea
- binanceUs
- gemini
- cryptocurrencyAddress
- cryptocurrencyWallet
- okCoin
- bittrex
- kuCoin
- etoro
- cexIo
- binanceInternational
- bitstamp
- gateIo
- acorns
- okx
- bitFlyer
- coinlist
- huobi
- bitfinex
- deFiWallet
- krakenDirect
- vanguard
- binanceInternationalDirect
- bitfinexDirect
- bybit
- paxos
- coinbasePrime
allOf:
- $ref: '#/components/schemas/BrokerType'
description: Integration type.
deFiWalletProviderId:
type: string
description: DeFi wallet provider identifier.
nullable: true
categories:
type: array
items:
$ref: '#/components/schemas/FinancialInstitutionIntegrationType'
description: Integration categories.
nullable: true
logo:
allOf:
- $ref: '#/components/schemas/IntegrationLogo'
description: Logo object.
nullable: true
cryptoTransfersSupported:
type: boolean
description: Indicates if crypto transfers supported by integration.
additionalProperties: false
description: Integration model.
LinkTokenTransferOptions:
type: object
properties:
toAddresses:
type: array
items:
$ref: '#/compon
# --- truncated at 32 KB (50 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/mesh/refs/heads/main/openapi/mesh-managed-account-authentication-api-openapi.yml