openapi: 3.2.0 info: title: REST Fund Management API description: 'The Gemini Crypto Exchange REST API allows programmatic access to trade cryptocurrencies and manage your account on the Gemini Exchange platform. The API provides both public and private endpoints for market data, order management, and account operations.' version: 1.0.0 contact: name: Gemini Trading Support email: trading@gemini.com servers: - url: https://api.gemini.com description: Production server - url: https://api.sandbox.gemini.com description: Sandbox server for testing tags: - name: Fund Management paths: /v1/balances: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Get Available Balances operationId: getAvailableBalances description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. This will show the available balances in the supported currencies Please note that Gemini is currently in the process of introducing new API architecture that will impact how decimal balances are returned from this endpoint for fiat and crypto assets. As a result of this change, requests to the balances endpoint routed via the new architecture will return fiat balances and crypto balances truncated to 15 and 19 decimal places, respectively. This change has been introduced to correct for the display of miniscule residual values that do not actually represent usable balances. It is recommended that users floor the values returned from this endpoint to the correct precision until the migration to the new architecture has been completed. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned. See Roles for more information. The OAuth scope must have `balances:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - account properties: request: type: string description: The API endpoint path example: /v1/balances nonce: type: TimestampType $ref: '#/components/schemas/TimestampType' title: The nonce, as described in [Private API Invocation](/authentication/api-key#private-api-invocation) account: description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Specifies the account on which you intend to place the order. Only available for exchange accounts. type: string example: primary showPendingBalances: description: 'Whether to include pending balances such as in-flight crypto deposits or withdrawals in the balances response. > **Note:** Setting this field to `true` will result in slower response times due to additional database lookups required to retrieve pending balance information. ' default: false type: boolean example: false example: request: /v1/balances nonce: account: primary showPendingBalances: false responses: '200': description: The account balances content: application/json: schema: type: array items: $ref: '#/components/schemas/Balance' examples: multipleBalances: summary: Multiple Balances description: Response with multiple currency balances (showPendingBalances = false) value: - type: exchange currency: BTC amount: '5.0' available: '4.5' availableForWithdrawal: '4.5' _timestamp: '2024-03-16T00:00:00.000000Z' - type: exchange currency: USD amount: '15000.00' available: '5000.00' availableForWithdrawal: '5000.00' _timestamp: '2024-03-16T00:00:00.000000Z' - type: exchange currency: ETH amount: '10.0' available: '10.0' availableForWithdrawal: '10.0' _timestamp: '2024-03-16T00:00:00.000000Z' emptyBalances: summary: Empty Balances description: Response when there are no balances value: [] '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/notionalbalances/{currency}: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Get Notional Balances operationId: getNotionalBalances description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. This will show the available balances in the supported currencies as well as the notional value in the currency specified. Please note that Gemini is currently in the process of introducing new API architecture that will impact how decimal balances are returned from this endpoint for fiat and crypto assets. As a result of this change, requests to the notional balances endpoint routed via the new architecture will return fiat balances and crypto balances truncated to 15 and 19 decimal places, respectively. This change has been introduced to correct for the display of miniscule residual values that do not actually represent usable balances. It is recommended that users floor the values returned from this endpoint to the correct precision until the migration to the new architecture has been completed. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned. See Roles for more information. The OAuth scope must have `balances:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/currencyParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/notionalbalances/currency" nonce: $ref: '#/components/schemas/Nonce' account: type: string description: Required for Master API keys. The name of the account within the subaccount group. examples: basic: summary: Basic Request description: Basic request to get notional balances in USD value: request: /v1/notionalbalances/usd nonce: withAccount: summary: With Account Parameter description: Request with account parameter for Master API keys value: request: /v1/notionalbalances/usd nonce: account: primary responses: '200': description: Successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/NotionalBalance' example: - currency: BTC amount: '1154.62034001' amountNotional: '10386000.59' available: '1129.10517279' availableNotional: '10161000.71' availableForWithdrawal: '1129.10517279' availableForWithdrawalNotional: '10161000.71' - currency: USD amount: '18722.79' amountNotional: '18722.79' available: '14481.62' availableNotional: '14481.62' availableForWithdrawal: '14481.62' availableForWithdrawalNotional: '14481.62' - currency: ETH amount: '20124.50369697' amountNotional: '100621.31' available: '20124.50369697' availableNotional: '100621.31' availableForWithdrawal: '20124.50369697' availableForWithdrawalNotional: '100621.31' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/addresses/{network}: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: List Deposit Addresses operationId: listDepositAddresses description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. This endpoint is currently restricted further than our standard rate limiting to a rate of 1 request per 2 seconds per subaccount. This rate is subject to change and will be updated here accordingly. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned. See Roles for more information. The OAuth scope must have `addresses:read` or `addresses:create` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/networkParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/addresses/network" nonce: $ref: '#/components/schemas/Nonce' timestamp: $ref: '#/components/schemas/TimestampType' description: Only returns addresses created on or after this timestamp account: type: string description: Required for Master API keys. The name of the account within the subaccount group. examples: basic: summary: Basic Request description: Basic request to get Bitcoin deposit addresses value: request: /v1/addresses/bitcoin nonce: withTimestamp: summary: With Timestamp description: Request with timestamp filter value: request: /v1/addresses/ethereum nonce: timestamp: 1591084414000 withAccount: summary: With Account Parameter description: Request with account parameter for Master API keys value: request: /v1/addresses/bitcoin nonce: account: primary responses: '200': description: Successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/Address' examples: bitcoinAddresses: summary: Bitcoin Addresses description: Response with Bitcoin deposit addresses value: - address: n2saq73aDTu42bRgEHd8gd4to1gCzHxrdj timestamp: 1424285102000 label: my bitcoin address - address: n2wpl14aJEu10bRgMNd0gdjH8dHJ3h2a3ks timestamp: 1824785101000 ethereumAddresses: summary: Ethereum Addresses description: Response with Ethereum deposit addresses value: - address: '0x1f7a49d62d5256d0a80d31a07f57b578c3e40183' timestamp: 1591084414000 label: main eth address '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/deposit/{network}/newAddress: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Create New Deposit Address operationId: createNewDepositAddress description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. This endpoint is currently restricted further than our standard rate limiting to a rate of 1 request per 2 seconds per subaccount. This rate is subject to change and will be updated here accordingly. ### Roles The API key you use to access this endpoint must have the Fund Manager role assigned. See Roles for more information. The OAuth scope must have `addresses:create` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/networkParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/deposit/network/newAddress" nonce: $ref: '#/components/schemas/Nonce' label: type: string description: A label for the address legacy: type: boolean description: Whether to generate a legacy P2SH-P2PKH litecoin address. False by default. account: type: string description: Required for Master API keys. The name of the account within the subaccount group. examples: basicBitcoin: summary: Basic Bitcoin Address Request description: Basic request to create a new Bitcoin deposit address value: request: /v1/deposit/bitcoin/newAddress nonce: label: optional test label legacyLitecoin: summary: Legacy Litecoin Address Request description: Request to create a legacy Litecoin deposit address value: request: /v1/deposit/litecoin/newAddress nonce: label: LTC legacy deposit address legacy: true withAccount: summary: With Account Parameter description: Request with account parameter for Master API keys value: request: /v1/deposit/ethereum/newAddress nonce: label: ETH deposit address account: primary responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Address' examples: bitcoinAddress: summary: Bitcoin Address description: Response with a new Bitcoin deposit address value: network: bitcoin address: n2saq73aDTu42bRgEHd8gd4to1gCzHxrdj label: optional test label litecoinAddress: summary: Litecoin Address description: Response with a new Litecoin deposit address value: network: litecoin address: MJRSgZ3UUFcTBTBAcN38XAXvZLwRe8WVw7 label: LTC legacy deposit address '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v2/transfers: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: List Past Transfers operationId: listPastTransfers description: 'The v1 transfers endpoint is being retired. This v2 endpoint is the recommended replacement, offering full multichain support with accurate status for all supported networks. Please migrate to this endpoint at your earliest convenience. This endpoint shows deposits and withdrawals in supported currencies with full multichain (multi-network) support. It returns accurate status information for transfers on **all supported networks** including Solana, Arbitrum, Optimism, Base, Avalanche, and Ethereum. Each transfer in the response includes a `network` field identifying the blockchain network, along with network-specific `feeAmount`, `feeCurrency`, and `txHash` values. This endpoint does not currently show cancelled advances, returned outgoing wires or ACH transactions, or other exceptional transaction circumstances. Fiat transfers between non-derivative and derivatives accounts are prohibited. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned. See Roles for more information. The OAuth scope must have `history:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v2/transfers" nonce: $ref: '#/components/schemas/Nonce' currency: type: string description: Currency code, see symbols and minimums network: type: string description: Filter transfers by blockchain network (e.g., `ethereum`, `solana`, `arbitrum`, `optimism`, `base`, `avalanche`) timestamp: $ref: '#/components/schemas/TimestampType' description: Only return transfers after this timestamp limit_transfers: type: integer description: The maximum number of transfers to return. The default is 10 and the maximum is 50. account: type: string description: Required for Master API keys. The name of the account within the subaccount group. show_completed_deposit_advances: type: boolean description: Whether to display completed deposit advances. True by default. examples: basic: summary: Basic Request description: Basic request to get all transfers across all networks value: request: /v2/transfers nonce: withCurrency: summary: With Currency Filter description: Request with currency filter for USDC transfers value: request: /v2/transfers nonce: currency: USDC withNetwork: summary: With Network Filter description: Request filtered to a specific network value: request: /v2/transfers nonce: currency: USDC network: solana withFilters: summary: With Multiple Filters description: Request with timestamp, limit, and account filters value: request: /v2/transfers nonce: timestamp: 1591084414000 limit_transfers: 25 account: primary responses: '200': description: Successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/V2Transfer' examples: multiNetworkTransfers: summary: Multi-Network Transfers description: Response with transfers across different networks value: - type: Withdrawal status: Complete timestampms: 1772818620354 eid: 368598436530 currency: USDC amount: '0.01' network: ethereum feeAmount: '0.118856' feeCurrency: USDC txHash: 714a15c4fd2d37629d27e56a63aaec5f91e0053dde3eb357be71663c1197b391 destination: '0x83cFb8C13f06716b449E5D24F5b4cc6Cc64a189A' withdrawalId: 69ab0b0f-3c76-433d-84a5-c8bcc6718411 - type: Withdrawal status: Complete timestampms: 1772034480391 eid: 368474658614 currency: USDC amount: '1799' network: solana feeAmount: '0.202536' feeCurrency: USDC txHash: 4vJ9JU1bJJE96FWSJKvHsmmFADCg4gpZQff4P3bkLKi withdrawalId: 9b7a5100-b3ee-4820-9b5b-c2dd7db6559b - type: Deposit status: Advanced timestampms: 1771990797452 eid: 309356152 currency: ETH amount: '100' network: ethereum feeAmount: '0' feeCurrency: ETH txHash: 605c5fa8bf99458d24d61e09941bc443ddc44839d9aaa508b14b296c0c8269b2 adminTransactions: summary: Administrative Transactions description: Response with administrative credits and debits (no network field) value: - type: AdminDebit status: Complete timestampms: 1626990636645 eid: 1001248356 currency: BTC amount: '6' purpose: Administrative debit - type: AdminCredit status: Complete timestampms: 1626990476421 eid: 1001245359 currency: BTC amount: '4' purpose: Fee reimbursement credit '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/custodyaccountfees: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: List Custody Fee Transfers operationId: listCustodyFeeTransfers description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. This endpoint is currently restricted further than our standard rate limiting to a rate of 1 request per 5 seconds per subaccount. This rate is subject to change and will be updated here accordingly. This is the same limit as the transfers endpoint. One call to one affects the other. This endpoint shows Custody fee records in the supported currencies. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned. See Roles for more information. The OAuth scope must have `history:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/custodyaccountfees" nonce: $ref: '#/components/schemas/Nonce' timestamp: $ref: '#/components/schemas/TimestampType' description: Only return Custody fee records on or after this timestamp limit_transfers: type: integer description: The maximum number of Custody fee records to return. The default is 10 and the maximum is 50. account: type: string description: Required for Master API keys. The name of the account within the subaccount group. examples: basic: summary: Basic Request description: Basic request to get custody account fees value: request: /v1/custodyaccountfees nonce: withFilters: summary: With Filters description: Request with timestamp and limit filters value: request: /v1/custodyaccountfees nonce: timestamp: 1652279000000 limit_transfers: 20 withAccount: summary: With Account Parameter description: Request with account parameter for Master API keys value: request: /v1/custodyaccountfees nonce: account: primary responses: '200': description: Successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/CustodyFeeTransfer' examples: multipleFees: summary: Multiple Fee Records description: Response with multiple custody fee records value: - txTime: 1657236174056 feeAmount: '10' feeCurrency: BTC eid: 256627 eventType: Withdrawal - txTime: 1652279045196 feeAmount: '10000000' feeCurrency: ETH eid: 15364 eventType: CustodyFeeDebit - txTime: 1652279025196 feeAmount: '1850' feeCurrency: WFIL eid: 9016 eventType: RiaFeeDebit - txTime: 1652279025196 feeAmount: '1850' feeCurrency: WFIL eid: 9016 eventType: RiaFeeCredit '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v2/withdraw/{network}/{ticker}/feeEstimate: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Get Gas Fee Estimation operationId: getGasFeeEstimation description: 'The v1 fee estimation endpoint is being retired. This v2 endpoint is the recommended replacement, offering explicit blockchain network selection for multi-network tokens. Please migrate to this endpoint at your earliest convenience. API users will not be aware of the transfer fees before starting the withdrawal process. This endpoint allows you to find out the estimated gas fees before you start a withdrawal. It requires specifying the blockchain network and ticker, which is useful for tokens that exist on multiple networks (e.g. USDC on Ethereum vs Solana). ### Roles The API key you use to access this endpoint can have the Trader, Fund Manager, Auditor, WealthManager or Administrator role assigned. See Roles for more information.' parameters: - name: network in: path description: The blockchain network for the withdrawal (e.g. `ethereum`, `bitcoin`, `solana`) required: true schema: type: string example: ethereum - name: ticker in: path description: The currency code for the withdrawal (e.g. `eth`, `btc`, `sol`, `usdc`) required: true schema: type: string example: eth - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: description: Sample payload for ETH fee estimation on Ethereum network required: true content: application/json: schema: $ref: '#/components/schemas/FeeEstimateV2Request' examples: ethOnEthereum: summary: ETH on Ethereum description: Estimate withdrawal fee for ETH on Ethereum network value: request: /v2/withdraw/ethereum/eth/feeEstimate nonce: address: '0x31c2105b8dea834167f32f7ea7d877812e059230' amount: '0.01' usdcOnSolana: summary: USDC on Solana description: Estimate withdrawal fee for USDC on Solana network value: request: /v2/withdraw/solana/usdc/feeEstimate nonce: address: 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV amount: '100' btcOnBitcoin: summary: BTC on Bitcoin description: Estimate withdrawal fee for BTC on Bitcoin network value: request: /v2/withdraw/bitcoin/btc/feeEstimate nonce: address: mi98Z9brJ3TgaKsmvXatuRahbFRUFKRUdR amount: '0.5' responses: '200': description: Successful fee estimation response content: application/json: schema: $ref: '#/components/schemas/FeeEstimateV2Response' examples: ethResponse: summary: ETH Fee Estimate Response description: JSON response for ETH withdrawal fee estimate value: currency: ETH fee: 0.001 isOverride: false monthlyLimit: 1 monthlyRemaining: 1 usdcOnSolanaResponse: summary: USDC on Solana Fee Estimate Response description: JSON response for USDC on Solana withdrawal fee estimate value: currency: USDC fee: 0.01 isOverride: false monthlyLimit: 10 monthlyRemaining: 8 '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v2/withdraw/{network}/{ticker}: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Withdraw Crypto Funds operationId: withdrawCryptoFunds description: 'The v1 withdraw endpoint is being retired. This v2 endpoint is the recommended replacement, offering explicit blockchain network selection for multi-network tokens. Please migrate to this endpoint at your earliest convenience. Withdraw cryptocurrency funds to an approved address, with explicit network selection. The key improvement over v1 is the explicit `network` path parameter, which allows you to specify exactly which blockchain network to use for the withdrawal. This is especially important for tokens available on multiple networks (e.g., USDC on Ethereum, Solana, Base, Arbitrum, etc.). Before you can withdraw cryptocurrency funds to an approved address, you need three things: 1. You must have an approved address list for your account 2. The address you want to withdraw funds to needs to already be on that approved address list 3. An API key with the Fund Manager role added If you would like to withdraw via API to addresses that are not on your approved address list, please reach out to trading@gemini.com. We can enable this feature for you provided a set of approved IP addresses. This functionality is only available for exchange accounts. Pre-approved IP addresses and addresses added to your approved address list are required to enable withdrawal APIs for custody accounts. Use the Get Network endpoint to discover which networks support withdrawals for a given token. See Roles for more information on how to add the Fund Manager role to the API key you want to use. ### Roles The API key you use to access this endpoint must have the Fund Manager role assigned. See Roles for more information. The OAuth scope must have `crypto:send` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/networkParam' - name: ticker in: path required: true schema: type: string description: The cryptocurrency ticker code (e.g., `btc`, `eth`, `usdc`). See [Symbols and minimums](/market-data/symbols-and-minimums). example: eth - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - address - amount properties: address: type: string description: The destination address for the withdrawal amount: type: string description: The amount to withdraw memo: type: string description: Required for certain networks that use memos (e.g., Solana, XRP, Cosmos). The destination tag or memo for the withdrawal. clientTransferId: type: string format: uuid description: A unique UUID for idempotent withdrawals. If provided, duplicate requests with the same `clientTransferId` will not create additional withdrawals. examples: btcWithdrawal: summary: BTC Withdrawal on Bitcoin description: JSON payload for BTC withdrawal on the Bitcoin network value: address: mi98Z9brJ3TgaKsmvXatuRahbFRUFKRUdR amount: '1' ethWithdrawal: summary: ETH Withdrawal on Ethereum description: JSON payload for ETH withdrawal on the Ethereum network with client transfer ID value: address: '0xA63123350Acc8F5ee1b1fBd1A6717135e82dBd28' amount: '2.34567' clientTransferId: AA97B177-9383-4934-8543-0F91A7A02838 usdcWithdrawalSolana: summary: USDC Withdrawal on Solana description: JSON payload for USDC withdrawal on the Solana network value: address: 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV amount: '100' responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/WithdrawCryptoFundsResponse' examples: btcWithdrawalResponse: summary: BTC Withdrawal Response description: JSON response for BTC withdrawal on Bitcoin network value: withdrawalId: 02176a83-a6b1-4202-9b85-1c1c92dd25c4 address: mi98Z9brJ3TgaKsmvXatuRahbFRUFKRUdR amount: '1' currency: BTC fee: '0' ethWithdrawalResponse: summary: ETH Withdrawal Response description: JSON response for ETH withdrawal on Ethereum network value: withdrawalId: 82de1a28-05a5-4f5c-9b3a-d78b1e3e0c91 address: '0xA63123350Acc8F5ee1b1fBd1A6717135e82dBd28' amount: '2.34567' currency: ETH fee: '0.001' usdcWithdrawalSolanaResponse: summary: USDC Withdrawal on Solana Response description: JSON response for USDC withdrawal on Solana network value: withdrawalId: f4a1c7b3-2e8d-4a9f-b6c5-1d3e7f8a9b0c address: 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV amount: '100' currency: USDC fee: '0' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/payments/addbank: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Add Bank operationId: addBank description: 'The add bank API allows for banking information to be sent in via API. However, for the bank to be verified, you must still send in a wire for any amount from the bank account. ### Roles This API requires the FundManager role. See Roles for more information. The OAuth scope must have `banks:create` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - accountnumber - routing - type - name properties: request: type: string description: The literal string "/v1/payments/addbank" nonce: $ref: '#/components/schemas/Nonce' accountnumber: type: string description: Account number of bank account to be added routing: type: string description: Routing number of bank account to be added type: type: string enum: - checking - savings description: Type of bank account to be added. Accepts `checking` or `savings` name: type: string description: The name of the bank account as shown on your account statements account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Master API keys can get all account names using the [Get Accounts endpoint](/rest/account-administration#list-accounts-in-group). example: request: /v1/payments/addbank nonce: accountnumber: account-number-string routing: routing-number-string type: checking name: Satoshi Nakamoto Checking responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/AddBankResponse' example: referenceId: BankAccountRefId(18428) '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/payments/addbank/cad: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Add Bank CAD operationId: addBankCAD description: 'The add bank API allows for CAD banking information to be sent in via API. However, for the bank to be verified, you must still send in a wire for any amount from the bank account. ### Roles This API requires the FundManager role. See Roles for more information. The OAuth scope must have `banks:create` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - swiftcode - accountNumber - type - name properties: request: type: string description: The literal string "/v1/payments/addbank/cad" nonce: $ref: '#/components/schemas/Nonce' swiftcode: type: string description: The account SWIFT code accountNumber: type: string description: Account number of bank account to be added institutionNumber: type: string description: The institution number of the account - optional but recommended. branchnnumber: type: string description: The branch number - optional but recommended. type: type: string enum: - checking - savings description: Type of bank account to be added. Accepts `checking` or `savings` name: type: string description: The name of the bank account as shown on your account statements account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Master API keys can get all account names using the [Get Accounts endpoint](/rest/account-administration#list-accounts-in-group). example: request: /v1/payments/addbank/cad nonce: swiftcode: swift-code-string accountnumber: account-number-string institutionnumber: institution-number-string branchnumber: branch-number-string type: checking name: Satoshi Nakamoto Checking account: account-string responses: '200': description: Successful operation content: application/json: schema: type: object properties: result: type: string description: Status of the request. "OK" indicates the account has been created successfully. example: result: OK '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/payments/methods: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: List Payment Methods operationId: listPaymentMethods description: 'The payments methods API will return data on balances in the account and linked banks. ### Roles The API key you use to access this endpoint can be either a Master or Account level key with any role assigned. See Roles for more information. The OAuth scope must have `banks:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/payments/methods" nonce: $ref: '#/components/schemas/Nonce' account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Master API keys can get all account names using the [Get Accounts endpoint](/rest/account-administration#list-accounts-in-group). example: request: /v1/payments/methods account: primary nonce: responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/PaymentMethodsResponse' example: balances: - type: exchange currency: USD amount: '50893484.26' available: '50889972.01' availableForWithdrawal: '50889972.01' banks: - bank: Jpmorgan Chase Bank Checking - 1111 bankId: 97631a24-ca40-4277-b3d5-38c37673d029 '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/approvedAddresses/account/{network}: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: List Approved Addresses operationId: listApprovedAddresses description: 'Allows viewing of Approved Address list. ### Roles This API can accept any role. See Roles for more information.' parameters: - $ref: '#/components/parameters/networkParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/approvedAddresses/account/:network" where `:network` can be `bitcoin`, `ethereum`, `bitcoincash`, `litecoin`, `zcash`, `filecoin`, `dogecoin`, `tezos`, `solana`, `polkadot`, `avalanche`, `cosmos`, or `xrpl` nonce: $ref: '#/components/schemas/Nonce' account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Specifies the account on which you intend to view the approved address list. example: request: /v1/approvedAddresses/account/ethereum nonce: account: primary responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/ApprovedAddressesResponse' example: approvedAddresses: - network: ethereum scope: account label: api_added_ETH_address status: pending-time createdAt: '1602692572349' address: '0x0000000000000000000000000000000000000000' - network: ethereum scope: group label: api_added_ETH_address status: pending-time createdAt: '1602692542296' address: '0x0000000000000000000000000000000000000000' - network: ethereum scope: group label: hardware_wallet status: active createdAt: '1602087433270' address: '0xA63123350Acc8F5ee1b1fBd1A6717135e82dBd28' - network: ethereum scope: account label: hardware_wallet status: active createdAt: '1602086832986' address: '0xA63123350Acc8F5ee1b1fBd1A6717135e82dBd28' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/approvedAddresses/{network}/request: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Create New Approved Address operationId: createNewApprovedAddress description: 'Allows for creation of an approved withdrawal address. Once the request is made, the 7 day waiting period will begin. Please note that all approved address requests are subject to the 7 day waiting period. If you add an address using an account-scoped API key, then the address will be added to your account specific approved address list. If you use a master-scoped API key, the address will be added to your group-level approved address list unless you specify an account. This endpoint is subject to additional security constraints and is only accessible via API keys which have configured Trusted IP controls. Please reach out to trading@gemini.com if you have any questions about approved addresses. ### Roles This API requires the FundManager role. See Roles for more information.' parameters: - $ref: '#/components/parameters/networkParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - address - label properties: request: type: string description: The literal string "/v1/approvedAddresses/:network/request" where `:network` can be `bitcoin`, `ethereum`, `bitcoincash`, `litecoin`, `zcash`, `filecoin`, `dogecoin`, `tezos`, `solana`, `polkadot`, `avalanche`, `cosmos`, or `xrpl` nonce: $ref: '#/components/schemas/Nonce' address: type: string description: A string of the address to be added to the approved address list. label: type: string description: The label of the approved address. account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Specifies the account on which you intend to add the approved address. memo: type: string description: it would be present if applicable, it will be present for cosmos address. example: request: /v1/approvedAddresses/ethereum/request nonce: address: '0x0000000000000000000000000000000000000000' label: api_added_ETH_address account: primary responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/ApprovedAddressMessage' example: message: Approved address addition is now waiting a 7-day approval hold before activation. '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/approvedAddresses/{network}/remove: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Remove Approved Address operationId: removeApprovedAddress description: 'Allows for removal of active or time-pending addresses from the Approved Address list. Addresses that are pending approval from another user on the account cannot be removed via API. ### Roles This API requires the FundManager role. See Roles for more information.' parameters: - $ref: '#/components/parameters/networkParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - address properties: request: type: string description: The literal string "/v1/approvedAddresses/:network/remove" where `:network` can be `bitcoin`, `ethereum`, `bitcoincash`, `litecoin`, `zcash`, `filecoin`, `dogecoin`, `tezos`, `solana`, `polkadot`, `avalanche`, `cosmos`, or `xrpl` nonce: $ref: '#/components/schemas/Nonce' address: type: string description: A string of the address to be removed from the approved address list. account: type: string description: Required for Master API keys as described in [Private API Invocation](/authentication/api-key#private-api-invocation). The name of the account within the subaccount group. Specifies the account on which you intend to remove the approved address. example: request: /v1/approvedAddresses/ethereum/remove nonce: address: '0x0000000000000000000000000000000000000000' responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/ApprovedAddressMessage' example: message: 0x0000000000000000000000000000000000000000 removed from group pending-time approved addresses. '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/account/transfer/{currency}: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Transfer Between Accounts operationId: transferBetweenAccounts description: 'This API allows you to execute an internal transfer between any two accounts within your Master Group. In the scenario of exchange account to exchange account there will be no activity on a blockchain network. All other combinations will result in a movement of funds on a blockchain network. Gemini Custody account withdrawals will not occur until the daily custody run occurs. In the case of funds moving from a Gemini Custody account to a Gemini Exchange account, the exchange account will get a precredit for the amount to be received. The exchange account will be able to trade these funds but will be unable to withdraw until the funds are processed on the blockchain and received. Gemini Custody accounts request withdrawals to approved addresses in all cases and require the request to come from an approved IP address. Please reach out to trading@gemini.com to enable API withdrawals for custody accounts. Gemini Custody accounts do not support fiat currency transfers. Fiat transfers between non-derivative and derivatives accounts are prohibited. ### Roles The API key you use to access this endpoint must be a Master level key and have the Fund Manager role assigned. See Roles for more information.' parameters: - $ref: '#/components/parameters/currencyParam' - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce - sourceAccount - targetAccount - amount properties: request: type: string description: The string `/v1/account/transfer/:currency` where `:currency` is replaced with either `usd` or a supported crypto-currency, e.g. `gusd`, `btc`, `eth`, `aave`, etc. See [Symbols and minimums](/market-data/symbols-and-minimums). nonce: $ref: '#/components/schemas/Nonce' sourceAccount: type: string description: Nickname of the account you are transferring from. Use the [Get Accounts endpoint](/rest/account-administration#list-accounts-in-group) to get all account names in the group. targetAccount: type: string description: Nickname of the account you are transferring to. Use the [Get Accounts endpoint](/rest/account-administration#list-accounts-in-group) to get all account names in the group. amount: type: string description: Quoted decimal amount to withdraw clientTransferId: type: string description: A unique identifier for the internal transfer, in uuid4 format withdrawalId: type: string description: Unique ID of the requested withdrawal. examples: basicTransfer: summary: Basic Transfer description: JSON payload for a basic internal transfer value: request: /v1/account/transfer/btc nonce: sourceAccount: primary targetAccount: my-secondary-account amount: '1.0' withClientId: summary: With Client Transfer ID description: Transfer with a client-supplied identifier value: request: /v1/account/transfer/eth nonce: sourceAccount: primary targetAccount: my-custody-account amount: '1' clientTransferId: AA97B177-9383-4934-8543-0F91A7A02838 responses: '200': description: JSON response content: application/json: schema: type: object properties: fromAccount: type: string description: Source account where funds are sent from toAccount: type: string description: Target account to receive funds in the internal transfer amount: type: string description: Quantity of assets being transferred fee: type: string description: Fee taken for the transfer. Exchange account to exchange account transfers will always be free and will not be deducted from the free monthly transfer amount for that account. currency: type: string description: Display Name. Can be `Bitcoin`, `Ether`, `Zcash`, `Litecoin`, `Dollar`, etc. withdrawalId: type: string description: _Excludes_ exchange to exchange. Unique ID of the requested withdrawal uuid: type: string description: _Only_ for exchange to exchange. Unique ID of the completed transfer message: type: string description: Message describing result of withdrawal. Will inform of success, failure, or pending blockchain transaction. txHash: type: string description: _Only for Ethereum network transfers. Excludes exchange to exchange transfers_. Transaction hash for ethereum network transfer. example: fromAccount: my-account toAccount: my-other-account amount: '1' currency: Bitcoin uuid: 9c153d64-83ba-4532-a159-ebe3f6797766 message: Success, transfer completed. '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' /v1/transactions: post: x-zudoku-playground-enabled: false tags: - Fund Management summary: Get Transaction History operationId: getTransactionHistory description: 'Under the terms of the Gemini API Agreement, polling this endpoint may be subject to rate limiting. Due to current limitations with the v1/transactions endpoint, historical data can only be returned for dates _after_ August 1st, 2022. For any requests to this endpoint, please ensure that the value provided for _timestamp_nanos_ as after this date. This endpoint shows trade detail and transactions. There is a `continuation_token` that is a pagination token used for subsequent requests. ### Roles The API key you use to access this endpoint must have the Trader, Fund Manager or Auditor role assigned and have the master account scope. See Roles for more information. The OAuth scope must have `history:read` assigned to access this endpoint. See OAuth Scopes for more information.' parameters: - $ref: '#/components/parameters/apiKeyAuth' - $ref: '#/components/parameters/signatureAuth' - $ref: '#/components/parameters/payloadAuth' - $ref: '#/components/parameters/contentType' - $ref: '#/components/parameters/contentLength' - $ref: '#/components/parameters/cacheControl' security: - apiKeyAuth: [] signatureAuth: [] payloadAuth: [] requestBody: required: true content: application/json: schema: type: object required: - request - nonce properties: request: type: string description: The literal string "/v1/transactions" nonce: $ref: '#/components/schemas/Nonce' timestamp_nanos: description: Only return transfers on or after this timestamp in nanos. If this is defined, do not define “continuation_token”. allOf: - $ref: '#/components/schemas/TimestampType' limit: type: integer description: The maximum number of transfers to return. The default is 100 and the maximum is 300. default: 100 continuation_token: type: string description: For subsequent requests, use the returned `continuation_token` value for next page. If this is defined, do not define “timestamp_nanos”. example: request: /v1/transactions nonce: timestamp_nanos: 1630382206000000000 limit: 50 continuation_token: daccgrp_123421:n712621873886999872349872349:a71289723498273492374978424:m2:iForward responses: '200': description: The response will be an array of JSON objects, sorted by trade and transfer as well as a continuationToken to be used in subsequent requests. content: application/json: schema: type: object properties: results: type: array description: Results will contain either a list of Trade or Transfer responses items: $ref: '#/components/schemas/Transaction' examples: tradeResponse: summary: Trade Response description: Trade Response value: results: - account: primary amount: '0.001' clientOrderId: '' price: '1730.95' timestampms: 1659201465069 side: SIDE_TYPE_BUY isAggressor: true feeAssetCode: ETH feeAmount: '0.000000000000000605' orderId: 73716687406755680 exchange: gemini isAuctionFill: false isClearingFill: false symbol: ETHUSD tid: 144115199446910513 type: trade - account: primary amount: '0.001' clientOrderId: '' price: '1679.02' timestampms: 1659201465222 side: SIDE_TYPE_SELL isAggressor: true feeAssetCode: ETH feeAmount: '0.00000000000000000587' orderId: 73716687406755680 exchange: gemini isAuctionFill: false isClearingFill: false symbol: ETHUSD tid: 144115199446910494 type: trade continuationToken: daccgrp_1500611:n7126218738869976937315434496:a7126216029949884380085223424:m2:iForward '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/ApiKeyIpFilteringFailure' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalError' components: responses: ApiKeyIpFilteringFailure: description: ApiKey fails IP Filtering Check content: application/json: schema: type: object $ref: '#/components/schemas/ErrorResponse' example: result: error reason: ApiKeyIpFilteringFailure message: ApiKey fails IP Filtering Check for some accounts BadRequest: description: Bad request - malformed request or invalid parameters content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: result: error reason: InvalidSignature message: Invalid signature for this request NotFound: description: Resource not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: result: error reason: EndpointNotFound message: API entry point not found InternalError: description: Internal server error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: result: error reason: Internal Server Error message: Unexpected server error occurred. TooManyRequests: description: Too many requests - you have exceeded the rate limit content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: result: error reason: Too Many Requests message: Too Many Requests Unauthorized: description: Unauthorized - missing or invalid authentication content: application/json: schema: type: object $ref: '#/components/schemas/ErrorResponse' example: result: error reason: MissingApikeyHeader message: Must provide 'X-GEMINI-APIKEY' header parameters: contentType: name: Content-Type in: header required: false schema: type: string default: text/plain cacheControl: name: Cache-Control in: header required: false schema: type: string default: no-cache networkParam: name: network in: path required: true schema: type: string description: Can be `bitcoin`, `ethereum`, `bitcoincash`, `litecoin`, `zcash`, `filecoin`, `dogecoin`, `tezos`, `solana`, `polkadot`, `avalanche`, `cosmos`, or `xrpl` signatureAuth: name: X-GEMINI-SIGNATURE in: header required: true description: HEX-encoded HMAC-SHA384 of payload signed with API secret schema: type: string contentLength: name: Content-Length in: header required: false schema: type: string default: '0' currencyParam: name: currency in: path required: true schema: type: string description: Either a fiat currency, e.g. `usd` or `gbp`, or a supported crypto-currency, e.g. `gusd`, `btc`, `eth`, `aave`, etc. payloadAuth: name: X-GEMINI-PAYLOAD in: header required: true description: Base64-encoded JSON payload schema: type: string apiKeyAuth: name: X-GEMINI-APIKEY in: header required: true description: Your API key schema: type: string schemas: Transaction: oneOf: - type: object description: Trade Reponse title: Trade Reponse properties: account: type: string description: The account. amount: type: string description: The quantity that was executed. clientOrderId: type: string description: The client order ID, if defined. Otherwise an empty string. price: type: string description: The price that the execution happened at. timestampms: $ref: '#/components/schemas/TimestampType' description: The time that the trade happened in milliseconds. side: type: string description: Indicating the side of the original order. isAggressor: type: boolean description: If true, this order was the taker in the trade. feeAssetCode: type: string description: The symbol that the trade was for feeAmount: type: string description: The fee amount charged orderId: type: integer format: int64 description: The order that this trade executed against. exchange: type: string description: Will always be "gemini". isAuctionFill: type: boolean description: True if the trade was a auction trade and not an on-exchange trade. isClearingFill: type: boolean description: True if the trade was a clearing trade and not an on-exchange trade. tid: type: integer format: int64 description: The trade ID. symbol: type: string description: The symbol that the trade was for. - type: object description: Transfer Reponse title: Transfer Reponse properties: timestampms: $ref: '#/components/schemas/TimestampType' description: The time that the trade happened in milliseconds. source: type: string description: The account you are transferring from. destination: type: string description: The account you are transferring to. operationReason: type: string description: The operation reason. status: type: string description: The status of the transfer. eid: type: integer format: int64 description: Transfer event id. currency: type: string description: Currency code, see symbols amount: type: string description: The quantity that was transferred. method: type: string description: Type of transfer method. correlationId: type: integer format: int64 description: Correlation ID. transferType: type: string description: Transfer type. bankId: type: string description: Bank ID. purpose: type: string description: Purpose. transactionHash: type: string description: Supplies the transaction hash when available. transferId: type: string description: Transfer ID. withdrawalId: type: string description: Withdrawal ID. clientTransferId: type: string description: Client Transfer ID. Client transfer ID is an optional client-supplied unique identifier for each withdrawal or internal transfer. advanceEid: type: integer format: int64 description: Deposit advance event ID. pendingEid: type: integer format: int64 description: Pending event ID. withdrawalEid: type: integer format: int64 description: Withdrawal event ID. feeId: type: string description: Fee ID. PaymentMethodsResponse: type: object properties: balances: type: array description: Array of JSON objects with available fiat currencies and their balances. items: $ref: '#/components/schemas/PaymentMethodBalance' banks: type: array description: Array of JSON objects with banking information items: $ref: '#/components/schemas/PaymentMethodBank' Balance: type: object properties: type: type: string enum: - exchange example: exchange currency: type: string example: BTC description: The currency symbol amount: type: number example: 10.5 description: 'The confirmed balance for the currency (also referred to as `confirmedBalance`). For crypto withdrawals, this value is **not** reduced until the withdrawal has been confirmed on the blockchain. This delay protects against blockchain reorganizations. Use the `available` field instead if you need balances that immediately reflect holds. ' available: type: number example: 9.0 description: 'The amount available for trading. This value is reduced **immediately** when an order hold or withdrawal hold is placed, making it the recommended field for tracking real-time spendable balances. ' availableForWithdrawal: type: number example: 9.0 description: The amount available for withdrawal pendingWithdrawal: type: number example: 1.0 description: The amount pending withdrawal pendingDeposit: type: number example: 0.5 description: The amount pending deposit _timestamp: type: string format: date-time example: '2024-03-16T00:00:00.000000Z' description: Server-side monotonically increasing clock value as an ISO 8601 timestamp. Clients can use this value to detect and filter out stale responses that may occur due to load balancing or potential stale servers. PaymentMethodBank: type: object properties: bank: type: string description: Name of bank account bankId: type: string description: Unique identifier for bank account WithdrawCryptoFundsResponse: type: object description: Response returned after submitting a v2 cryptocurrency withdrawal. properties: withdrawalId: type: string description: A unique ID for the withdrawal address: type: string description: Standard string format of the withdrawal destination address amount: type: string description: The withdrawal amount currency: type: string description: The currency code of the withdrawn asset fee: type: string description: The fee charged for the withdrawal FeeEstimateV2Request: type: object required: - request - nonce - address - amount properties: request: type: string description: The string `/v2/withdraw/{network}/{ticker}/feeEstimate` where `{network}` is the blockchain network (e.g. `ethereum`, `bitcoin`, `solana`) and `{ticker}` is the currency code (e.g. `eth`, `btc`, `sol`). See [Symbols and minimums](/market-data/symbols-and-minimums) example: /v2/withdraw/ethereum/eth/feeEstimate nonce: $ref: '#/components/schemas/Nonce' address: type: string description: Standard string format of the destination cryptocurrency address example: '0x31c2105b8dea834167f32f7ea7d877812e059230' amount: type: string description: Quoted decimal amount to withdraw example: '0.01' account: type: string description: Required for Master API keys. The name of the account within the subaccount group. example: primary memo: type: string description: It would be present if applicable, it will be present for cosmos address. TimestampType: description: timestamp oneOf: - type: string description: 'Gemini strongly recommends using milliseconds instead of seconds for timestamps. | Timestamp format | Example | Supported request type | |-----------------------|-----------------------|------------------------| | string (seconds) | `1495127793` | `POST` only | | string (milliseconds) | `1495127793000` | `POST` only | ' example: '1495127793000' - type: integer format: int64 description: 'Gemini strongly recommends using milliseconds instead of seconds for timestamps. | Timestamp format | Example | Supported request type | |-----------------------------|---------------------------|------------------------| | whole number (seconds) | `1495127793` | `GET`, `POST` | | whole number (milliseconds) | `1495127793000` | `GET`, `POST` | ' example: 1495127793000 Address: type: object properties: address: type: string description: String representation of the cryptocurrency address timestamp: $ref: '#/components/schemas/TimestampType' description: Creation date of the address label: type: string description: If you provided a label when creating the address, it will be echoed back here memo: type: string description: It would be present if applicable, it will be present for cosmos address network: type: string description: The blockchain network for the address ApprovedAddressMessage: type: object properties: message: type: string description: Status or confirmation message for the approved address request or removal. result: type: string description: Result status (e.g. ok). NotionalBalance: type: object properties: currency: type: string description: Currency code, see symbols and minimums amount: type: string description: The current balance amountNotional: type: string description: Amount, in notional available: type: string description: The amount that is available to trade availableNotional: type: string description: Available, in notional availableForWithdrawal: type: string description: The amount that is available to withdraw availableForWithdrawalNotional: type: string description: AvailableForWithdrawal, in notional V2Transfer: type: object properties: type: type: string enum: - Deposit - Withdrawal - Reward - AdminDebit - AdminCredit description: The type of the transfer status: type: string enum: - Complete - Pending - Advanced description: The status of the transfer timestampms: $ref: '#/components/schemas/TimestampType' description: The timestamp in milliseconds eid: type: integer format: int64 description: The transfer event ID currency: type: string description: The currency transferred amount: type: string description: The amount transferred network: type: string description: The blockchain network the transfer was executed on (e.g., `ethereum`, `solana`, `arbitrum`, `optimism`, `base`, `avalanche`). Not present for fiat or administrative transfers. feeAmount: type: string description: The fee charged for the transfer feeCurrency: type: string description: The currency in which the fee was charged txHash: type: string description: The on-chain transaction hash, if applicable method: type: string description: The transfer method (e.g., `ACH`, `CreditCard`) destination: type: string description: The destination address for withdrawals withdrawalId: type: string description: The unique withdrawal identifier outputIdx: type: integer description: The output index for withdrawals purpose: type: string description: The purpose or reason for administrative transfers FeeEstimateV2Response: type: object properties: currency: type: string description: Currency code, see [symbols](/market-data/symbols-and-minimums). example: ETH fee: type: number format: decimal description: The estimated withdrawal fee as a decimal amount example: 0.001 isOverride: type: boolean description: Whether an override on the customer's account for free withdrawals exists example: false monthlyLimit: type: integer description: Total number of allowable fee-free withdrawals example: 1 monthlyRemaining: type: integer description: Total number of allowable fee-free withdrawals remaining example: 1 Nonce: oneOf: - type: TimestampType $ref: '#/components/schemas/TimestampType' example: 1495127793000 - type: integer example: 1495127793000 description: The nonce, as described in [Private API Invocation](/authentication/api-key#private-api-invocation) PaymentMethodBalance: type: object properties: type: type: string description: Account type. Will always be `exchange` currency: type: string description: Symbol for fiat balance. amount: type: string description: Total account balance for currency. available: type: string description: Total amount available for trading availableForWithdrawal: type: string description: Total amount available for withdrawal AddBankResponse: type: object properties: referenceId: type: string description: Reference ID for the new bank addition request. Once received, send in a wire from the requested bank account to verify it and enable withdrawals to that account. result: type: string description: Status result (e.g. ok). ApprovedAddress: type: object properties: network: type: string description: The network of the approved address. Network can be `bitcoin`, `ethereum`, `bitcoincash`, `litecoin`, `zcash`, `filecoin`, `dogecoin`, `tezos`, `solana`, `polkadot`, `avalanche`, `cosmos`, or `xrpl` scope: type: string description: Will return the scope of the address as either "account" or "group" label: type: string description: The label assigned to the address status: type: string description: The status of the address that will return as "active", "pending-time" or "pending-mua". The remaining time is exactly 7 days after the initial request. "pending-mua" is for multi-user accounts and will require another administator or fund manager on the account to approve the address. createdAt: type: string description: UTC timestamp in millisecond of when the address was created. address: type: string description: The address on the approved address list. CustodyFeeTransfer: type: object properties: txTime: type: integer description: Time of Custody fee record in milliseconds feeAmount: type: string description: The fee amount charged feeCurrency: type: string description: Currency that the fee was paid in eid: type: integer description: Custody fee event id eventType: type: string description: Custody fee event type ApprovedAddressesResponse: type: object description: Response envelope containing the approved withdrawal addresses. properties: approvedAddresses: type: array description: Array of approved addresses on both the account and group level. items: $ref: '#/components/schemas/ApprovedAddress' ErrorResponse: type: object properties: result: type: string description: Error reason: type: string description: A short description message: type: string description: Detailed error message securitySchemes: apiKeyAuth: type: apiKey in: header name: X-GEMINI-APIKEY description: Your API key payloadAuth: type: apiKey in: header name: X-GEMINI-PAYLOAD description: Base64-encoded JSON payload signatureAuth: type: apiKey in: header name: X-GEMINI-SIGNATURE description: HEX-encoded HMAC-SHA384 of payload signed with API secret