V3 endpoints
These endpoints require a Portal API Key (aka "Custodian API Key") as a bearer token.
Before going live with real users, always ensure that you create clients using a Portal API Key from your Portal's Production environment. Read more here on going live with real users.
Clients
Create a new client
POST
https://api.portalhq.io/api/v3/custodians/me/clients
Registers a new client and returns a client API key, client session token, and whether they are AA enabled.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Body Parameters
isAccountAbstracted
Boolean (optional)
The client will use ERC-4337 Account Abstraction (AA).
Example Response
Create a Client Session Token (CST) for a client
POST
https://api.portalhq.io/api/v3/custodians/me/clients/[clientId]/sessions
Creates a new Client Session Token for a client.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
clientId
*
String
The ID of a client.
Example Response
Create a one-time password (OTP) for a client using the Web SDK
POST
https://api.portalhq.io/api/v1/custodians/clients/[clientId]/web-otp
Generate a one-time password for a client.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
clientId
*
String
The ID of a client.
Example Response
Get a single client
GET
https://api.portalhq.io/api/v3/custodians/me/clients/[clientId]
Fetches the specified client for the authorized custodian.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
clientId
*
String
The ID of the client.
Example Response
Get a list of clients
GET
https://api.portalhq.io/api/v3/custodians/me/clients
Fetches all clients for the authorized custodian.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Query Parameters
cursor
String
The ID of the last client in the list. Used for cursor-based pagination.
take
Number
The number of records to retrieve. Maximum is 100. Default is 100.
Example Response
Get a list of assets for a client
GET
https://api.portalhq.io/api/v3/custodians/me/clients/:clientId/chains/:chain/assets
This endpoint retrieves the asset balances (native and token balances) for a specified client and blockchain. It provides detailed information on the native balance and token balances held by a given address on the specified chain.
Supported Chains
You can use either the full chain identifier or the shortcut for popular chains.
Ethereum Mainnet (
eip155:1
orethereum
)Ethereum Sepolia (
eip155:11155111
orsepolia
)Solana Mainnet (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
orsolana
)Solana Devnet (
solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
orsolana-devnet
)Base Mainnet (
eip155:8453
orbase
)Base Sepolia (
eip155:84532
orbase-sepolia
)Polygon Mainnet (
eip155:137
orpolygon
)Polygon Amoy (
eip155:80002
orpolygon-amoy
)Optimism Mainnet (
eip155:10
)Binance Smart Chain (
eip155:56
)Binance Smart Chain Testnet (
eip155:97
)Fantom (
eip155:250
)Moonbeam (
eip155:1284
)Arbitrum Mainnet (
eip155:42161
)Avalanche Mainnet (
eip155:43114
)Linea Mainnet (
eip155:59144
)
When using CAIP-2 chain formats in the URL (e.g. eip155:11155111
), ensure the URL is URI encoded to accommodate the ":" character.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
clientId
*
String
The ID of the client.
chainId
*
String
Must be in CAIP-2 format or chain identifier shortcut (e.g. eip155:11155111
or sepolia
).
Example Response
Build transaction for a client
POST
https://api.portalhq.io/api/v3/custodians/me/clients/:clientId/chains/:chain/assets/send/build-transaction
Creates an unsigned transaction for transferring assets to another address on a specific chain. You can then use this unsigned transaction to sign and submit the transaction.
Supported Chains
You can use any of the following friendly chain names for the
chain
path param (or alternatively you can use the CAIP-2chainId
):ethereum
(eip155:1
)sepolia
(eip155:11155111
)base
(eip155:8453
)base-sepolia
(eip155:84531
)polygon
(eip155:137
)polygon-mumbai
(eip155:80001
)solana
(solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
)solana-devnet
(solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
)
When using CAIP-2 chain formats in the URL (e.g. eip155:11155111
), ensure the URL is URI encoded to accommodate the ":" character.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
clientId
*
String
The ID of the client.
chain
*
String
Must be one of the chains in "Supported Chains".
Body Parameters
to
*
String
The recipient's address.
token
*
String
The token symbol (e.g., "USDC") or contract address or mint address (for Solana).
amount
*
String
The amount to transfer (as a string, in the token's primary denomination). For example, "0.01" is 1 cent of USDC.
Example Request
Example Response
The response includes the unsigned transaction details and metadata. The structure of the response differs depending on whether the chain is Solana or an EIP-155 chain (e.g., Ethereum, Polygon, Base).
Notes
The
token
field can accept either a token symbol (e.g. "USDC" or "USDT") or a contract address (for EIP-155 tokens) or a mint address (for Solana tokens).The
amount
should be provided in the token's primary denomination (e.g. whole USDC, not micro-USDC).This endpoint creates an unsigned transaction. The client is responsible for signing the transaction before broadcasting it to the network.
The response structure differs between Solana and EIP-155 chains. Make sure to handle both response types in your implementation.
Alert Webhooks
Get a list of alert webhooks
GET
https://api.portalhq.io/api/v3/custodians/me/alerts/webhooks
Retrieve a list of your alert webhooks configured in your Portal Admin Dashboard.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Example Response
Get a list of events sent to your alert webhook
GET
https://api.portalhq.io/api/v3/custodians/me/alerts/webhooks/:alertWebhookId/events
Retrieve a list of the events sent to your alert webhook (including those that failed to be delivered).
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Query Parameters
eventTypes
*
"EIP_155_TX_V1"
The alert webhook event types.
deliveryStatuses
"success"
, "failed"
, "pending"
Returns only alert webhook events with one of the specified delivery statuses.
since
Unix Number
Returns only alert webhook events that occurred after this time.
until
Unix Number
Returns only alert webhook events that occurred before this time.
cursor
String
The alert webhook event "id"
for cursor-based pagination.
limit
Number (default: 100
)
The amount of alert webhook events to get back in the request.
transactionHash
String
Returns only alert webhook events that include this transaction hash.
blockNumbers
String (multiple delimited by ","
)
Returns only alert webhook events that include these block numbers.
chainIds
CAIP-2 chains (multiple delimited by ","
)
Returns only alert webhook events that include these chainIds.
Example Response
Replay failed-to-deliver alert webhook events
POST
https://api.portalhq.io/api/v3/custodians/me/alerts/webhooks/:alertWebhookId/events/failed/replay
Replays a list of alert webhook events with a delivery status of "failed"
.
If the "failed"
alert webhook event has already been replayed successfully, you cannot replay the alert webhook event again with this endpoint.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Path Parameters
alertWebhookId
*
String
The "id"
of the alert webhook. You can get this from the list alert webhooks endpoint.
Body Parameters
eventIds
*
String[]
A list of "failed"
alert webhook event "id"
s to replay.
Example Response
Deprecated Endpoints:
Format a raw alert webhook event (@deprecated)
POST
https://api.portalhq.io/api/v3/custodians/me/alerts/wallets/format
This endpoint formats a raw webhook request body for wallet events.
Supported Chains
You can use either the full chain identifier or the shortcut for popular chains.
Ethereum Mainnet (
eip155:1
orethereum
)Ethereum Sepolia (
eip155:11155111
orsepolia
)Solana Mainnet (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
orsolana
)Solana Devnet (
solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
orsolana-devnet
)Base Mainnet (
eip155:8453
orbase
)Base Sepolia (
eip155:84531
orbase-sepolia
)Polygon Mainnet (
eip155:137
orpolygon
)Polygon Mumbai (
eip155:80001
orpolygon-mumbai
)
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Body Parameters
chain
*
"eip155"
The chain the raw webhook event is from.
rawAlert
*
String
The stringified raw webhook event.
Example Response
Format raw alert webhook events (@deprecated)
POST
https://api.portalhq.io/api/v3/custodians/me/alerts/format
This endpoint formats a raw webhook request body for wallet events, which may include one or many transactions at once.
Supported Chains
You can use either the full chain identifier or the shortcut for popular chains.
Ethereum Mainnet (
eip155:1
orethereum
)Ethereum Sepolia (
eip155:11155111
orsepolia
)Solana Mainnet (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
orsolana
)Solana Devnet (
solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
orsolana-devnet
)Base Mainnet (
eip155:8453
orbase
)Base Sepolia (
eip155:84531
orbase-sepolia
)Polygon Mainnet (
eip155:137
orpolygon
)Polygon Mumbai (
eip155:80001
orpolygon-mumbai
)
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Body Parameters
chain
*
"eip155"
The chain the raw webhook event is from.
rawAlert
*
String
The stringified raw webhook event.
Example Response
Replay an alert webhook event by block number (@deprecated)
POST
https://api.portalhq.io/api/v3/custodians/me/alerts/retry-by-block-number
This endpoint attempts to resend a wallet event scoped by a block number in the scenario you need to replay a transaction.
Supported Chains
EVM chains.
Headers
Authorization*
String
Bearer <Custodian API Key>
Content-Type*
String
application/json
Body Parameters
chainReferenceId
*
String
The EVM chain reference ID. (e.g. "11155111"
for Sepolia)
blockNumber
*
Number
The block number of the transaction(s) you want to resend.
streamId
*
String
The ID of the stream that Portal configured for you. (Reach out to our team to get this.)
Example Response
No content
Last updated