walletId. Use
this guide when you hold the Institutional API entitlement as a Distributor and
you’re integrating a new institutional counterparty into your Circle Mint
account. For the conceptual model, see
Institutional API.
Prerequisites
Before you begin, ensure that you’ve:- Confirmed the Institutional API entitlement is enabled on your Circle Mint account. Contact Circle if you don’t see it.
- Created an API key with institutional permissions.
- Set up a webhook subscription that includes the
externalEntities,deposits,transfers, andpayoutstopics. See Webhook Notifications to set one up. - Verified at least one linked bank account for receiving wires from your end client. See Depositing Fiat.
- Reviewed the conceptual model in Institutional API.
Step 1: Create an external entity
CallPOST /v1/externalEntities with the entity’s businessName,
businessUniqueIdentifier (tax ID), identifierIssuingCountryCode, and
address.
complianceState: PENDING:
The
walletId is returned at creation but remains unusable while the entity
is in PENDING or REJECTED. Wait for the compliance decision before
referencing the entity’s wallet in any other endpoint.Step 2: Wait for the compliance decision
Subscribe to theexternalEntities webhook topic to receive the asynchronous
compliance decision. On ACCEPTED, the payload confirms the entity’s walletId
is usable. On REJECTED, the entity cannot be used: resubmit a new entity with
corrected information or contact Circle.
As a fallback, poll GET /v1/externalEntities/{walletId} with the walletId
returned at creation until complianceState changes.
Step 3: Mint on behalf of the entity
Use the entity’swalletId to scope wire instructions, then watch for the
deposit to land on the entity wallet.
3.1. Generate entity-scoped wire instructions
CallGET /v1/businessAccount/banks/wires/{id}/instructions?walletId=<entity walletId>,
passing the linked bank id in the path and the entity wallet in the query
string.
trackingRef; deposits that include it
are credited to the entity wallet:
3.2. Have the end client wire fiat to those instructions
Share the beneficiary details and the entity-scopedtrackingRef with your end
client. Optionally include a customerExternalRef matching
.*(EXT[A-Z0-9]{18}).* in the bank memo for Distributor-side reconciliation.
3.3. Watch the deposits webhook for the credit
Circle fires a deposits event with destination.id equal to the entity’s
walletId once the wire settles. The USDC or EURC is then available in the
entity wallet.
Step 4: Transfer USDC onchain on behalf of the entity
Move USDC into or out of the entity wallet onchain by scoping the deposit address and the transfer source to the entitywalletId.
4.1. Generate an entity-scoped deposit address for inbound transfers
CallPOST /v1/businessAccount/wallets/addresses/deposit with the entity wallet
in the request body. Prefer Arc when the entity supports it: Mint supports the
same blockchains for institutional subaccount wallets as for the Distributor’s
primary wallet. See
Supported Chains and Currencies.
4.2. Send an outbound transfer from the entity wallet
First, allowlist the recipient withPOST /v1/businessAccount/wallets/addresses/recipient. The address must be
approved by an account administrator through the Mint Console before it can be
used. Watch the
addressBookRecipients
webhook for the active status that signals approval. Then create the transfer
with POST /v1/businessAccount/transfers, setting source.type to wallet and
source.id to the entity’s walletId.
Step 5: Redeem on behalf of the entity
CallPOST /v1/businessAccount/payouts with source.type set to wallet,
source.id set to the entity’s walletId, and destination.type set to wire
with the linked fiat account id. Watch the payouts webhook for complete or
failed.
toAmount returned on the payout reflects the net amount the entity’s bank
receives:
Step 6: Query entity-scoped activity
Filter list endpoints by the entity’swalletId (or sourceWalletId /
destinationWalletId where supported) to retrieve activity scoped to a single
entity:
- Balance:
GET /v1/businessAccount/balances?walletId=<entity walletId> - Deposits:
GET /v1/businessAccount/deposits?walletId=<entity walletId> - Transfers:
GET /v1/businessAccount/transfers?walletId=<entity walletId>. UsesourceWalletIdordestinationWalletIdto filter by direction. - Payouts:
GET /v1/businessAccount/payouts?sourceWalletId=<entity walletId> - Deposit addresses:
GET /v1/businessAccount/wallets/addresses/deposit?walletId=<entity walletId>
Endpoint reference
The following table maps each operation in this guide to its endpoint and the location of thewalletId parameter.
| Operation | Method and path | walletId location |
|---|---|---|
| Create external entity | POST /v1/externalEntities | Body |
| List external entities | GET /v1/externalEntities | Optional filter via businessUniqueIdentifier |
| Get external entity | GET /v1/externalEntities/{walletId} | Path parameter |
| Get entity wire instructions | GET /v1/businessAccount/banks/wires/{id}/instructions?walletId=… | Query string |
| Generate entity deposit address | POST /v1/businessAccount/wallets/addresses/deposit | Body (walletId) |
| List entity deposit addresses | GET /v1/businessAccount/wallets/addresses/deposit?walletId=… | Query string |
| Transfer onchain from entity | POST /v1/businessAccount/transfers | Body (source.id with source.type: wallet) |
| List entity transfers | GET /v1/businessAccount/transfers?walletId=… | Query string |
| Redeem from entity | POST /v1/businessAccount/payouts | Body (source.id with source.type: wallet) |
| List entity payouts | GET /v1/businessAccount/payouts?sourceWalletId=… | Query string |
| List entity deposits | GET /v1/businessAccount/deposits?walletId=… | Query string |
| Entity balance | GET /v1/businessAccount/balances?walletId=… | Query string |
See also
- Institutional API: conceptual model for Distributors, external entities, and per-entity wallets.
- Webhook Notifications:
schema and delivery for the
externalEntitiescallback. - Error Codes: synchronous and asynchronous failure modes.
- Supported Payment Rails: fiat rails available for entity wire deposits and redemptions.
- Depositing Fiat: linked bank account setup and wire deposit basics.