# Table of Contents
- [About Robinhood Chain – Robinhood Chain Documentation](#about-robinhood-chain-robinhood-chain-documentation)
- [Robinhood](#robinhood)
- [Robinhood](#robinhood)
- [Robinhood](#robinhood)
- [Robinhood](#robinhood)
- [Connecting to Robinhood Chain – Robinhood Chain Documentation](#connecting-to-robinhood-chain-robinhood-chain-documentation)
- [Add network to your wallet – Robinhood Chain Documentation](#add-network-to-your-wallet-robinhood-chain-documentation)
- [Bridging – Robinhood Chain Documentation](#bridging-robinhood-chain-documentation)
- [Building with Stock Tokens – Robinhood Chain Documentation](#building-with-stock-tokens-robinhood-chain-documentation)
- [Differences from Ethereum – Robinhood Chain Documentation](#differences-from-ethereum-robinhood-chain-documentation)
- [Gas & Fees – Robinhood Chain Documentation](#gas-fees-robinhood-chain-documentation)
- [Stock Tokens – Robinhood Chain Documentation](#stock-tokens-robinhood-chain-documentation)
- [Transaction Finality – Robinhood Chain Documentation](#transaction-finality-robinhood-chain-documentation)
- [Robinhood Chain Token Contracts – Robinhood Chain Documentation](#robinhood-chain-token-contracts-robinhood-chain-documentation)
- [Account Abstraction – Robinhood Chain Documentation](#account-abstraction-robinhood-chain-documentation)
- [Deploy a Contract – Robinhood Chain Documentation](#deploy-a-contract-robinhood-chain-documentation)
- [Robinhood Chain Contracts – Robinhood Chain Documentation](#robinhood-chain-contracts-robinhood-chain-documentation)
- [Cross-Chain Messaging – Robinhood Chain Documentation](#cross-chain-messaging-robinhood-chain-documentation)
- [Oracles & Price Feeds – Robinhood Chain Documentation](#oracles-price-feeds-robinhood-chain-documentation)
- [Run a Robinhood Chain full node – Robinhood Chain Documentation](#run-a-robinhood-chain-full-node-robinhood-chain-documentation)
- [Notices & Upgrades – Robinhood Chain Documentation](#notices-upgrades-robinhood-chain-documentation)
- [Report an issue – Robinhood Chain Documentation](#report-an-issue-robinhood-chain-documentation)
- [Robinhood Chain Terms of Service – Robinhood Chain Documentation](#robinhood-chain-terms-of-service-robinhood-chain-documentation)
- [Robinhood RHJ](#robinhood-rhj)
- [FAQ – Robinhood RHJ](#faq-robinhood-rhj)
- [Product – Robinhood RHJ](#product-robinhood-rhj)
- [Service Provider Details – Robinhood RHJ](#service-provider-details-robinhood-rhj)
- [Restricted Jurisdictions – Robinhood RHJ](#restricted-jurisdictions-robinhood-rhj)
- [Use of Website – Robinhood RHJ](#use-of-website-robinhood-rhj)
- [Corporate Actions – Robinhood RHJ](#corporate-actions-robinhood-rhj)
- [Price Deviations – Robinhood RHJ](#price-deviations-robinhood-rhj)
---
# About Robinhood Chain – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
About Robinhood Chain
On this page
Chevron Right
**Robinhood Chain** is a permissionless, Ethereum-compatible Layer-2 blockchain built to support a new era of onchain financial infrastructure — one that brings traditional markets, crypto, and real-world assets together on a fast, efficient, and open network.
Robinhood Chain is part of _Robinhood's broader mission_ to democratize access to global financial markets and to empower users and developers with modern blockchain tools. It is designed to enable the seamless transfer, access, and management of digital assets anywhere in the world, without intermediaries or platform lock-in.
Start building[](https://docs.robinhood.com/chain/#start-building)
---------------------------------------------------------------------
[Connect to the network\
\
Learn how to connect to Robinhood Chain](https://docs.robinhood.com/chain/connecting)
[Deploy a smart contract\
\
Get your first contract live on Robinhood Chain using Foundry or Hardhat](https://docs.robinhood.com/chain/deploy-smart-contracts)
[Run a full node\
\
Spin up your own Robinhood Chain node for full data access and independence](https://docs.robinhood.com/chain/run-a-full-node)
Built for Real-World Assets[](https://docs.robinhood.com/chain/#built-for-real-world-assets)
-----------------------------------------------------------------------------------------------
At its core, Robinhood Chain is optimized for **tokenized real-world assets (RWAs)** — including equities, ETFs, private assets, and other financial instruments — allowing them to be represented and traded onchain. This infrastructure supports Robinhood's vision of a financial ecosystem where assets can be **programmatically traded, self-custodied by users, and accessible 24/7**.
Built on Proven Technology[](https://docs.robinhood.com/chain/#built-on-proven-technology)
---------------------------------------------------------------------------------------------
Robinhood Chain is built on Arbitrum Dedicated Blockchains, a modular Layer-2 framework that combines Ethereum's security with high throughput and low transaction costs. By operating as a Layer-2 solution, Robinhood Chain offloads transaction processing from Ethereum mainnet, aiming to achieve faster finality and cost efficiency. Robinhood Chain uses ETH as its native gas token.
###
Predictable Transaction Ordering[](https://docs.robinhood.com/chain/#predictable-transaction-ordering)
Robinhood Chain utilizes a first-come, first-served sequencing model, where the order is determined strictly by the arrival time at the sequencer. The network ensures a transparent and predictable environment where no transaction can bypass others by paying higher fees.
Open and Permissionless[](https://docs.robinhood.com/chain/#open-and-permissionless)
---------------------------------------------------------------------------------------
Robinhood Chain is designed to be **permissionless and developer-friendly**. Anyone can interact with the network, build applications, and deploy smart contracts. This openness invites a diverse ecosystem of builders and users, expanding beyond a closed application into a fully accessible blockchain environment.
###
EVM Compatible[](https://docs.robinhood.com/chain/#evm-compatible)
Robinhood Chain is fully EVM-compatible. Smart contracts written in Solidity or Vyper deploy without modification, and all standard developer tooling works out of the box — including Hardhat, Foundry, ethers.js, viem, and Wagmi. Any wallet or dapp that supports standard JSON-RPC can connect directly.
###
Account Abstraction[](https://docs.robinhood.com/chain/#account-abstraction)
Robinhood Chain has first-class support for ERC-4337 account abstraction. Developers can submit and manage transactions, sponsor gas fees for users and create programmable wallets with built-in batching and session key support.
Ecosystem[](https://docs.robinhood.com/chain/#ecosystem)
-----------------------------------------------------------
Robinhood Chain is supported by a set of infrastructure and application partners:
| Category | Partner | Description |
| --- | --- | --- |
| RPC & AA Infrastructure | [Alchemy](https://www.alchemy.com/) | Recommended RPC provider; also supplies Data API, and Gasless Transaction Infrastructure |
| Cross-chain Bridge | [LayerZero](https://layerzero.network/) | Omnichain messaging and asset bridging |
| Oracles | [Chainlink](https://chain.link/) | Price feeds and off-chain data |
| Institutional Custody | [Fireblocks](https://www.fireblocks.com/) | Secure digital asset operations |
| Institutional Custody | [Bitgo](https://www.bitgo.com/) | Secure digital asset operations |
| Blockchain Analytics | [Allium](https://allium.so/) | Onchain data and analytics |
| Token Tracking | [Coingecko](https://www.coingecko.com/) | Price and volume tracking |
| Public DEX | [Uniswap](https://uniswap.org/) | Decentralized token exchange |
| Proprietary AMM | [Rialto](https://rialto.xyz/) | Proprietary Automated Market Maker |
| Lending | [Morpho](https://morpho.org/) | Decentralized lending and borrowing |
| Perps | [Lighter](https://robinhoodchain.lighter.xyz/) | Perpetuals dex |
| Perps | [Arcus](https://arcus.xyz/) | Perpetuals dex |
| Stablecoin | [Paxos](https://globaldollar.com/)
(USDG) | Stablecoin infrastructure provider |
| Wallet Data | [Zerion](https://zerion.io/) | Enterprise-Grade Wallet Data API |
This page features third-party developers and protocols building on Robinhood Chain. Inclusion on this page does not constitute an endorsement, partnership, affiliation, sponsorship, or warranty by Robinhood. Robinhood makes no representations regarding the safety, legitimacy, or suitability of any featured protocol or application and is not responsible for the content of any third-party websites, apps, or protocols, or any financial risks arising from interacting with them.
Start Building on Robinhood Chain[](https://docs.robinhood.com/chain/#start-building-on-robinhood-chain)
-----------------------------------------------------------------------------------------------------------
Robinhood Chain is live. Connect to the network, deploy contracts, and explore the ecosystem.
* Network details & RPC: [Connecting to Robinhood Chain](https://docs.robinhood.com/chain/connecting)
* [Robinhood Chain Status](http://status.robinhoodchain.offchain.io/)
* Bridge assets onto Robinhood Chain: [Bridging](https://docs.robinhood.com/chain/bridging)
* Deploy your first contract: [Deploy smart contracts](https://docs.robinhood.com/chain/deploy-smart-contracts)
* Run a full node: [Run a full node](https://docs.robinhood.com/chain/run-a-full-node)
* Questions or issues: [Report an issue](mailto:chain-developers-group@robinhood.com)
---
# Robinhood

* Introduction
* Authentication
* Creating an API key
* Creating a key pair
* Headers and Signature
* Making your first API call
* Pagination
* Rate Limiting
* Error Responses
* V2 Endpoints (with Fee Tiers)
* Account
* getGet Accounts
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Trading Pairs
* getGet Holdings
* getGet Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
* V1 Endpoints (without Fee Tiers)
* Account
* getGet Crypto Trading Account Details
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Crypto Trading Pairs
* getGet Crypto Holdings
* getGet Crypto Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
[API docs by Redocly](https://redocly.com/redoc/)
Robinhood Crypto Trading API
============================
[](https://docs.robinhood.com/#section/Introduction)
Introduction
=================================================================
Welcome to Robinhood Crypto Trading API documentation for traders and developers! The API lets you view crypto market data, access your account information, and place crypto orders programmatically.
To get started, head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. There are two versions of the Crypto Trading API, giving you the option to place crypto orders with fee tiers (v2) or without fee tiers (v1). All read-only API actions are available on both versions. For more information about API version differences, fee tiers, and answers to common questions, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-api)
. You can also view the [Fee Schedule](https://cdn.robinhood.com/assets/robinhood/legal/rhc-fee-schedule.pdf)
for the latest rates.
The Robinhood Crypto Trading API is available to customers in the United States only. Use of the Robinhood Crypto Trading API is subject to the [Robinhood Crypto Customer Agreement](https://cdn.robinhood.com/assets/robinhood/legal/Robinhood%20Crypto%20Customer%20Agreement.pdf)
as well as all other terms and disclosures made available on [Robinhood Crypto's about page](https://robinhood.com/us/en/about/crypto)
.
[](https://docs.robinhood.com/#section/Authentication)
Authentication
=====================================================================
To get started with the Robinhood Crypto Trading API, you need to create a key, signature, and headers. Authenticated requests must include all three `x-api-key`, `x-signature`, and `x-timestamp` HTTP headers.
[](https://docs.robinhood.com/#section/Authentication/Creating-an-API-key)
Creating an API key
----------------------------------------------------------------------------------------------
Head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. After creating credentials, you will receive the API key associated with the credential. You can modify, disable, and delete credentials you created at any time.
Your API key will be used as the `x-api-key` header you will need to pass during authentication when calling our API endpoints. Additionally, you will need the public key generated in the [Creating a key pair](https://docs.robinhood.com/#section/Authentication/Creating-a-key-pair)
section to create your API credentials.
[](https://docs.robinhood.com/#section/Authentication/Creating-a-key-pair)
Creating a key pair
----------------------------------------------------------------------------------------------
#### Below are example scripts on how to generate the public and private key pair. You'll need the public key for creating an API credential and the private key for authenticating requests. Remember to never share your private key with anyone. Robinhood will never ask you to share it with us.
We highly recommend saving your private and public keys in an encrypted format to ensure the highest level of security. Encrypting your keys will protect them from unauthorized access or theft. Avoid saving them in plain text or any easily accessible location. Instead, consider using strong encryption algorithms or tools specifically designed for key storage. Remember to choose a strong passphrase for encryption and store it separately from your keys. By taking these precautions, you can significantly reduce the risk of compromising your keys and safeguard your sensitive information.
### Python
Note that you'll need to have `pynacl` installed to run the Python script. You can install them with the following pip command in your terminal.
pip install pynacl
import nacl.signing
import base64
# Generate an Ed25519 keypair
private_key = nacl.signing.SigningKey.generate()
public_key = private_key.verify_key
# Convert keys to base64 strings
private_key_base64 = base64.b64encode(private_key.encode()).decode()
public_key_base64 = base64.b64encode(public_key.encode()).decode()
# Print the keys in base64 format
print("Private Key (Base64):")
print(private_key_base64)
print("Public Key (Base64):")
print(public_key_base64)
[](https://docs.robinhood.com/#section/Authentication/Headers-and-Signature)
Headers and Signature
--------------------------------------------------------------------------------------------------
[](https://docs.robinhood.com/#section/Authentication/API%20Key)
API Key
------------------------------------------------------------------------
The "`x-api-key`" header should contain your API key. This API key is obtained from your [crypto account settings](https://robinhood.com/account/crypto)
when enrolling in the Robinhood Crypto Trading API program.
\*_**API keys issued after August 13, 2024 will be formatted as "`rh-api-[uuid]`." Functionality will remain the same, and older keys will keep the original formatting (no "`rh-api`" prepend).**_
**Security Scheme Type:** API Key
**Header parameter name:** `x-api-key`
[](https://docs.robinhood.com/#section/Authentication/API%20Signature)
API Signature
------------------------------------------------------------------------------------
Authenticated requests should be signed with the "`x-signature`" header, using a signature generated with the following: private key, API key, timestamp, path, method, and body. Here’s how the message signature should be defined:
message = f"{api_key}{current_timestamp}{path}{method}{body}"
\*_**Note that for requests without a body, the body can be omitted from the message signature.**_
### Example Signature
The following is an example of a signature that corresponds to a cancel order request. You may use the example values below to ensure your code implementation is generating the same (`x-signature`) header signature value. The code snippet is for generating the signature in Python.
| Field | Value |
| --- | --- |
| Private Key | xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU= |
| Public Key | jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk= |
| API Key | rh-api-6148effc-c0b1-486c-8940-a1d099456be6 |
| Method | POST |
| Path | /api/v1/crypto/trading/orders/ |
| Body | {"client\_order\_id":"131de903-5a9c-4260-abc1-28d562a5dcf0","side":"buy","type":"market","symbol":"BTC-USD","market\_order\_config":{"asset\_quantity":"0.1"}} |
| Timestamp | 1698708981 |
| **API Signature Header** | **q/nEtxp/P2Or3hph3KejBqnw5o9qeuQ+hYRnB56FaHbjDsNUY9KhB1asMxohDnzdVFSD7StaTqjSd9U9HvaRAw==** |
### Code Example
#### Python
import nacl.signing
import base64
import time
# Replace these with your base64-encoded keys
private_key_base64 = "xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU="
public_key_base64 = "jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk="
api_key = "rh-api-6148effc-c0b1-486c-8940-a1d099456be6"
# Get the current Unix timestamp in seconds
# You can get the current_timestamp with the following code:
# current_timestamp = int(time.time())
# This value is hardcoded for demonstration purposes to match the example in the documentation
current_timestamp = "1698708981"
path = f"/api/v1/crypto/trading/orders/"
method = "POST"
body = {
"client_order_id": "131de903-5a9c-4260-abc1-28d562a5dcf0",
"side": "buy",
"symbol": "BTC-USD",
"type": "market",
"market_order_config": {
"asset_quantity": "0.1"
},
}
# Convert base64 strings to seed (for private key) and bytes (for public key)
private_key_seed = base64.b64decode(private_key_base64)
public_key_bytes = base64.b64decode(public_key_base64)
# Create private key (from seed) and public key (from bytes)
private_key = nacl.signing.SigningKey(private_key_seed)
public_key = nacl.signing.VerifyKey(public_key_bytes)
# Create the message to sign
message = f"{api_key}{current_timestamp}{path}{method}{body}"
# Sign the message
signed = private_key.sign(message.encode("utf-8"))
base64_signature = base64.b64encode(signed.signature).decode("utf-8")
print(base64_signature)
# Verify the signature
public_key.verify(signed.message, signed.signature)
**Security Scheme Type:** API Key
**Header parameter name:** `x-signature`
[](https://docs.robinhood.com/#section/Authentication/Timestamp)
Timestamp
--------------------------------------------------------------------------
The "`x-timestamp`" header should contain the timestamp of the request.
**To protect the security and integrity of your API interactions, timestamps are only valid for 30 seconds after they’re generated, and an expired timestamp will be rejected. Therefore, ensure that your requests are made promptly after generating the timestamp.**
Below is an example in Python on how to generate the timestamp.
import time
current_timestamp = int(time.time())
print(current_timestamp)
**Security Scheme Type:** API Key
**Header parameter name:** `x-timestamp`
[](https://docs.robinhood.com/#section/Making-your-first-API-call)
Making your first API call
=============================================================================================
Developing your own application to place trades with your Robinhood account is quick and simple. Once you've finished [authentication](https://docs.robinhood.com/crypto/trading/#section/Authentication)
, start here with the code you'll need to access the API and make supported API calls. These are essentially the building blocks of code for each API call, which you can easily build on based on your preferred strategies.
1. Create a script file
mkdir robinhood-api-trading && cd robinhood-api-trading
touch robinhood_api_trading.py
touch robinhood_api_trading_v2.py
2. Install PyNaCl library
pip install pynacl
3. To use v1 endpoints, copy the script below into the newly created `robinhood_api_trading.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITrading:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(key: str, *args: Optional[str]) -> str:
if not args:
return ""
params = []
for arg in args:
params.append(f"{key}={arg}")
return "?" + "&".join(params)
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body), timeout=10)
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_account(self) -> Any:
path = "/api/v1/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/trading/trading_pairs/{query_params}"
return self.make_api_request("GET", path)
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, *asset_codes: Optional[str]) -> Any:
query_params = self.get_query_params("asset_code", *asset_codes)
path = f"/api/v1/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# the best bid and ask for all supported symbols will be returned
def get_best_bid_ask(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
path = f"/api/v1/crypto/marketdata/estimated_price/?symbol={symbol}&side={side}&quantity={quantity}"
return self.make_api_request("GET", path)
def place_order(
self,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/"
return self.make_api_request("GET", path)
def get_orders(self) -> Any:
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITrading()
print(api_trading_client.get_account())
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.0001"}
)
"""
if __name__ == "__main__":
main()
4. To use v2 endpoints, copy the script below into the newly created `robinhood_api_trading_v2.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITradingV2:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(params_dict: Dict[str, Any]) -> str:
"""
Build query parameter string from a dictionary.
- Single values: {"key1": "value1", "key2": "value2"}
- Multiple values for same key: {"symbol": ["BTC-USD", "ETH-USD"]}
"""
if not params_dict:
return ""
params = []
for key, value in params_dict.items():
if value is None:
continue
if isinstance(value, list):
# Handle multiple values for the same key
for v in value:
params.append(f"{key}={v}")
else:
params.append(f"{key}={value}")
return "?" + "&".join(params) if params else ""
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body) if body else None, timeout=10)
# Check for non-success status codes
if response.status_code >= 400:
print(f"HTTP Error {response.status_code}: {response.reason}")
try:
return response.json()
except json.JSONDecodeError:
return {"error": response.text or response.reason, "status_code": response.status_code}
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_accounts(self) -> Any:
path = "/api/v2/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> list:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/trading_pairs/{query_params}"
all_results = []
response = self.make_api_request("GET", path)
while response:
results = response.get("results", [])
all_results.extend(results)
next_url = response.get("next")
if not next_url:
break
next_path = next_url.replace(self.base_url, "")
response = self.make_api_request("GET", next_path)
return all_results
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, account_number: str, *asset_codes: Optional[str]) -> Any:
params = {"account_number": account_number}
if asset_codes:
params["asset_code"] = list(asset_codes)
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD".
def get_best_bid_ask(self, *symbols: str) -> Any:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
params = {"symbol": symbol, "side": side, "quantity": quantity}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/estimated_price/{query_params}"
return self.make_api_request("GET", path)
def place_order(
self,
account_number: str,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v2/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, account_number: str, order_id: str) -> Any:
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{order_id}/{query_params}"
return self.make_api_request("GET", path)
def get_orders(self, account_number: str) -> Any:
params = {
"account_number": account_number,
"created_at_start": "2023-01-01T20:57:50Z"
}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITradingV2()
print(api_trading_client.get_trading_pairs())
# print(api_trading_client.get_trading_pairs("BTC-USD", "ETH-USD"))
# print(api_trading_client.get_best_bid_ask("BTC-USD")) #"BTC-USD", "ETH-USD"
# print(api_trading_client.get_estimated_price(symbol="BTC-USD", side="both", quantity="0.01"))
# accounts = api_trading_client.get_accounts()
# print(accounts)
# account_number = accounts["results"][0]["account_number"]
# print(f"account_number: {account_number}")
# print(api_trading_client.get_orders(account_number))
# print(api_trading_client.get_holdings(account_number))
# print(api_trading_client.get_holdings(account_number, "BTC", "ETH"))
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
account_number,
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.000001"}
)
"""
if __name__ == "__main__":
main()
5. Run your script from the command line
# to run the Python script using the v1 API endpoints:
python robinhood_api_trading.py
# to run the Python script using the v2 API endpoints:
python robinhood_api_trading_v2.py
[](https://docs.robinhood.com/#section/Pagination)
Pagination
=============================================================
Endpoints that return a list of results allow you to paginate to have more control over how many and which results to display.
### Pagination Parameters
| Parameter | Description |
| --- | --- |
| cursor | The cursor is a unique identifier for each page in a list of results. The cursor is used to paginate through the pages of results. |
| limit | The limit is the number of items to return in a single page. Some of our endpoints support this query parameter. You can view support by checking the query parameters in the documentation of each endpoint. |
### Pagination Response
| Field | Description |
| --- | --- |
| next | The API request endpoint that includes the next cursor query parameter to use for pagination. |
| previous | The API request endpoint that includes the previous cursor query parameter to use for pagination. |
| results | The list of response items for the current cursor. |
[](https://docs.robinhood.com/#section/Rate-Limiting)
Rate Limiting
===================================================================
### Rate Limits
* Requests per minute per user account: 100
* Requests per minute per user account in bursts: 300
Rate limiting is applied using a token bucket implementation. The burst size or `capacity` is the number of tokens you can use to call an endpoint. This capacity is initialized at the maximum capacity and will be refilled using a `refill amount` at a timed interval called `refill interval` until the max capacity is once again reached.
### Rate Limiting Terms
| Term | Description |
| --- | --- |
| Max capacity | The maximum amount of tokens allowed. Will no longer continue refilling if this amount is reached. |
| Remaining amount | The number of tokens remaining that can be consumed to call an endpoint. |
| Refill amount | The number of tokens that are refilled at each refill interval. |
| Refill interval | The timed interval at which the tokens are refilled. |
The actual values of the configuration will fluctuate depending on the availability of our service and our current expected volume at the time of service. Rate limits are applied per endpoint and may differ among each endpoint depending on their expected use case.
#### Example rate limiting configuration:
| Term | Value |
| --- | --- |
| Max capacity | 5 |
| Remaining amount | 2 |
| Refill amount | 1 |
| Refill interval | 1 second |
| Action | Time (in seconds) | Remaining amount | Description |
| --- | --- | --- | --- |
| Initialize | 0 | 5 | Initial state of the token bucket. |
| Endpoint call 1 | 0.5 | 4 | One token consumed for calling endpoint 1. |
| Endpoint call 2 | 0.7 | 3 | One token consumed for calling endpoint 2. |
| Refill | 1 | 4 | One token refilled at refill interval. |
| Refill | 2 | 5 | One token refilled at refill interval. |
| No refill | 3 | 5 | No refill since max capacity has been reached and no endpoints were called. |
| Endpoint call 3 | 3.5 | 4 | One token consumed for calling endpoint 3. |
[](https://docs.robinhood.com/#section/Error-Responses)
Error Responses
=======================================================================
### Error response format
#### Type
The `type` field in the error response will be mapped to the following:
| Error type | Status codes |
| --- | --- |
| validation\_error | 400 |
| client\_error | 4XX, excluding 400 |
| server\_error | 5XX |
#### Errors
The `errors` field will contain a list of error details, each item will contain a nested `attr` and `detail` field.
| Field | Description |
| --- | --- |
| attr | Error types of `validation_error` will specify the field name or `non_field_errors` if the error cannot be attributed to a field. Will be `null` for error types of either `client_error` and `server_error`. |
| detail | Will contain a human readable string describing the error. |
### Example Error Response
Here's a sample error response where the `client_order_id` field in the payload was a value that was not expected when calling the _**Add Crypto Order**_ endpoint. The `detail` field for each error in the `errors` list will help understand why the `validation_error` was thrown. The `attr` field will indicate which field name in the request body or query parameter the error was thrown for if applicable.
{
"type": "validation_error"
"errors": [\
{\
"detail": "Must be a valid UUID.",\
"attr": "client_order_id"\
}\
]
}
### Common Error Status Codes
| Status Code | Error |
| --- | --- |
| 400 | Bad request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not found |
| 405 | Method not allowed |
| 406 | Not acceptable |
| 415 | Unsupported media type |
| 429 | Too many requests |
| 500 | Internal server error |
| 503 | Service unavailable |
[](https://docs.robinhood.com/#tag/V2-Account)
Account
======================================================
[](https://docs.robinhood.com/#tag/V2-Account/operation/api_v2_crypto_trading_accounts)
Get Accounts
----------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto trading accounts for the authenticated user. Returns account details including buying power, status, and fee tier information.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of accounts to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/accounts/
https://trading.robinhood.com/api/v2/crypto/trading/accounts/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string", * "account_type": "string", * "is_api_tradable": true, * "fee_tier_status": { * "fee_ratio": 0.1, * "thirty_day_volume": 0.1, * "next_fee_tier_ratio": 0.1, * "next_fee_tier_threshold": 0.1 } } ] }`
[](https://docs.robinhood.com/#tag/V2-Market-Data)
Market Data
==============================================================
[](https://docs.robinhood.com/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_best_bid_ask)
Get Best Price
-----------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner exchanges. This price does not take into account the order size or fee, and may not be the final execution price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted.
For example, `?symbol=BTC-USD&symbol=ETH-USD` |
### Responses
**200**
**400**
**403**
get/api/v2/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v2/crypto/marketdata/best\_bid\_ask/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "bid": 0.1, * "ask": 0.1 } ] }`
[](https://docs.robinhood.com/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_estimated_price)
Get Estimated Price
-------------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, asset quantity, and fee. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our partner exchanges provide for an order, excluding the fee.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example `BTC-USD`. Ensure that the symbol is provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side: `bid`, `ask`, or `both`. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be smaller than `max_order_size` as defined in our Get Crypto Trading Pairs endpoint. Multiple quantities can be comma-separated. A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/estimated\_price/
https://trading.robinhood.com/api/v2/crypto/trading/estimated\_price/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "quantity": 0.1, * "timestamp": "2019-08-24T14:15:22Z", * "bid": 0.1, * "ask": 0.1, * "fee_ratio": 0.1, * "est_fee": 0.1, * "est_total_cost": 0.1, * "est_total_credit": 0.1 } ] }`
[](https://docs.robinhood.com/#tag/V2-Trading)
Trading
======================================================
[](https://docs.robinhood.com/#tag/V2-Trading/operation/api_v2_crypto_trading_trading_pairs)
Get Trading Pairs
--------------------------------------------------------------------------------------------------------------
Fetch a paginated list of available trading pairs for crypto trading. Returns trading pair details including price increments, order size limits, and tradability status. Trading pairs can be filtered by symbol.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
Optional. Filter by trading pair symbol(s). Example: `symbol=BTC-USD`. Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, `?symbol=BTC-USD&symbol=ETH-USD`.
If the "symbol" parameter is not provided, this endpoint will return all tradable currency pairs. |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**401**
**403**
**404**
get/api/v2/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v2/crypto/trading/trading\_pairs/
### Response samples
* 200
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "symbol": "string", * "asset_code": "string", * "quote_code": "string", * "asset_increment": "string", * "quote_increment": "string", * "max_order_size": "string", * "min_order_amount": "string", * "status": "string", * "is_api_tradable": true } ] }`
[](https://docs.robinhood.com/#tag/V2-Trading/operation/api_v2_crypto_trading_holdings)
Get Holdings
----------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto holdings for a specific account. Returns the total quantity and available quantity for each asset held in the account. The `account_number` query parameter is required.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
**Required.** The account number to retrieve holdings for. This parameter must be provided. |
| asset\_code | string
Example: asset\_code=BTC
Optional. Filter holdings by specific asset code (e.g., "BTC"). |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/holdings/
https://trading.robinhood.com/api/v2/crypto/trading/holdings/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": "string", * "quantity_available_for_trading": "string" } ] }`
[](https://docs.robinhood.com/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_get)
Get Orders
----------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user in a specific account.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to retrieve orders from. |
| cursor | string
Optional cursor for pagination. |
| created\_at\_start | string
Filter orders created on or after this timestamp (ISO 8601 format). |
| created\_at\_end | string
Filter orders created on or before this timestamp (ISO 8601 format). |
| updated\_at\_start | string
Filter orders updated on or after this timestamp (ISO 8601 format). |
| updated\_at\_end | string
Filter orders updated on or before this timestamp (ISO 8601 format). |
| symbol | string
Filter orders by trading pair symbol. |
| side | string
Enum: "buy" "sell"
Filter orders by side. |
| type | string
Enum: "market" "limit" "stop\_loss" "stop\_limit"
Filter orders by type. |
| state | string
Enum: "open" "canceled" "filled" "failed" "pending"
Filter orders by state. |
### Responses
**200**
**400**
**401**
**403**
**404**
get/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Response samples
* 200
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 } ] }`
[](https://docs.robinhood.com/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_post)
Place New Crypto Order
-----------------------------------------------------------------------------------------------------------------
Place a new crypto trading order with an order type. This endpoint only supports placing orders on USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint.
**Note:** Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to place orders from. |
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
**401**
**403**
**404**
post/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Request samples
* Payload
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "time_in_force": "gtc" }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/#tag/V2-Trading/operation/api_v2_crypto_trading_cancel_order)
Cancel Open Crypto Order
--------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
The ID of the order to cancel. |
### Responses
**200**
**400**
**403**
post/api/v2/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v2/crypto/trading/orders/{id}/cancel/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/#tag/Account)
Account
===================================================
[](https://docs.robinhood.com/#tag/Account/operation/api_v1_crypto_trading_account_Details)
Get Crypto Trading Account Details
------------------------------------------------------------------------------------------------------------------------------
Fetches the Robinhood Crypto account details for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
### Responses
**200**
get/api/v1/crypto/trading/accounts/
https://trading.robinhood.com/api/v1/crypto/trading/accounts/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/accounts/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
Content type
application/json
Copy
`{ * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string" }`
[](https://docs.robinhood.com/#tag/Market-Data)
Market Data
===========================================================
[](https://docs.robinhood.com/#tag/Market-Data/operation/api_v1_crypto_marketdata_best_bid_ask)
Get Best Price
--------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner market makers. This price does not take into account the order size, and may not be the final execution price.
The bid and ask prices include a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
Note that in the v2 endpoint, **Place crypto orders with fee tiers**, partner exchanges provide prices instead of market makers, with orders routed accordingly. For more information on routing, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-order-routing/)
.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "price": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/#tag/Market-Data/operation/api_v1_crypto_marketdata_estimated_price)
Get Estimated Price
----------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, and asset quantity. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. To estimate the cost for a Buy order, request an Ask quote. If you are preparing to place a Sell order, request a Bid quote. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our market makers provide for an order, inclusive of a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example BTC-USD. Ensure that the symbol is provided in all uppercase.
Only USD symbols are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side. e.g. bid, ask, or both. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be between `min_order_size` and `max_order_size` as defined in our `Get Crypto Trading Pairs` endpoint.
A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/estimated\_price/
https://trading.robinhood.com/api/v1/crypto/marketdata/estimated\_price/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/marketdata/api/v1/estimated\_price/?symbol=BTC-USD&side=ask&quantity=0.1,1,1.999" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "price": 0.1, * "quantity": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/#tag/Trading)
Trading
===================================================
[](https://docs.robinhood.com/#tag/Trading/operation/api_v1_crypto_trading_trading_pairs)
Get Crypto Trading Pairs
------------------------------------------------------------------------------------------------------------------
Fetch a list of trading pairs.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "asset_code": "string", * "quote_code": "string", * "quote_increment": "string", * "asset_increment": "string", * "max_order_size": "string", * "min_order_size": "string", * "status": "tradable", * "symbol": "string" } ] }`
[](https://docs.robinhood.com/#tag/Trading/operation/api_v1_crypto_trading_holdings)
Get Crypto Holdings
--------------------------------------------------------------------------------------------------------
Fetch a list of holdings for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| asset\_code | string
Example: asset\_code=BTC
The asset code(s) to retrieve data for.
Multiple asset codes can be provided by using the "asset\_code" parameter with different values. Ensure that the asset codes are provided in all uppercase.
For example, **?asset\_code=BTC&asset\_code=ETH** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/holdings/
https://trading.robinhood.com/api/v1/crypto/trading/holdings/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/holdings/?asset\_code=BTC" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": 0.1, * "quantity_available_for_trading": 0.1 } ] }`
[](https://docs.robinhood.com/#tag/Trading/operation/api_v1_crypto_trading_orders)
Get Crypto Orders
----------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| created\_at\_start | string
Example: created\_at\_start=2023-10-31T20:57:50Z
Filter by created at start time range (greater than or equal to) in ISO 8601 format |
| created\_at\_end | string
Example: created\_at\_end=2023-10-31T20:57:50Z
Filter by created at end time range (less than or equal to) in ISO 8601 format |
| symbol | string
Example: symbol=BTC-USD
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| id | string
Order ID, unique per order |
| side | string
Enum: "buy" "sell"
Buy or sell |
| state | string
Enum: "open" "canceled" "partially\_filled" "filled" "failed"
State of the order |
| type | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| updated\_at\_start | string
Example: updated\_at\_start=2023-10-31T20:57:50Z
Filter by updated at start time range (greater than or equal to) in ISO 8601 format |
| updated\_at\_end | string
Example: updated\_at\_end=2023-10-31T20:57:50Z
Filter by updated at end time range (less than or equal to) in ISO 8601 format |
| cursor | string |
| limit | integer
Limit the number of results per page size |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/orders/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } } ] }`
[](https://docs.robinhood.com/#tag/Trading/operation/api_v1_post_crypto_trading_order)
Place New Crypto Order
-------------------------------------------------------------------------------------------------------------
Places a new crypto trading order with an order type.
**Note**: Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
post/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* Payload
* cURL
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
[](https://docs.robinhood.com/#tag/Trading/operation/api_v1_post_crypto_trading_cancel_order)
Cancel Open Crypto Order
----------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
Order ID, unique per order |
### Responses
**200**
**400**
**404**
post/api/v1/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/
### Request samples
* cURL
Copy
curl \-X "POST" "https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
text/plain
Copy
Cancel request was submitted for order {id}
---
# Robinhood
* Overview
* Integration Steps
* 1\. Reach out to the Robinhood Connect team
* 2\. Get Unique ApplicationId and appKey
* 3\. Add a Robinhood Connect Button to the UI
* 4\. Add logic to generate connectId
* 5\. Link to Robinhood Connect
* 6\. Undergo Pre-Launch Checklist with the Robinhood Connect team
* 7\. Launch!
* Checking if Robinhood App is installed
* Android
* iOS
* Android: React Native
* iOS: React Native
* Supported Networks
* Available Assets
* On-Ramp API
* postGenerate Connect ID
* getRobinhood Connect URL for On-Ramp
* getAsset Discovery
* getPrice Quote
* getOrder Details
* getOrder Lifecycle (Lightweight Status)
* getExternal Session Status
* getGet External Application
* Off-Ramp API
* getRobinhood Connect URL for Off-Ramp
* getRedirect URL
* postDeposit Address Redemption
* getPrice Quote
* getOrder Details
* getOrder Lifecycle (Lightweight Status)
[API docs by Redocly](https://redocly.com/redoc/)
Robinhood Connect API Documentation (5.4.2)
===========================================
[](https://docs.robinhood.com/crypto/connect/#section/Overview)
Overview
========================================================================
Robinhood Connect is an SDK/UI widget that lets users use their existing Robinhood accounts to transfer/fund their dApps or self-custody wallets, utilizing existing Robinhood infrastructure. It supports both on-ramp (buying crypto with fiat) and off-ramp (selling crypto to fiat) functionality.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps)
Integration Steps
==========================================================================================
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/1.-Reach-out-to-the-Robinhood-Connect-team)
1\. Reach out to the Robinhood Connect team
---------------------------------------------------------------------------------------------------------------------------------------------------------------
To integrate with Robinhood Connect, reach out to Gaetan ([gaetan.thabot@robinhood.com](mailto:gaetan.thabot@robinhood.com)
). Upon signing an NDA with us we can begin the integration.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/2.-Get-Unique-ApplicationId-and-appKey)
2\. Get Unique ApplicationId and appKey
-------------------------------------------------------------------------------------------------------------------------------------------------------
The Robinhood Connect team will provide a unique applicationId and appKeys to whitelist your dApp. You could also provide assets for your dApp's logo and redirect urls that need to be whitelisted.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/3.-Add-a-Robinhood-Connect-Button-to-the-UI)
3\. Add a Robinhood Connect Button to the UI
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Button assets will be shared by the team, this button can be rendered as you see fit on your app or website.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/4.-Add-logic-to-generate-connectId)
4\. Add logic to generate connectId
-----------------------------------------------------------------------------------------------------------------------------------------------
To prevent malicious use, every link to Robinhood Connect needs a unique connectId which can be generated on the dApp's authenticated backend, see ConnectId under API Docs below.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/5.-Link-to-Robinhood-Connect)
5\. Link to Robinhood Connect
-----------------------------------------------------------------------------------------------------------------------------------
Configure the onClick action for the button added in the previous step to open to the URL for Robinhood Connect in a new tab on the native browser on mobile or desktop. If the user has the Robinhood mobile app installed, the link will open on the app and the user won't have to log in again. More details about the URL can be found in the section below.
> ⚠️ **Important**
> Your app should not open this link in an in-app browser or webview. It must be opened in the user's default browser. This is so that, if the user has the Robinhood mobile app installed, it will automatically open the mobile app and the user will then skip the login screen. You must also avoid adding any redirects before this link or else the Universal Link might not open on the Robinhood mobile app.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/6.-Undergo-Pre-Launch-Checklist-with-the-Robinhood-Connect-team)
6\. Undergo Pre-Launch Checklist with the Robinhood Connect team
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
These include:
* Validation of the Robinhood Connect integration being appropriately implemented.
* Add some Robinhood users to whitelist some for testing.
* We would also try out the integration before rollout to make sure everything looks good, so do let us know how we can test out the alpha build
* Going over the rollout strategy for this integration.
* Satisfying all legal requirements like NDA, Due Diligence etc.
[](https://docs.robinhood.com/crypto/connect/#section/Integration-Steps/7.-Launch!)
7\. Launch!
-----------------------------------------------------------------------------------------------
[](https://docs.robinhood.com/crypto/connect/#section/Checking-if-Robinhood-App-is-installed)
Checking if Robinhood App is installed
====================================================================================================================================
Below application level code for iOS and Android, can be used to check if the dApp user also has Robinhood App installed.
[](https://docs.robinhood.com/crypto/connect/#section/Checking-if-Robinhood-App-is-installed/Android)
Android
-------------------------------------------------------------------------------------------------------------
import android.content.Context
import android.content.pm.PackageManager
fun isAppInstalled(context: Context, packageName: String): Boolean {
return try {
val packageName = "com.robinhood.android"
context.packageManager.getPackageInfo(packageName, 0)
true // App is installed
} catch (e: PackageManager.NameNotFoundException) {
false // App is not installed
}
}
[](https://docs.robinhood.com/crypto/connect/#section/Checking-if-Robinhood-App-is-installed/iOS)
iOS
-----------------------------------------------------------------------------------------------------
1/ Add url scheme to info.plist
// Add this to your Info.plist:
....
LSApplicationQueriesSchemes
robinhood
.... other URL schemes
....
2/ Check if the url can be opened
// Check if the app is installed. Return true if installed, false otherwise.
func isRobinhoodInstalled() -> Bool {
guard let url = URL(string: "robinhood://") else { return false }
return UIApplication.shared.canOpenURL(url)
}
[](https://docs.robinhood.com/crypto/connect/#section/Checking-if-Robinhood-App-is-installed/Android:-React-Native)
Android: React Native
-----------------------------------------------------------------------------------------------------------------------------------------
1/ Add intent in Android Manifest
2/ In the react-native code, check for app installation
import { Linking } from 'react-native';
// to check if the app is installed or not.
export async function isRobinhoodInstalled() {
try {
const canOpen = await Linking.canOpenURL('robinhood://');
return canOpen; // true if installed, false otherwise
} catch (error) {
return false;
}
}
[](https://docs.robinhood.com/crypto/connect/#section/Checking-if-Robinhood-App-is-installed/iOS:-React-Native)
iOS: React Native
---------------------------------------------------------------------------------------------------------------------------------
1/ Add url scheme to info.plist
// Add this to your Info.plist:
....
LSApplicationQueriesSchemes
robinhood
.... other URL schemes
....
2/ In the react-native code, check for app installation
import { Linking } from 'react-native';
// to check if the app is installed or not.
export async function isRobinhoodInstalled() {
try {
const canOpen = await Linking.canOpenURL('robinhood://');
return canOpen; // true if installed, false otherwise
} catch (error) {
return false;
}
}
[](https://docs.robinhood.com/crypto/connect/#section/Supported-Networks)
Supported Networks
============================================================================================
These are the possible values for supportedNetworks:
* AVALANCHE
* BITCOIN
* BITCOIN\_CASH
* LITECOIN
* DOGECOIN
* ETHEREUM
* ETHEREUM\_CLASSIC
* POLYGON
* SOLANA
* STELLAR
* TEZOS
[](https://docs.robinhood.com/crypto/connect/#section/Available-Assets)
Available Assets
========================================================================================
The list of Asset Codes and Order Increments used by Robinhood can be found at: [https://nummus.robinhood.com/currency\_pairs/](https://nummus.robinhood.com/currency_pairs/)
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API)
On-Ramp API
==========================================================================
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/generate_connect_id)
Generate Connect ID
----------------------------------------------------------------------------------------------------------------
Generates a unique and transient connect ID that needs to be appended to each Robinhood Connect link to prevent phishing. This ID should be generated on the server side and must be unique for each connection attempt.
**Important Notes:**
* The Connect ID needs to be uniquely generated each time the user is linked to Robinhood Connect
* We strongly recommend not generating the Connect ID on the client side, to not accidentally expose the apiKey
* The Connect ID needs to be "fresh", as it is a short-lived token
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
The application ID provided by the RH team |
##### Request Body schema: application/json
required
| | |
| --- | --- |
| withdrawal\_address
required | string
The user's withdrawal address |
| referenceId | string <= 30 characters ^\[a-zA-Z0-9\]\*$
Optional parameter to set an external reference id. It will be stored alongside the order once completed, and returned in the order details. |
### Responses
**200**
Successfully generated Connect ID
post/catpay/v1/connect\_id/
Robinhood Connect API
https://api.robinhood.com/catpay/v1/connect\_id/
### Request samples
* Payload
Content type
application/json
Copy
`{ * "withdrawal_address": "0x1377454e08497ed3E5112349099E931600EB7Bb3", * "referenceId": "97179014074920260372" }`
### Response samples
* 200
Content type
application/json
Copy
`{ * "connectId": "19f0fce8-37da-4206-a43f-5925e9c4e1dc" }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/connect_url)
Robinhood Connect URL for On-Ramp
----------------------------------------------------------------------------------------------------------------------
This link will open the Robinhood Connect UI in the Robinhood app if it's already installed, or the Robinhood Connect Web UI if the user does not have the Robinhood app installed.
##### query Parameters
| | |
| --- | --- |
| applicationId
required | string
A unique ID provided to each dApp by the Robinhood team |
| connectId
required | string
A unique request ID generated for each redirection to Robinhood Connect |
| walletAddress
required | string
The wallet address to which the coin would be transferred |
| supportedNetworks
required | string
The networks supported by the wallet address and origin app (comma separated string, e.g., 'ETHEREUM,POLYGON') |
| supportedAssets | string
The assets supported by the wallet address and origin app (comma separated string, e.g., 'ETH,MATIC,SHIB'). **Strongly recommended** to provide supported assets. If omitted, users will be able to select any coin Robinhood supports in the supported networks, even if the origin app does not. |
| redirectUrl | string
Link to return after the user finishes Robinhood Connect flow. This URL must be registered to your unique application ID |
| assetCode | string
To be set if the asset to be purchase has been already determined |
| fiatCode | string
Value: "USD"
To be set if the asset to be purchased has been already determined. We accept only USD at the moment. |
| assetAmount | string
To be set if quantity has been already determined in the asset denomination. If this is set, assetCode must be set. |
| fiatAmount | string
To be set if quantity has been determined in fiat denomination. If this is set, assetCode and fiatCode must be set. |
| lockAmount | boolean
Default: false
When set to true, prevents the user from modifying the amount specified in either fiatAmount or assetAmount. If lockAmount is true, either fiatAmount or assetAmount must be set. |
| includeFeeInAmount | boolean
Default: false
To be set to true for total quote (including fees) to equal user's input fiat amount, as opposed to fees being added in addition |
| paymentMethod | string
Enum: "buying\_power" "crypto\_balance" "debit\_card" "bank\_transfer"
To be set if a payment method is preferred. If the payment method is not available to the user, a default payment method will be selected.
* buying\_power: buy coins with robinhood buying power
* crypto\_balance: transfer user's coin holding
* debit\_card: buy coins with debit card
* bank\_transfer: buy coins with ACH |
### Responses
**302**
Redirects to Robinhood Connect UI
get/u/connect
Robinhood Connect URL
https://applink.robinhood.com/u/connect
### Request samples
* DOGE
* ETH
Copy
https://applink.robinhood.com/u/connect?applicationId\=&walletAddress\=&supportedAssets\=DOGE&supportedNetworks\=DOGECOIN&connectId\=123e4567\-e89b\-12d3\-a456\-426614174001
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_supported_currencies)
Asset Discovery
-----------------------------------------------------------------------------------------------------------------
Returns all the crypto assets supported by Robinhood Connect.
##### query Parameters
| | |
| --- | --- |
| applicationId
required | string
To track the origin of the request |
### Responses
**200**
Successfully retrieved supported currencies
get/catpay/v1/supported\_currencies/
Robinhood Connect API
https://api.robinhood.com/catpay/v1/supported\_currencies/
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/supported\_currencies/?applicationId='
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "applicationId": "test-123", * "cryptoCurrencyPairs": [ * { * "id": "69432091-9fd3-4ca8-aef3-78fc2f193608", * "assetCurrency": { * "id": "6f64d0ab-aa87-4cb2-ae2b-2287a2b2c7a4", * "code": "ATOM", * "name": "Cosmos", * "currencyType": "cryptocurrency" }, * "quoteCurrency": { * "id": "1072fc76-1862-41ab-82c2-485837590762", * "code": "USD", * "name": "US Dollar", * "currencyType": "fiat" }, * "supportedNetworks": [ * "COSMOS" ] } ] }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_price_quote)
Price Quote
----------------------------------------------------------------------------------------------------
Returns the crypto currency price quote for Robinhood Connect.
##### path Parameters
| | |
| --- | --- |
| assetCode
required | string
The asset code for the quote |
##### query Parameters
| | |
| --- | --- |
| applicationId
required | string
To track the origin of the request |
| networkCode | string
If the user wants quote for a specific network |
| fiatCode | string
Default: "USD"
Fiat code for the quote. Defaults to USD if nothing is provided |
| fiatAmount | string
Amount in Fiat for the asset quote |
| cryptoAmount | string
Default: "1"
Amount in crypto for the asset quote. If both fiatAmount and cryptoAmount are specified, cryptoAmount will take precedence. Defaults to 1 if fiatAmount and cryptoAmount aren't provided |
| includeFeeInAmount | boolean
Default: false
Boolean flag on whether we should include the fee as part of the fiatAmount calculation.
When includeFeeToAmount is False or not specified, the request parameter `fiatAmount` or `cryptoAmount` indicates the base amount without including the fee e.g. $1000 base amount + $2.5 network fee + $1 processing fee = $1003.5 total amount
When includeFeeInAmount is True, the request parameter `fiatAmount` or `cryptoAmount` indicates the total amount including the fee e.g. $1000 total inclusive of fees = $996.5 base amount + $2.5 network fee + $1 processing fee |
| paymentMethod | string
Default: "buying\_power"
Enum: "buying\_power" "crypto\_balance" "debit\_card" "bank\_transfer"
When the parameter is included, the quote will calculate the processingFee associated with the paymentMethod. Note that a transfer of Robinhood crypto balance does not have an associated processing fee. |
### Responses
**200**
Successfully retrieved price quote
get/catpay/v1/{assetCode}/quote/
Robinhood Connect API
https://api.robinhood.com/catpay/v1/{assetCode}/quote/
### Request samples
* cURL-crypto
* cURL-fiat
* cURL-fiat-fees
* cURL-payment
Copy
curl \--request GET 'https://api.robinhood.com/catpay/v1/ETH/quote/?applicationId=&networkCode=ETHEREUM&cryptoAmount=1&fiatCode=USD'
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "assetCode": "ETH", * "applicationId": "74d09dd4-315f-4281-86c2-b65d2a72d88a", * "fiatCode": "USD", * "fiatAmount": "3285.09", * "cryptoAmount": "1.494751", * "price": "2197.75", * "networkFee": { * "type": "PRICE_ITEM_TYPE_CRYPTO_CURRENCY_NETWORK_FEE", * "fiatAmount": "11.54", * "cryptoQuantity": "0.00525" }, * "processingFee": { * "type": "PRICE_ITEM_TYPE_CRYPTO_CURRENCY_PROCESSING_FEE", * "fiatAmount": "0", * "cryptoQuantity": "0" }, * "totalAmount": { * "type": "PRICE_ITEM_TYPE_TOTAL", * "fiatAmount": "3296.63", * "cryptoQuantity": "1.5" }, * "partnerFee": { * "type": "PRICE_ITEM_TYPE_PARTNER_FEE", * "fiatAmount": "0", * "cryptoQuantity": "0" }, * "paymentMethod": "buying_power", * "includeFeeInAmount": true, * "networkCode": "ETHEREUM" }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_order_details)
Order Details
--------------------------------------------------------------------------------------------------------
Returns the transaction details once an order is complete. This request should be made from the backend following the user's order submission.
##### path Parameters
| | |
| --- | --- |
| connectId
required | string
ID that was passed in during the start of the order to enter the Connect flow |
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
The applicationId provided by the RH team |
### Responses
**200**
Successfully retrieved order details
get/catpay/v1/external/order/{connectId}
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external/order/{connectId}
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external/order/123e4567-e89b-12d3-a456-426614174001' \\
\--header 'application-id: ' \\
\--header 'x-api-key: '
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "applicationId": "string", * "connectId": "string", * "assetCode": "string", * "networkCode": "string", * "fiatCode": "string", * "fiatAmount": "string", * "cryptoAmount": "string", * "price": "string", * "networkFee": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "processingFee": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "partnerFee": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "paymentMethod": "crypto_balance", * "totalAmount": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "blockchainTransactionId": "string", * "destinationAddress": "string", * "referenceID": "string", * "status": "ORDER_STATUS_IN_PROGRESS" }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_order_lifecycle)
Order Lifecycle (Lightweight Status)
---------------------------------------------------------------------------------------------------------------------------------
Returns a lightweight order status response, ideal for simple polling to check if an order completed. For full order details, use the Order Details endpoint instead.
**Best for:** Simple status polling to check if an order succeeded
**Returns:** Minimal fields: coin, network, quantity, blockchain transaction ID, and status
##### query Parameters
| | |
| --- | --- |
| reference\_id
required | string
The reference ID that was passed when creating the connect ID or off-ramp order |
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
The application ID provided by the RH team |
### Responses
**200**
Successfully retrieved order lifecycle status
get/catpay/v1/external/order\_lifecycle
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external/order\_lifecycle
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external/order\_lifecycle?reference\_id=your-order-123' \\
\--header 'application-id: ' \\
\--header 'x-api-key: '
### Response samples
* 200
Content type
application/json
Copy
`{ * "coin": "ETH", * "network": "ETHEREUM", * "quantity": "0.05", * "blockchainTxId": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", * "status": "ORDER_STATUS_SUCCEEDED" }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_external_session)
External Session Status
---------------------------------------------------------------------------------------------------------------------
Check the status of a connect ID session. Useful to determine if a connect ID has been used to place an order, is still unused, or has expired.
**Use cases:**
* Check if a user completed an order for a given connect ID
* Verify session state before redirecting user back to your app
##### query Parameters
| | |
| --- | --- |
| connect\_id
required | string
The connect ID that was generated via the Generate Connect ID endpoint |
| application\_id
required | string
The application ID provided by the RH team |
### Responses
**200**
Successfully retrieved session status
get/catpay/v1/external/session
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external/session
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external/session?connect\_id=19f0fce8-37da-4206-a43f-5925e9c4e1dc&application\_id='
### Response samples
* 200
Content type
application/json
Example
Order was placedConnect ID exists but no order yetConnect ID expired or not foundOrder was placed
Copy
`{ * "order_id": "550e8400-e29b-41d4-a716-446655440000", * "status": "submitted" }`
[](https://docs.robinhood.com/crypto/connect/#tag/On-Ramp-API/operation/get_external_application)
Get External Application
--------------------------------------------------------------------------------------------------------------------------
Retrieve details about a registered external application. Useful for verifying your application configuration or fetching application metadata like logos and redirect URLs.
##### path Parameters
| | |
| --- | --- |
| id
required | string
The application ID provided by the RH team |
### Responses
**200**
Successfully retrieved application details
get/catpay/v1/external\_application/{id}
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external\_application/{id}
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external\_application/'
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "application": { * "id": "550e8400-e29b-41d4-a716-446655440000", * "name": "Partner App", * "logos": { * "logos": [ * { * "url": "[https://partner.com/logo-small.png](https://partner.com/logo-small.png) ", * "size": "SMALL" }, * { * "url": "[https://partner.com/logo-large.png](https://partner.com/logo-large.png) ", * "size": "LARGE" } ] }, * "application_url": "[https://partner.com](https://partner.com/) ", * "redirect_urls": [ * "[https://partner.com/callback](https://partner.com/callback) ", * "myapp://callback" ] } }`
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API)
Off-Ramp API
============================================================================
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/connect_url_offramp)
Robinhood Connect URL for Off-Ramp
--------------------------------------------------------------------------------------------------------------------------------
This link will open the Robinhood Connect UI in the Robinhood app if it's already installed, or the Robinhood Connect Web UI if the user does not have the Robinhood app installed. Uses the same base URL as on-ramp ([https://applink.robinhood.com/u/connect](https://applink.robinhood.com/u/connect)
) but requires different query parameters.
##### query Parameters
| | |
| --- | --- |
| applicationId
required | string
Unique ID provided by Robinhood for your dApp |
| offRamp
required | boolean
Must be `true` to initiate the off-ramp flow |
| supportedNetworks
required | string
Comma-separated string with the blockchain network(s) the user intends to send the coin over. (e.g. ETHEREUM,POLYGON). Should use a single network, unless your wallet supports multiple blockchains |
| redirectUrl
required | string
URL to return to your dApp post Robinhood Connect. Must be registered with your `applicationId` |
| referenceId
required | string
UUID generated by your dApp for each off-ramp order. Used to redeem the corresponding deposit address. Must be unique for every order |
| assetCode | string
Set if the asset to be sold is predefined. (Refer to this for possible values) |
| fiatCode | string
Value: "USD"
Set if the fiat currency to be used is predefined. Only USD is accepted currently |
| assetAmount | string
Set if quantity is predefined in asset units. If set, `assetCode` must also be provided. Order quantity increments can be found in the Available Assets section below |
| fiatAmount | string
Set if quantity is predefined in fiat currency. Requires both `assetCode` and `fiatCode` to be set. Order quantity increments can be found in the Available Assets section below |
| lockAmount | boolean
Default: false
When set to true, prevents the user from modifying the amount specified in either fiatAmount or assetAmount. If lockAmount is true, either fiatAmount or assetAmount must be set. |
### Responses
**302**
Redirects to Robinhood Connect UI
get/u/connect?offramp=true
Robinhood Connect URL
https://applink.robinhood.com/u/connect?offramp=true
### Request samples
* DOGE
* USDC-POLYGON
* USDC-SOLANA
Copy
https://applink.robinhood.com/u/connect?offRamp\=true&applicationId\=&assetCode\=DOGE&supportedNetworks\=DOGECOIN&referenceId\=f2056f4c\-93c7\-422b\-bd59\-fbfb5b05b6ad&redirectUrl\=https%3A%2F%2Frobinhood.com
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/redirect_url)
Redirect URL
---------------------------------------------------------------------------------------------------
Upon user completion of Robinhood Connect off-ramp flow, the Robinhood app will redirect the user back to dApp being passed in from the `redirectURL` parameter with additional query parameters.
##### query Parameters
| | |
| --- | --- |
| assetCode
required | string
Asset selected for purchase by the user on Robinhood Connect |
| assetAmount
required | string
Asset quantity set by the user on Robinhood Connect |
| network
required | string
Network chosen for asset (e.g. BITCOIN, POLYGON) |
### Responses
**302**
Redirects to dApp
get/\[redirect-url\]
dApp Redirect URL
myapp://\[redirect-url\]
### Request samples
* URL
Copy
myapp://redirect\_url?assetCode\=ETH&assetAmount\=0.0654&network\=ETHEREUM
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/redeem_deposit_address)
Deposit Address Redemption
---------------------------------------------------------------------------------------------------------------------------
To mitigate the risk of phishing attempts, the dApp backend must call the following redemption endpoint to obtain the deposit address, using the associated `referenceId`. This endpoint must be accessed from an authenticated backend by the dApp.
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
Unique ID provided by Robinhood for your dApp |
##### Request Body schema: application/json
required
| | |
| --- | --- |
| referenceId
required | string
The same UUID that dApp generated when creating the off-ramp order |
### Responses
**200**
Successfully retrieved deposit address
post/catpay/v1/redeem\_deposit\_address/
Robinhood Connect API
https://api.robinhood.com/catpay/v1/redeem\_deposit\_address/
### Request samples
* Payload
* cURL
Content type
application/json
Copy
`{ * "referenceId": "f2056f4c-93c7-422b-bd59-fbfb5b05b6ad" }`
### Response samples
* 200
Content type
application/json
Copy
`{ * "address": "0x8d12A197cB00D4747a1fe03395095ce2A5BC6819", * "networkCode": "ETHEREUM", * "assetCode": "ETH", * "assetAmount": "0.05", * "fiatCode": "USD" }`
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/get_price_quote_offramp)
Price Quote
-------------------------------------------------------------------------------------------------------------
This API returns the cryptocurrency off-ramp price quote for Robinhood Connect.
##### path Parameters
| | |
| --- | --- |
| assetCode
required | string
The asset code for the quote |
##### query Parameters
| | |
| --- | --- |
| applicationId
required | string
To track the origin of the request |
| networkCode | string
If the user wants quote for a specific network |
| fiatCode | string
Default: "USD"
Fiat code for the quote. Defaults to USD if nothing is provided |
| fiatAmount | string
Amount in Fiat for the asset quote |
| cryptoAmount | string
Default: "1"
Amount in crypto for the asset quote. If both fiatAmount and cryptoAmount are specified, cryptoAmount will take precedence. Defaults to 1 if fiatAmount and cryptoAmount aren't provided |
| paymentMethod | string
Default: "buying\_power"
Enum: "crypto\_balance" "buying\_power" "debit\_card" "bank\_transfer"
When the parameter is included, the quote will calculate the processingFee associated with the paymentMethod. The default value is "buying\_power" |
### Responses
**200**
Successfully retrieved price quote
get/catpay/v1/{assetCode}/quote/off-ramp
Robinhood Connect API
https://api.robinhood.com/catpay/v1/{assetCode}/quote/off-ramp
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "assetCode": "ETH", * "applicationId": "74d09dd4-315f-4281-86c2-b65d2a72d88a", * "fiatCode": "USD", * "fiatAmount": "3285.09", * "cryptoAmount": "1.494751", * "price": "2197.75", * "processingFee": { * "type": "PRICE_ITEM_TYPE_CRYPTO_CURRENCY_PROCESSING_FEE", * "fiatAmount": "0", * "cryptoQuantity": "0" }, * "totalAmount": { * "type": "PRICE_ITEM_TYPE_TOTAL", * "fiatAmount": "3296.63", * "cryptoQuantity": "1.5" }, * "partnerFee": { * "type": "PRICE_ITEM_TYPE_PARTNER_FEE", * "fiatAmount": "0", * "cryptoQuantity": "0" }, * "paymentMethod": "buying_power", * "networkCode": "ETHEREUM" }`
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/get_order_details_offramp)
Order Details
-----------------------------------------------------------------------------------------------------------------
This request returns the transaction details once an order is complete. This request should be made from the backend following the user's order submission.
##### query Parameters
| | |
| --- | --- |
| referenceId
required | string
UUID generated by your dApp for each off-ramp order |
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
The applicationId provided by the RH team |
### Responses
**200**
Successfully retrieved order details
get/catpay/v1/external/order/
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external/order/
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external/order/?referenceId=123e4567-e89b-12d3-a456-426614174001' \\
\--header 'application-id: ' \\
\--header 'x-api-key: '
### Response samples
* 200
Content type
application/json
Copy
Expand all Collapse all
`{ * "applicationId": "string", * "connectId": "string", * "assetCode": "string", * "networkCode": "string", * "fiatCode": "string", * "fiatAmount": "string", * "cryptoAmount": "string", * "price": "string", * "processingFee": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "paymentMethod": "crypto_balance", * "totalAmount": { * "type": "string", * "fiatAmount": "string", * "cryptoQuantity": "string" }, * "blockchainTransactionId": "string", * "destinationAddress": "string", * "referenceID": "string", * "status": "ORDER_STATUS_IN_PROGRESS" }`
[](https://docs.robinhood.com/crypto/connect/#tag/Off-Ramp-API/operation/get_order_lifecycle)
Order Lifecycle (Lightweight Status)
----------------------------------------------------------------------------------------------------------------------------------
Returns a lightweight order status response, ideal for simple polling to check if an order completed. For full order details, use the Order Details endpoint instead.
**Best for:** Simple status polling to check if an order succeeded
**Returns:** Minimal fields: coin, network, quantity, blockchain transaction ID, and status
##### query Parameters
| | |
| --- | --- |
| reference\_id
required | string
The reference ID that was passed when creating the connect ID or off-ramp order |
##### header Parameters
| | |
| --- | --- |
| x-api-key
required | string
The API Key provided by the RH team |
| application-id
required | string
The application ID provided by the RH team |
### Responses
**200**
Successfully retrieved order lifecycle status
get/catpay/v1/external/order\_lifecycle
Robinhood Connect API
https://api.robinhood.com/catpay/v1/external/order\_lifecycle
### Request samples
* cURL
Copy
curl \-s \--request GET 'https://api.robinhood.com/catpay/v1/external/order\_lifecycle?reference\_id=your-order-123' \\
\--header 'application-id: ' \\
\--header 'x-api-key: '
### Response samples
* 200
Content type
application/json
Copy
`{ * "coin": "ETH", * "network": "ETHEREUM", * "quantity": "0.05", * "blockchainTxId": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", * "status": "ORDER_STATUS_SUCCEEDED" }`
---
# Robinhood

* Introduction
* Authentication
* Creating an API key
* Creating a key pair
* Headers and Signature
* Making your first API call
* Pagination
* Rate Limiting
* Error Responses
* V2 Endpoints (with Fee Tiers)
* Account
* getGet Accounts
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Trading Pairs
* getGet Holdings
* getGet Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
* V1 Endpoints (without Fee Tiers)
* Account
* getGet Crypto Trading Account Details
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Crypto Trading Pairs
* getGet Crypto Holdings
* getGet Crypto Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
[API docs by Redocly](https://redocly.com/redoc/)
Robinhood Crypto Trading API
============================
[](https://docs.robinhood.com/crypto/trading/#section/Introduction)
Introduction
================================================================================
Welcome to Robinhood Crypto Trading API documentation for traders and developers! The API lets you view crypto market data, access your account information, and place crypto orders programmatically.
To get started, head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. There are two versions of the Crypto Trading API, giving you the option to place crypto orders with fee tiers (v2) or without fee tiers (v1). All read-only API actions are available on both versions. For more information about API version differences, fee tiers, and answers to common questions, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-api)
. You can also view the [Fee Schedule](https://cdn.robinhood.com/assets/robinhood/legal/rhc-fee-schedule.pdf)
for the latest rates.
The Robinhood Crypto Trading API is available to customers in the United States only. Use of the Robinhood Crypto Trading API is subject to the [Robinhood Crypto Customer Agreement](https://cdn.robinhood.com/assets/robinhood/legal/Robinhood%20Crypto%20Customer%20Agreement.pdf)
as well as all other terms and disclosures made available on [Robinhood Crypto's about page](https://robinhood.com/us/en/about/crypto)
.
[](https://docs.robinhood.com/crypto/trading/#section/Authentication)
Authentication
====================================================================================
To get started with the Robinhood Crypto Trading API, you need to create a key, signature, and headers. Authenticated requests must include all three `x-api-key`, `x-signature`, and `x-timestamp` HTTP headers.
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/Creating-an-API-key)
Creating an API key
-------------------------------------------------------------------------------------------------------------
Head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. After creating credentials, you will receive the API key associated with the credential. You can modify, disable, and delete credentials you created at any time.
Your API key will be used as the `x-api-key` header you will need to pass during authentication when calling our API endpoints. Additionally, you will need the public key generated in the [Creating a key pair](https://docs.robinhood.com/crypto/trading/#section/Authentication/Creating-a-key-pair)
section to create your API credentials.
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/Creating-a-key-pair)
Creating a key pair
-------------------------------------------------------------------------------------------------------------
#### Below are example scripts on how to generate the public and private key pair. You'll need the public key for creating an API credential and the private key for authenticating requests. Remember to never share your private key with anyone. Robinhood will never ask you to share it with us.
We highly recommend saving your private and public keys in an encrypted format to ensure the highest level of security. Encrypting your keys will protect them from unauthorized access or theft. Avoid saving them in plain text or any easily accessible location. Instead, consider using strong encryption algorithms or tools specifically designed for key storage. Remember to choose a strong passphrase for encryption and store it separately from your keys. By taking these precautions, you can significantly reduce the risk of compromising your keys and safeguard your sensitive information.
### Python
Note that you'll need to have `pynacl` installed to run the Python script. You can install them with the following pip command in your terminal.
pip install pynacl
import nacl.signing
import base64
# Generate an Ed25519 keypair
private_key = nacl.signing.SigningKey.generate()
public_key = private_key.verify_key
# Convert keys to base64 strings
private_key_base64 = base64.b64encode(private_key.encode()).decode()
public_key_base64 = base64.b64encode(public_key.encode()).decode()
# Print the keys in base64 format
print("Private Key (Base64):")
print(private_key_base64)
print("Public Key (Base64):")
print(public_key_base64)
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/Headers-and-Signature)
Headers and Signature
-----------------------------------------------------------------------------------------------------------------
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/API%20Key)
API Key
---------------------------------------------------------------------------------------
The "`x-api-key`" header should contain your API key. This API key is obtained from your [crypto account settings](https://robinhood.com/account/crypto)
when enrolling in the Robinhood Crypto Trading API program.
\*_**API keys issued after August 13, 2024 will be formatted as "`rh-api-[uuid]`." Functionality will remain the same, and older keys will keep the original formatting (no "`rh-api`" prepend).**_
**Security Scheme Type:** API Key
**Header parameter name:** `x-api-key`
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/API%20Signature)
API Signature
---------------------------------------------------------------------------------------------------
Authenticated requests should be signed with the "`x-signature`" header, using a signature generated with the following: private key, API key, timestamp, path, method, and body. Here’s how the message signature should be defined:
message = f"{api_key}{current_timestamp}{path}{method}{body}"
\*_**Note that for requests without a body, the body can be omitted from the message signature.**_
### Example Signature
The following is an example of a signature that corresponds to a cancel order request. You may use the example values below to ensure your code implementation is generating the same (`x-signature`) header signature value. The code snippet is for generating the signature in Python.
| Field | Value |
| --- | --- |
| Private Key | xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU= |
| Public Key | jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk= |
| API Key | rh-api-6148effc-c0b1-486c-8940-a1d099456be6 |
| Method | POST |
| Path | /api/v1/crypto/trading/orders/ |
| Body | {"client\_order\_id":"131de903-5a9c-4260-abc1-28d562a5dcf0","side":"buy","type":"market","symbol":"BTC-USD","market\_order\_config":{"asset\_quantity":"0.1"}} |
| Timestamp | 1698708981 |
| **API Signature Header** | **q/nEtxp/P2Or3hph3KejBqnw5o9qeuQ+hYRnB56FaHbjDsNUY9KhB1asMxohDnzdVFSD7StaTqjSd9U9HvaRAw==** |
### Code Example
#### Python
import nacl.signing
import base64
import time
# Replace these with your base64-encoded keys
private_key_base64 = "xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU="
public_key_base64 = "jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk="
api_key = "rh-api-6148effc-c0b1-486c-8940-a1d099456be6"
# Get the current Unix timestamp in seconds
# You can get the current_timestamp with the following code:
# current_timestamp = int(time.time())
# This value is hardcoded for demonstration purposes to match the example in the documentation
current_timestamp = "1698708981"
path = f"/api/v1/crypto/trading/orders/"
method = "POST"
body = {
"client_order_id": "131de903-5a9c-4260-abc1-28d562a5dcf0",
"side": "buy",
"symbol": "BTC-USD",
"type": "market",
"market_order_config": {
"asset_quantity": "0.1"
},
}
# Convert base64 strings to seed (for private key) and bytes (for public key)
private_key_seed = base64.b64decode(private_key_base64)
public_key_bytes = base64.b64decode(public_key_base64)
# Create private key (from seed) and public key (from bytes)
private_key = nacl.signing.SigningKey(private_key_seed)
public_key = nacl.signing.VerifyKey(public_key_bytes)
# Create the message to sign
message = f"{api_key}{current_timestamp}{path}{method}{body}"
# Sign the message
signed = private_key.sign(message.encode("utf-8"))
base64_signature = base64.b64encode(signed.signature).decode("utf-8")
print(base64_signature)
# Verify the signature
public_key.verify(signed.message, signed.signature)
**Security Scheme Type:** API Key
**Header parameter name:** `x-signature`
[](https://docs.robinhood.com/crypto/trading/#section/Authentication/Timestamp)
Timestamp
-----------------------------------------------------------------------------------------
The "`x-timestamp`" header should contain the timestamp of the request.
**To protect the security and integrity of your API interactions, timestamps are only valid for 30 seconds after they’re generated, and an expired timestamp will be rejected. Therefore, ensure that your requests are made promptly after generating the timestamp.**
Below is an example in Python on how to generate the timestamp.
import time
current_timestamp = int(time.time())
print(current_timestamp)
**Security Scheme Type:** API Key
**Header parameter name:** `x-timestamp`
[](https://docs.robinhood.com/crypto/trading/#section/Making-your-first-API-call)
Making your first API call
============================================================================================================
Developing your own application to place trades with your Robinhood account is quick and simple. Once you've finished [authentication](https://docs.robinhood.com/crypto/trading/#section/Authentication)
, start here with the code you'll need to access the API and make supported API calls. These are essentially the building blocks of code for each API call, which you can easily build on based on your preferred strategies.
1. Create a script file
mkdir robinhood-api-trading && cd robinhood-api-trading
touch robinhood_api_trading.py
touch robinhood_api_trading_v2.py
2. Install PyNaCl library
pip install pynacl
3. To use v1 endpoints, copy the script below into the newly created `robinhood_api_trading.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITrading:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(key: str, *args: Optional[str]) -> str:
if not args:
return ""
params = []
for arg in args:
params.append(f"{key}={arg}")
return "?" + "&".join(params)
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body), timeout=10)
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_account(self) -> Any:
path = "/api/v1/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/trading/trading_pairs/{query_params}"
return self.make_api_request("GET", path)
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, *asset_codes: Optional[str]) -> Any:
query_params = self.get_query_params("asset_code", *asset_codes)
path = f"/api/v1/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# the best bid and ask for all supported symbols will be returned
def get_best_bid_ask(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
path = f"/api/v1/crypto/marketdata/estimated_price/?symbol={symbol}&side={side}&quantity={quantity}"
return self.make_api_request("GET", path)
def place_order(
self,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/"
return self.make_api_request("GET", path)
def get_orders(self) -> Any:
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITrading()
print(api_trading_client.get_account())
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.0001"}
)
"""
if __name__ == "__main__":
main()
4. To use v2 endpoints, copy the script below into the newly created `robinhood_api_trading_v2.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITradingV2:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(params_dict: Dict[str, Any]) -> str:
"""
Build query parameter string from a dictionary.
- Single values: {"key1": "value1", "key2": "value2"}
- Multiple values for same key: {"symbol": ["BTC-USD", "ETH-USD"]}
"""
if not params_dict:
return ""
params = []
for key, value in params_dict.items():
if value is None:
continue
if isinstance(value, list):
# Handle multiple values for the same key
for v in value:
params.append(f"{key}={v}")
else:
params.append(f"{key}={value}")
return "?" + "&".join(params) if params else ""
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body) if body else None, timeout=10)
# Check for non-success status codes
if response.status_code >= 400:
print(f"HTTP Error {response.status_code}: {response.reason}")
try:
return response.json()
except json.JSONDecodeError:
return {"error": response.text or response.reason, "status_code": response.status_code}
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_accounts(self) -> Any:
path = "/api/v2/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> list:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/trading_pairs/{query_params}"
all_results = []
response = self.make_api_request("GET", path)
while response:
results = response.get("results", [])
all_results.extend(results)
next_url = response.get("next")
if not next_url:
break
next_path = next_url.replace(self.base_url, "")
response = self.make_api_request("GET", next_path)
return all_results
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, account_number: str, *asset_codes: Optional[str]) -> Any:
params = {"account_number": account_number}
if asset_codes:
params["asset_code"] = list(asset_codes)
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD".
def get_best_bid_ask(self, *symbols: str) -> Any:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
params = {"symbol": symbol, "side": side, "quantity": quantity}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/estimated_price/{query_params}"
return self.make_api_request("GET", path)
def place_order(
self,
account_number: str,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v2/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, account_number: str, order_id: str) -> Any:
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{order_id}/{query_params}"
return self.make_api_request("GET", path)
def get_orders(self, account_number: str) -> Any:
params = {
"account_number": account_number,
"created_at_start": "2023-01-01T20:57:50Z"
}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITradingV2()
print(api_trading_client.get_trading_pairs())
# print(api_trading_client.get_trading_pairs("BTC-USD", "ETH-USD"))
# print(api_trading_client.get_best_bid_ask("BTC-USD")) #"BTC-USD", "ETH-USD"
# print(api_trading_client.get_estimated_price(symbol="BTC-USD", side="both", quantity="0.01"))
# accounts = api_trading_client.get_accounts()
# print(accounts)
# account_number = accounts["results"][0]["account_number"]
# print(f"account_number: {account_number}")
# print(api_trading_client.get_orders(account_number))
# print(api_trading_client.get_holdings(account_number))
# print(api_trading_client.get_holdings(account_number, "BTC", "ETH"))
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
account_number,
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.000001"}
)
"""
if __name__ == "__main__":
main()
5. Run your script from the command line
# to run the Python script using the v1 API endpoints:
python robinhood_api_trading.py
# to run the Python script using the v2 API endpoints:
python robinhood_api_trading_v2.py
[](https://docs.robinhood.com/crypto/trading/#section/Pagination)
Pagination
============================================================================
Endpoints that return a list of results allow you to paginate to have more control over how many and which results to display.
### Pagination Parameters
| Parameter | Description |
| --- | --- |
| cursor | The cursor is a unique identifier for each page in a list of results. The cursor is used to paginate through the pages of results. |
| limit | The limit is the number of items to return in a single page. Some of our endpoints support this query parameter. You can view support by checking the query parameters in the documentation of each endpoint. |
### Pagination Response
| Field | Description |
| --- | --- |
| next | The API request endpoint that includes the next cursor query parameter to use for pagination. |
| previous | The API request endpoint that includes the previous cursor query parameter to use for pagination. |
| results | The list of response items for the current cursor. |
[](https://docs.robinhood.com/crypto/trading/#section/Rate-Limiting)
Rate Limiting
==================================================================================
### Rate Limits
* Requests per minute per user account: 100
* Requests per minute per user account in bursts: 300
Rate limiting is applied using a token bucket implementation. The burst size or `capacity` is the number of tokens you can use to call an endpoint. This capacity is initialized at the maximum capacity and will be refilled using a `refill amount` at a timed interval called `refill interval` until the max capacity is once again reached.
### Rate Limiting Terms
| Term | Description |
| --- | --- |
| Max capacity | The maximum amount of tokens allowed. Will no longer continue refilling if this amount is reached. |
| Remaining amount | The number of tokens remaining that can be consumed to call an endpoint. |
| Refill amount | The number of tokens that are refilled at each refill interval. |
| Refill interval | The timed interval at which the tokens are refilled. |
The actual values of the configuration will fluctuate depending on the availability of our service and our current expected volume at the time of service. Rate limits are applied per endpoint and may differ among each endpoint depending on their expected use case.
#### Example rate limiting configuration:
| Term | Value |
| --- | --- |
| Max capacity | 5 |
| Remaining amount | 2 |
| Refill amount | 1 |
| Refill interval | 1 second |
| Action | Time (in seconds) | Remaining amount | Description |
| --- | --- | --- | --- |
| Initialize | 0 | 5 | Initial state of the token bucket. |
| Endpoint call 1 | 0.5 | 4 | One token consumed for calling endpoint 1. |
| Endpoint call 2 | 0.7 | 3 | One token consumed for calling endpoint 2. |
| Refill | 1 | 4 | One token refilled at refill interval. |
| Refill | 2 | 5 | One token refilled at refill interval. |
| No refill | 3 | 5 | No refill since max capacity has been reached and no endpoints were called. |
| Endpoint call 3 | 3.5 | 4 | One token consumed for calling endpoint 3. |
[](https://docs.robinhood.com/crypto/trading/#section/Error-Responses)
Error Responses
======================================================================================
### Error response format
#### Type
The `type` field in the error response will be mapped to the following:
| Error type | Status codes |
| --- | --- |
| validation\_error | 400 |
| client\_error | 4XX, excluding 400 |
| server\_error | 5XX |
#### Errors
The `errors` field will contain a list of error details, each item will contain a nested `attr` and `detail` field.
| Field | Description |
| --- | --- |
| attr | Error types of `validation_error` will specify the field name or `non_field_errors` if the error cannot be attributed to a field. Will be `null` for error types of either `client_error` and `server_error`. |
| detail | Will contain a human readable string describing the error. |
### Example Error Response
Here's a sample error response where the `client_order_id` field in the payload was a value that was not expected when calling the _**Add Crypto Order**_ endpoint. The `detail` field for each error in the `errors` list will help understand why the `validation_error` was thrown. The `attr` field will indicate which field name in the request body or query parameter the error was thrown for if applicable.
{
"type": "validation_error"
"errors": [\
{\
"detail": "Must be a valid UUID.",\
"attr": "client_order_id"\
}\
]
}
### Common Error Status Codes
| Status Code | Error |
| --- | --- |
| 400 | Bad request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not found |
| 405 | Method not allowed |
| 406 | Not acceptable |
| 415 | Unsupported media type |
| 429 | Too many requests |
| 500 | Internal server error |
| 503 | Service unavailable |
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Account)
Account
=====================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Account/operation/api_v2_crypto_trading_accounts)
Get Accounts
-------------------------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto trading accounts for the authenticated user. Returns account details including buying power, status, and fee tier information.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of accounts to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/accounts/
https://trading.robinhood.com/api/v2/crypto/trading/accounts/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string", * "account_type": "string", * "is_api_tradable": true, * "fee_tier_status": { * "fee_ratio": 0.1, * "thirty_day_volume": 0.1, * "next_fee_tier_ratio": 0.1, * "next_fee_tier_threshold": 0.1 } } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Market-Data)
Market Data
=============================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_best_bid_ask)
Get Best Price
--------------------------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner exchanges. This price does not take into account the order size or fee, and may not be the final execution price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted.
For example, `?symbol=BTC-USD&symbol=ETH-USD` |
### Responses
**200**
**400**
**403**
get/api/v2/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v2/crypto/marketdata/best\_bid\_ask/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "bid": 0.1, * "ask": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_estimated_price)
Get Estimated Price
----------------------------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, asset quantity, and fee. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our partner exchanges provide for an order, excluding the fee.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example `BTC-USD`. Ensure that the symbol is provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side: `bid`, `ask`, or `both`. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be smaller than `max_order_size` as defined in our Get Crypto Trading Pairs endpoint. Multiple quantities can be comma-separated. A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/estimated\_price/
https://trading.robinhood.com/api/v2/crypto/trading/estimated\_price/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "quantity": 0.1, * "timestamp": "2019-08-24T14:15:22Z", * "bid": 0.1, * "ask": 0.1, * "fee_ratio": 0.1, * "est_fee": 0.1, * "est_total_cost": 0.1, * "est_total_credit": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading)
Trading
=====================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading/operation/api_v2_crypto_trading_trading_pairs)
Get Trading Pairs
-----------------------------------------------------------------------------------------------------------------------------
Fetch a paginated list of available trading pairs for crypto trading. Returns trading pair details including price increments, order size limits, and tradability status. Trading pairs can be filtered by symbol.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
Optional. Filter by trading pair symbol(s). Example: `symbol=BTC-USD`. Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, `?symbol=BTC-USD&symbol=ETH-USD`.
If the "symbol" parameter is not provided, this endpoint will return all tradable currency pairs. |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**401**
**403**
**404**
get/api/v2/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v2/crypto/trading/trading\_pairs/
### Response samples
* 200
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "symbol": "string", * "asset_code": "string", * "quote_code": "string", * "asset_increment": "string", * "quote_increment": "string", * "max_order_size": "string", * "min_order_amount": "string", * "status": "string", * "is_api_tradable": true } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading/operation/api_v2_crypto_trading_holdings)
Get Holdings
-------------------------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto holdings for a specific account. Returns the total quantity and available quantity for each asset held in the account. The `account_number` query parameter is required.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
**Required.** The account number to retrieve holdings for. This parameter must be provided. |
| asset\_code | string
Example: asset\_code=BTC
Optional. Filter holdings by specific asset code (e.g., "BTC"). |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/holdings/
https://trading.robinhood.com/api/v2/crypto/trading/holdings/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": "string", * "quantity_available_for_trading": "string" } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_get)
Get Orders
-------------------------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user in a specific account.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to retrieve orders from. |
| cursor | string
Optional cursor for pagination. |
| created\_at\_start | string
Filter orders created on or after this timestamp (ISO 8601 format). |
| created\_at\_end | string
Filter orders created on or before this timestamp (ISO 8601 format). |
| updated\_at\_start | string
Filter orders updated on or after this timestamp (ISO 8601 format). |
| updated\_at\_end | string
Filter orders updated on or before this timestamp (ISO 8601 format). |
| symbol | string
Filter orders by trading pair symbol. |
| side | string
Enum: "buy" "sell"
Filter orders by side. |
| type | string
Enum: "market" "limit" "stop\_loss" "stop\_limit"
Filter orders by type. |
| state | string
Enum: "open" "canceled" "filled" "failed" "pending"
Filter orders by state. |
### Responses
**200**
**400**
**401**
**403**
**404**
get/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Response samples
* 200
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_post)
Place New Crypto Order
--------------------------------------------------------------------------------------------------------------------------------
Place a new crypto trading order with an order type. This endpoint only supports placing orders on USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint.
**Note:** Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to place orders from. |
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
**401**
**403**
**404**
post/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Request samples
* Payload
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "time_in_force": "gtc" }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/crypto/trading/#tag/V2-Trading/operation/api_v2_crypto_trading_cancel_order)
Cancel Open Crypto Order
-----------------------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
The ID of the order to cancel. |
### Responses
**200**
**400**
**403**
post/api/v2/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v2/crypto/trading/orders/{id}/cancel/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/crypto/trading/#tag/Account)
Account
==================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/Account/operation/api_v1_crypto_trading_account_Details)
Get Crypto Trading Account Details
---------------------------------------------------------------------------------------------------------------------------------------------
Fetches the Robinhood Crypto account details for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
### Responses
**200**
get/api/v1/crypto/trading/accounts/
https://trading.robinhood.com/api/v1/crypto/trading/accounts/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/accounts/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
Content type
application/json
Copy
`{ * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string" }`
[](https://docs.robinhood.com/crypto/trading/#tag/Market-Data)
Market Data
==========================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/Market-Data/operation/api_v1_crypto_marketdata_best_bid_ask)
Get Best Price
-----------------------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner market makers. This price does not take into account the order size, and may not be the final execution price.
The bid and ask prices include a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
Note that in the v2 endpoint, **Place crypto orders with fee tiers**, partner exchanges provide prices instead of market makers, with orders routed accordingly. For more information on routing, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-order-routing/)
.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "price": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/Market-Data/operation/api_v1_crypto_marketdata_estimated_price)
Get Estimated Price
-------------------------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, and asset quantity. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. To estimate the cost for a Buy order, request an Ask quote. If you are preparing to place a Sell order, request a Bid quote. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our market makers provide for an order, inclusive of a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example BTC-USD. Ensure that the symbol is provided in all uppercase.
Only USD symbols are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side. e.g. bid, ask, or both. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be between `min_order_size` and `max_order_size` as defined in our `Get Crypto Trading Pairs` endpoint.
A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/estimated\_price/
https://trading.robinhood.com/api/v1/crypto/marketdata/estimated\_price/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/marketdata/api/v1/estimated\_price/?symbol=BTC-USD&side=ask&quantity=0.1,1,1.999" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "price": 0.1, * "quantity": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/Trading)
Trading
==================================================================
[](https://docs.robinhood.com/crypto/trading/#tag/Trading/operation/api_v1_crypto_trading_trading_pairs)
Get Crypto Trading Pairs
---------------------------------------------------------------------------------------------------------------------------------
Fetch a list of trading pairs.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "asset_code": "string", * "quote_code": "string", * "quote_increment": "string", * "asset_increment": "string", * "max_order_size": "string", * "min_order_size": "string", * "status": "tradable", * "symbol": "string" } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/Trading/operation/api_v1_crypto_trading_holdings)
Get Crypto Holdings
-----------------------------------------------------------------------------------------------------------------------
Fetch a list of holdings for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| asset\_code | string
Example: asset\_code=BTC
The asset code(s) to retrieve data for.
Multiple asset codes can be provided by using the "asset\_code" parameter with different values. Ensure that the asset codes are provided in all uppercase.
For example, **?asset\_code=BTC&asset\_code=ETH** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/holdings/
https://trading.robinhood.com/api/v1/crypto/trading/holdings/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/holdings/?asset\_code=BTC" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": 0.1, * "quantity_available_for_trading": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/Trading/operation/api_v1_crypto_trading_orders)
Get Crypto Orders
-------------------------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| created\_at\_start | string
Example: created\_at\_start=2023-10-31T20:57:50Z
Filter by created at start time range (greater than or equal to) in ISO 8601 format |
| created\_at\_end | string
Example: created\_at\_end=2023-10-31T20:57:50Z
Filter by created at end time range (less than or equal to) in ISO 8601 format |
| symbol | string
Example: symbol=BTC-USD
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| id | string
Order ID, unique per order |
| side | string
Enum: "buy" "sell"
Buy or sell |
| state | string
Enum: "open" "canceled" "partially\_filled" "filled" "failed"
State of the order |
| type | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| updated\_at\_start | string
Example: updated\_at\_start=2023-10-31T20:57:50Z
Filter by updated at start time range (greater than or equal to) in ISO 8601 format |
| updated\_at\_end | string
Example: updated\_at\_end=2023-10-31T20:57:50Z
Filter by updated at end time range (less than or equal to) in ISO 8601 format |
| cursor | string |
| limit | integer
Limit the number of results per page size |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/orders/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } } ] }`
[](https://docs.robinhood.com/crypto/trading/#tag/Trading/operation/api_v1_post_crypto_trading_order)
Place New Crypto Order
----------------------------------------------------------------------------------------------------------------------------
Places a new crypto trading order with an order type.
**Note**: Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
post/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* Payload
* cURL
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
[](https://docs.robinhood.com/crypto/trading/#tag/Trading/operation/api_v1_post_crypto_trading_cancel_order)
Cancel Open Crypto Order
-------------------------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
Order ID, unique per order |
### Responses
**200**
**400**
**404**
post/api/v1/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/
### Request samples
* cURL
Copy
curl \-X "POST" "https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
text/plain
Copy
Cancel request was submitted for order {id}
---
# Robinhood

* Introduction
* Authentication
* Creating an API key
* Creating a key pair
* Headers and Signature
* Making your first API call
* Pagination
* Rate Limiting
* Error Responses
* V2 Endpoints (with Fee Tiers)
* Account
* getGet Accounts
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Trading Pairs
* getGet Holdings
* getGet Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
* V1 Endpoints (without Fee Tiers)
* Account
* getGet Crypto Trading Account Details
* Market Data
* getGet Best Price
* getGet Estimated Price
* Trading
* getGet Crypto Trading Pairs
* getGet Crypto Holdings
* getGet Crypto Orders
* postPlace New Crypto Order
* postCancel Open Crypto Order
[API docs by Redocly](https://redocly.com/redoc/)
Robinhood Crypto Trading API
============================
[](https://docs.robinhood.com/crypto/#section/Introduction)
Introduction
========================================================================
Welcome to Robinhood Crypto Trading API documentation for traders and developers! The API lets you view crypto market data, access your account information, and place crypto orders programmatically.
To get started, head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. There are two versions of the Crypto Trading API, giving you the option to place crypto orders with fee tiers (v2) or without fee tiers (v1). All read-only API actions are available on both versions. For more information about API version differences, fee tiers, and answers to common questions, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-api)
. You can also view the [Fee Schedule](https://cdn.robinhood.com/assets/robinhood/legal/rhc-fee-schedule.pdf)
for the latest rates.
The Robinhood Crypto Trading API is available to customers in the United States only. Use of the Robinhood Crypto Trading API is subject to the [Robinhood Crypto Customer Agreement](https://cdn.robinhood.com/assets/robinhood/legal/Robinhood%20Crypto%20Customer%20Agreement.pdf)
as well as all other terms and disclosures made available on [Robinhood Crypto's about page](https://robinhood.com/us/en/about/crypto)
.
[](https://docs.robinhood.com/crypto/#section/Authentication)
Authentication
============================================================================
To get started with the Robinhood Crypto Trading API, you need to create a key, signature, and headers. Authenticated requests must include all three `x-api-key`, `x-signature`, and `x-timestamp` HTTP headers.
[](https://docs.robinhood.com/crypto/#section/Authentication/Creating-an-API-key)
Creating an API key
-----------------------------------------------------------------------------------------------------
Head to your [crypto account settings](https://robinhood.com/account/crypto)
on web classic to create credentials. After creating credentials, you will receive the API key associated with the credential. You can modify, disable, and delete credentials you created at any time.
Your API key will be used as the `x-api-key` header you will need to pass during authentication when calling our API endpoints. Additionally, you will need the public key generated in the [Creating a key pair](https://docs.robinhood.com/crypto/#section/Authentication/Creating-a-key-pair)
section to create your API credentials.
[](https://docs.robinhood.com/crypto/#section/Authentication/Creating-a-key-pair)
Creating a key pair
-----------------------------------------------------------------------------------------------------
#### Below are example scripts on how to generate the public and private key pair. You'll need the public key for creating an API credential and the private key for authenticating requests. Remember to never share your private key with anyone. Robinhood will never ask you to share it with us.
We highly recommend saving your private and public keys in an encrypted format to ensure the highest level of security. Encrypting your keys will protect them from unauthorized access or theft. Avoid saving them in plain text or any easily accessible location. Instead, consider using strong encryption algorithms or tools specifically designed for key storage. Remember to choose a strong passphrase for encryption and store it separately from your keys. By taking these precautions, you can significantly reduce the risk of compromising your keys and safeguard your sensitive information.
### Python
Note that you'll need to have `pynacl` installed to run the Python script. You can install them with the following pip command in your terminal.
pip install pynacl
import nacl.signing
import base64
# Generate an Ed25519 keypair
private_key = nacl.signing.SigningKey.generate()
public_key = private_key.verify_key
# Convert keys to base64 strings
private_key_base64 = base64.b64encode(private_key.encode()).decode()
public_key_base64 = base64.b64encode(public_key.encode()).decode()
# Print the keys in base64 format
print("Private Key (Base64):")
print(private_key_base64)
print("Public Key (Base64):")
print(public_key_base64)
[](https://docs.robinhood.com/crypto/#section/Authentication/Headers-and-Signature)
Headers and Signature
---------------------------------------------------------------------------------------------------------
[](https://docs.robinhood.com/crypto/#section/Authentication/API%20Key)
API Key
-------------------------------------------------------------------------------
The "`x-api-key`" header should contain your API key. This API key is obtained from your [crypto account settings](https://robinhood.com/account/crypto)
when enrolling in the Robinhood Crypto Trading API program.
\*_**API keys issued after August 13, 2024 will be formatted as "`rh-api-[uuid]`." Functionality will remain the same, and older keys will keep the original formatting (no "`rh-api`" prepend).**_
**Security Scheme Type:** API Key
**Header parameter name:** `x-api-key`
[](https://docs.robinhood.com/crypto/#section/Authentication/API%20Signature)
API Signature
-------------------------------------------------------------------------------------------
Authenticated requests should be signed with the "`x-signature`" header, using a signature generated with the following: private key, API key, timestamp, path, method, and body. Here’s how the message signature should be defined:
message = f"{api_key}{current_timestamp}{path}{method}{body}"
\*_**Note that for requests without a body, the body can be omitted from the message signature.**_
### Example Signature
The following is an example of a signature that corresponds to a cancel order request. You may use the example values below to ensure your code implementation is generating the same (`x-signature`) header signature value. The code snippet is for generating the signature in Python.
| Field | Value |
| --- | --- |
| Private Key | xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU= |
| Public Key | jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk= |
| API Key | rh-api-6148effc-c0b1-486c-8940-a1d099456be6 |
| Method | POST |
| Path | /api/v1/crypto/trading/orders/ |
| Body | {"client\_order\_id":"131de903-5a9c-4260-abc1-28d562a5dcf0","side":"buy","type":"market","symbol":"BTC-USD","market\_order\_config":{"asset\_quantity":"0.1"}} |
| Timestamp | 1698708981 |
| **API Signature Header** | **q/nEtxp/P2Or3hph3KejBqnw5o9qeuQ+hYRnB56FaHbjDsNUY9KhB1asMxohDnzdVFSD7StaTqjSd9U9HvaRAw==** |
### Code Example
#### Python
import nacl.signing
import base64
import time
# Replace these with your base64-encoded keys
private_key_base64 = "xQnTJVeQLmw1/Mg2YimEViSpw/SdJcgNXZ5kQkAXNPU="
public_key_base64 = "jPItx4TLjcnSUnmnXQQyAKL4eJj3+oWNNMmmm2vATqk="
api_key = "rh-api-6148effc-c0b1-486c-8940-a1d099456be6"
# Get the current Unix timestamp in seconds
# You can get the current_timestamp with the following code:
# current_timestamp = int(time.time())
# This value is hardcoded for demonstration purposes to match the example in the documentation
current_timestamp = "1698708981"
path = f"/api/v1/crypto/trading/orders/"
method = "POST"
body = {
"client_order_id": "131de903-5a9c-4260-abc1-28d562a5dcf0",
"side": "buy",
"symbol": "BTC-USD",
"type": "market",
"market_order_config": {
"asset_quantity": "0.1"
},
}
# Convert base64 strings to seed (for private key) and bytes (for public key)
private_key_seed = base64.b64decode(private_key_base64)
public_key_bytes = base64.b64decode(public_key_base64)
# Create private key (from seed) and public key (from bytes)
private_key = nacl.signing.SigningKey(private_key_seed)
public_key = nacl.signing.VerifyKey(public_key_bytes)
# Create the message to sign
message = f"{api_key}{current_timestamp}{path}{method}{body}"
# Sign the message
signed = private_key.sign(message.encode("utf-8"))
base64_signature = base64.b64encode(signed.signature).decode("utf-8")
print(base64_signature)
# Verify the signature
public_key.verify(signed.message, signed.signature)
**Security Scheme Type:** API Key
**Header parameter name:** `x-signature`
[](https://docs.robinhood.com/crypto/#section/Authentication/Timestamp)
Timestamp
---------------------------------------------------------------------------------
The "`x-timestamp`" header should contain the timestamp of the request.
**To protect the security and integrity of your API interactions, timestamps are only valid for 30 seconds after they’re generated, and an expired timestamp will be rejected. Therefore, ensure that your requests are made promptly after generating the timestamp.**
Below is an example in Python on how to generate the timestamp.
import time
current_timestamp = int(time.time())
print(current_timestamp)
**Security Scheme Type:** API Key
**Header parameter name:** `x-timestamp`
[](https://docs.robinhood.com/crypto/#section/Making-your-first-API-call)
Making your first API call
====================================================================================================
Developing your own application to place trades with your Robinhood account is quick and simple. Once you've finished [authentication](https://docs.robinhood.com/crypto/trading/#section/Authentication)
, start here with the code you'll need to access the API and make supported API calls. These are essentially the building blocks of code for each API call, which you can easily build on based on your preferred strategies.
1. Create a script file
mkdir robinhood-api-trading && cd robinhood-api-trading
touch robinhood_api_trading.py
touch robinhood_api_trading_v2.py
2. Install PyNaCl library
pip install pynacl
3. To use v1 endpoints, copy the script below into the newly created `robinhood_api_trading.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITrading:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(key: str, *args: Optional[str]) -> str:
if not args:
return ""
params = []
for arg in args:
params.append(f"{key}={arg}")
return "?" + "&".join(params)
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body), timeout=10)
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_account(self) -> Any:
path = "/api/v1/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/trading/trading_pairs/{query_params}"
return self.make_api_request("GET", path)
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, *asset_codes: Optional[str]) -> Any:
query_params = self.get_query_params("asset_code", *asset_codes)
path = f"/api/v1/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# the best bid and ask for all supported symbols will be returned
def get_best_bid_ask(self, *symbols: Optional[str]) -> Any:
query_params = self.get_query_params("symbol", *symbols)
path = f"/api/v1/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
path = f"/api/v1/crypto/marketdata/estimated_price/?symbol={symbol}&side={side}&quantity={quantity}"
return self.make_api_request("GET", path)
def place_order(
self,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, order_id: str) -> Any:
path = f"/api/v1/crypto/trading/orders/{order_id}/"
return self.make_api_request("GET", path)
def get_orders(self) -> Any:
path = "/api/v1/crypto/trading/orders/"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITrading()
print(api_trading_client.get_account())
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.0001"}
)
"""
if __name__ == "__main__":
main()
4. To use v2 endpoints, copy the script below into the newly created `robinhood_api_trading_v2.py` file. Make sure to add your API key and secret key into the `API_KEY` and `BASE64_PRIVATE_KEY` variables.
import base64
import datetime
import json
from typing import Any, Dict, Optional
import uuid
import requests
from nacl.signing import SigningKey
API_KEY = "ADD YOUR API KEY HERE"
BASE64_PRIVATE_KEY = "ADD YOUR PRIVATE KEY HERE"
class CryptoAPITradingV2:
def __init__(self):
self.api_key = API_KEY
private_key_seed = base64.b64decode(BASE64_PRIVATE_KEY)
self.private_key = SigningKey(private_key_seed)
self.base_url = "https://trading.robinhood.com"
@staticmethod
def _get_current_timestamp() -> int:
return int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
@staticmethod
def get_query_params(params_dict: Dict[str, Any]) -> str:
"""
Build query parameter string from a dictionary.
- Single values: {"key1": "value1", "key2": "value2"}
- Multiple values for same key: {"symbol": ["BTC-USD", "ETH-USD"]}
"""
if not params_dict:
return ""
params = []
for key, value in params_dict.items():
if value is None:
continue
if isinstance(value, list):
# Handle multiple values for the same key
for v in value:
params.append(f"{key}={v}")
else:
params.append(f"{key}={value}")
return "?" + "&".join(params) if params else ""
def make_api_request(self, method: str, path: str, body: str = "") -> Any:
timestamp = self._get_current_timestamp()
headers = self.get_authorization_header(method, path, body, timestamp)
url = self.base_url + path
try:
response = {}
if method == "GET":
response = requests.get(url, headers=headers, timeout=10)
elif method == "POST":
response = requests.post(url, headers=headers, json=json.loads(body) if body else None, timeout=10)
# Check for non-success status codes
if response.status_code >= 400:
print(f"HTTP Error {response.status_code}: {response.reason}")
try:
return response.json()
except json.JSONDecodeError:
return {"error": response.text or response.reason, "status_code": response.status_code}
return response.json()
except requests.RequestException as e:
print(f"Error making API request: {e}")
return None
def get_authorization_header(
self, method: str, path: str, body: str, timestamp: int
) -> Dict[str, str]:
message_to_sign = f"{self.api_key}{timestamp}{path}{method}{body}"
signed = self.private_key.sign(message_to_sign.encode("utf-8"))
return {
"x-api-key": self.api_key,
"x-signature": base64.b64encode(signed.signature).decode("utf-8"),
"x-timestamp": str(timestamp),
}
def get_accounts(self) -> Any:
path = "/api/v2/crypto/trading/accounts/"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD". If no symbols are provided,
# all supported symbols will be returned
def get_trading_pairs(self, *symbols: Optional[str]) -> list:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/trading_pairs/{query_params}"
all_results = []
response = self.make_api_request("GET", path)
while response:
results = response.get("results", [])
all_results.extend(results)
next_url = response.get("next")
if not next_url:
break
next_path = next_url.replace(self.base_url, "")
response = self.make_api_request("GET", next_path)
return all_results
# The asset_codes argument must be formatted as the short form name for a crypto, e.g "BTC", "ETH". If no asset
# codes are provided, all crypto holdings will be returned
def get_holdings(self, account_number: str, *asset_codes: Optional[str]) -> Any:
params = {"account_number": account_number}
if asset_codes:
params["asset_code"] = list(asset_codes)
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/holdings/{query_params}"
return self.make_api_request("GET", path)
# The symbols argument must be formatted in trading pairs, e.g "BTC-USD", "ETH-USD".
def get_best_bid_ask(self, *symbols: str) -> Any:
params = {"symbol": list(symbols)} if symbols else {}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/marketdata/best_bid_ask/{query_params}"
return self.make_api_request("GET", path)
# The symbol argument must be formatted in a trading pair, e.g "BTC-USD", "ETH-USD"
# The side argument must be "bid", "ask", or "both".
# Multiple quantities can be specified in the quantity argument, e.g. "0.1,1,1.999".
def get_estimated_price(self, symbol: str, side: str, quantity: str) -> Any:
params = {"symbol": symbol, "side": side, "quantity": quantity}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/estimated_price/{query_params}"
return self.make_api_request("GET", path)
def place_order(
self,
account_number: str,
client_order_id: str,
side: str,
order_type: str,
symbol: str,
order_config: Dict[str, str],
) -> Any:
body = {
"client_order_id": client_order_id,
"side": side,
"type": order_type,
"symbol": symbol,
f"{order_type}_order_config": order_config,
}
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("POST", path, json.dumps(body))
def cancel_order(self, order_id: str) -> Any:
path = f"/api/v2/crypto/trading/orders/{order_id}/cancel/"
return self.make_api_request("POST", path)
def get_order(self, account_number: str, order_id: str) -> Any:
params = {"account_number": account_number}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{order_id}/{query_params}"
return self.make_api_request("GET", path)
def get_orders(self, account_number: str) -> Any:
params = {
"account_number": account_number,
"created_at_start": "2023-01-01T20:57:50Z"
}
query_params = self.get_query_params(params)
path = f"/api/v2/crypto/trading/orders/{query_params}"
return self.make_api_request("GET", path)
def main():
api_trading_client = CryptoAPITradingV2()
print(api_trading_client.get_trading_pairs())
# print(api_trading_client.get_trading_pairs("BTC-USD", "ETH-USD"))
# print(api_trading_client.get_best_bid_ask("BTC-USD")) #"BTC-USD", "ETH-USD"
# print(api_trading_client.get_estimated_price(symbol="BTC-USD", side="both", quantity="0.01"))
# accounts = api_trading_client.get_accounts()
# print(accounts)
# account_number = accounts["results"][0]["account_number"]
# print(f"account_number: {account_number}")
# print(api_trading_client.get_orders(account_number))
# print(api_trading_client.get_holdings(account_number))
# print(api_trading_client.get_holdings(account_number, "BTC", "ETH"))
"""
BUILD YOUR TRADING STRATEGY HERE
order = api_trading_client.place_order(
account_number,
str(uuid.uuid4()),
"buy",
"market",
"BTC-USD",
{"asset_quantity": "0.000001"}
)
"""
if __name__ == "__main__":
main()
5. Run your script from the command line
# to run the Python script using the v1 API endpoints:
python robinhood_api_trading.py
# to run the Python script using the v2 API endpoints:
python robinhood_api_trading_v2.py
[](https://docs.robinhood.com/crypto/#section/Pagination)
Pagination
====================================================================
Endpoints that return a list of results allow you to paginate to have more control over how many and which results to display.
### Pagination Parameters
| Parameter | Description |
| --- | --- |
| cursor | The cursor is a unique identifier for each page in a list of results. The cursor is used to paginate through the pages of results. |
| limit | The limit is the number of items to return in a single page. Some of our endpoints support this query parameter. You can view support by checking the query parameters in the documentation of each endpoint. |
### Pagination Response
| Field | Description |
| --- | --- |
| next | The API request endpoint that includes the next cursor query parameter to use for pagination. |
| previous | The API request endpoint that includes the previous cursor query parameter to use for pagination. |
| results | The list of response items for the current cursor. |
[](https://docs.robinhood.com/crypto/#section/Rate-Limiting)
Rate Limiting
==========================================================================
### Rate Limits
* Requests per minute per user account: 100
* Requests per minute per user account in bursts: 300
Rate limiting is applied using a token bucket implementation. The burst size or `capacity` is the number of tokens you can use to call an endpoint. This capacity is initialized at the maximum capacity and will be refilled using a `refill amount` at a timed interval called `refill interval` until the max capacity is once again reached.
### Rate Limiting Terms
| Term | Description |
| --- | --- |
| Max capacity | The maximum amount of tokens allowed. Will no longer continue refilling if this amount is reached. |
| Remaining amount | The number of tokens remaining that can be consumed to call an endpoint. |
| Refill amount | The number of tokens that are refilled at each refill interval. |
| Refill interval | The timed interval at which the tokens are refilled. |
The actual values of the configuration will fluctuate depending on the availability of our service and our current expected volume at the time of service. Rate limits are applied per endpoint and may differ among each endpoint depending on their expected use case.
#### Example rate limiting configuration:
| Term | Value |
| --- | --- |
| Max capacity | 5 |
| Remaining amount | 2 |
| Refill amount | 1 |
| Refill interval | 1 second |
| Action | Time (in seconds) | Remaining amount | Description |
| --- | --- | --- | --- |
| Initialize | 0 | 5 | Initial state of the token bucket. |
| Endpoint call 1 | 0.5 | 4 | One token consumed for calling endpoint 1. |
| Endpoint call 2 | 0.7 | 3 | One token consumed for calling endpoint 2. |
| Refill | 1 | 4 | One token refilled at refill interval. |
| Refill | 2 | 5 | One token refilled at refill interval. |
| No refill | 3 | 5 | No refill since max capacity has been reached and no endpoints were called. |
| Endpoint call 3 | 3.5 | 4 | One token consumed for calling endpoint 3. |
[](https://docs.robinhood.com/crypto/#section/Error-Responses)
Error Responses
==============================================================================
### Error response format
#### Type
The `type` field in the error response will be mapped to the following:
| Error type | Status codes |
| --- | --- |
| validation\_error | 400 |
| client\_error | 4XX, excluding 400 |
| server\_error | 5XX |
#### Errors
The `errors` field will contain a list of error details, each item will contain a nested `attr` and `detail` field.
| Field | Description |
| --- | --- |
| attr | Error types of `validation_error` will specify the field name or `non_field_errors` if the error cannot be attributed to a field. Will be `null` for error types of either `client_error` and `server_error`. |
| detail | Will contain a human readable string describing the error. |
### Example Error Response
Here's a sample error response where the `client_order_id` field in the payload was a value that was not expected when calling the _**Add Crypto Order**_ endpoint. The `detail` field for each error in the `errors` list will help understand why the `validation_error` was thrown. The `attr` field will indicate which field name in the request body or query parameter the error was thrown for if applicable.
{
"type": "validation_error"
"errors": [\
{\
"detail": "Must be a valid UUID.",\
"attr": "client_order_id"\
}\
]
}
### Common Error Status Codes
| Status Code | Error |
| --- | --- |
| 400 | Bad request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not found |
| 405 | Method not allowed |
| 406 | Not acceptable |
| 415 | Unsupported media type |
| 429 | Too many requests |
| 500 | Internal server error |
| 503 | Service unavailable |
[](https://docs.robinhood.com/crypto/#tag/V2-Account)
Account
=============================================================
[](https://docs.robinhood.com/crypto/#tag/V2-Account/operation/api_v2_crypto_trading_accounts)
Get Accounts
-----------------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto trading accounts for the authenticated user. Returns account details including buying power, status, and fee tier information.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of accounts to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/accounts/
https://trading.robinhood.com/api/v2/crypto/trading/accounts/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string", * "account_type": "string", * "is_api_tradable": true, * "fee_tier_status": { * "fee_ratio": 0.1, * "thirty_day_volume": 0.1, * "next_fee_tier_ratio": 0.1, * "next_fee_tier_threshold": 0.1 } } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Market-Data)
Market Data
=====================================================================
[](https://docs.robinhood.com/crypto/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_best_bid_ask)
Get Best Price
------------------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner exchanges. This price does not take into account the order size or fee, and may not be the final execution price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted.
For example, `?symbol=BTC-USD&symbol=ETH-USD` |
### Responses
**200**
**400**
**403**
get/api/v2/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v2/crypto/marketdata/best\_bid\_ask/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "bid": 0.1, * "ask": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Market-Data/operation/api_v2_crypto_marketdata_estimated_price)
Get Estimated Price
--------------------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, asset quantity, and fee. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our partner exchanges provide for an order, excluding the fee.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example `BTC-USD`. Ensure that the symbol is provided in all uppercase. Only USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side: `bid`, `ask`, or `both`. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be smaller than `max_order_size` as defined in our Get Crypto Trading Pairs endpoint. Multiple quantities can be comma-separated. A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/estimated\_price/
https://trading.robinhood.com/api/v2/crypto/trading/estimated\_price/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "quantity": 0.1, * "timestamp": "2019-08-24T14:15:22Z", * "bid": 0.1, * "ask": 0.1, * "fee_ratio": 0.1, * "est_fee": 0.1, * "est_total_cost": 0.1, * "est_total_credit": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Trading)
Trading
=============================================================
[](https://docs.robinhood.com/crypto/#tag/V2-Trading/operation/api_v2_crypto_trading_trading_pairs)
Get Trading Pairs
---------------------------------------------------------------------------------------------------------------------
Fetch a paginated list of available trading pairs for crypto trading. Returns trading pair details including price increments, order size limits, and tradability status. Trading pairs can be filtered by symbol.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
Optional. Filter by trading pair symbol(s). Example: `symbol=BTC-USD`. Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, `?symbol=BTC-USD&symbol=ETH-USD`.
If the "symbol" parameter is not provided, this endpoint will return all tradable currency pairs. |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**401**
**403**
**404**
get/api/v2/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v2/crypto/trading/trading\_pairs/
### Response samples
* 200
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "symbol": "string", * "asset_code": "string", * "quote_code": "string", * "asset_increment": "string", * "quote_increment": "string", * "max_order_size": "string", * "min_order_amount": "string", * "status": "string", * "is_api_tradable": true } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Trading/operation/api_v2_crypto_trading_holdings)
Get Holdings
-----------------------------------------------------------------------------------------------------------
Retrieve a paginated list of crypto holdings for a specific account. Returns the total quantity and available quantity for each asset held in the account. The `account_number` query parameter is required.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
**Required.** The account number to retrieve holdings for. This parameter must be provided. |
| asset\_code | string
Example: asset\_code=BTC
Optional. Filter holdings by specific asset code (e.g., "BTC"). |
| cursor | string
Optional cursor for pagination. Use the value from `next` or `previous` in the response to navigate through pages. |
| limit | integer
Optional page size limit. Specifies the number of results to return per page. Maximum value is determined by system configuration. |
### Responses
**200**
**400**
**401**
**403**
get/api/v2/crypto/trading/holdings/
https://trading.robinhood.com/api/v2/crypto/trading/holdings/
### Response samples
* 200
* 400
* 401
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": "string", * "quantity_available_for_trading": "string" } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_get)
Get Orders
-----------------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user in a specific account.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to retrieve orders from. |
| cursor | string
Optional cursor for pagination. |
| created\_at\_start | string
Filter orders created on or after this timestamp (ISO 8601 format). |
| created\_at\_end | string
Filter orders created on or before this timestamp (ISO 8601 format). |
| updated\_at\_start | string
Filter orders updated on or after this timestamp (ISO 8601 format). |
| updated\_at\_end | string
Filter orders updated on or before this timestamp (ISO 8601 format). |
| symbol | string
Filter orders by trading pair symbol. |
| side | string
Enum: "buy" "sell"
Filter orders by side. |
| type | string
Enum: "market" "limit" "stop\_loss" "stop\_limit"
Filter orders by type. |
| state | string
Enum: "open" "canceled" "filled" "failed" "pending"
Filter orders by state. |
### Responses
**200**
**400**
**401**
**403**
**404**
get/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Response samples
* 200
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "string", * "previous": "string", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/#tag/V2-Trading/operation/api_v2_crypto_trading_orders_post)
Place New Crypto Order
------------------------------------------------------------------------------------------------------------------------
Place a new crypto trading order with an order type. This endpoint only supports placing orders on USD symbols that have `is_api_tradable=true` as defined in our Get Crypto Trading Pairs endpoint.
**Note:** Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| account\_number
required | string
Required. The number of the crypto account to place orders from. |
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
**401**
**403**
**404**
post/api/v2/crypto/trading/orders/
https://trading.robinhood.com/api/v2/crypto/trading/orders/
### Request samples
* Payload
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "time_in_force": "gtc" }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
* 401
* 403
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/crypto/#tag/V2-Trading/operation/api_v2_crypto_trading_cancel_order)
Cancel Open Crypto Order
---------------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
The ID of the order to cancel. |
### Responses
**200**
**400**
**403**
post/api/v2/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v2/crypto/trading/orders/{id}/cancel/
### Response samples
* 200
* 400
* 403
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "fee_charged": 0.1, * "estimated_fee_remaining": 0.1 }`
[](https://docs.robinhood.com/crypto/#tag/Account)
Account
==========================================================
[](https://docs.robinhood.com/crypto/#tag/Account/operation/api_v1_crypto_trading_account_Details)
Get Crypto Trading Account Details
-------------------------------------------------------------------------------------------------------------------------------------
Fetches the Robinhood Crypto account details for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
### Responses
**200**
get/api/v1/crypto/trading/accounts/
https://trading.robinhood.com/api/v1/crypto/trading/accounts/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/accounts/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
Content type
application/json
Copy
`{ * "account_number": "string", * "status": "active", * "buying_power": "string", * "buying_power_currency": "string" }`
[](https://docs.robinhood.com/crypto/#tag/Market-Data)
Market Data
==================================================================
[](https://docs.robinhood.com/crypto/#tag/Market-Data/operation/api_v1_crypto_marketdata_best_bid_ask)
Get Best Price
---------------------------------------------------------------------------------------------------------------------
Fetch a single bid and ask price per symbol, representing the best available price across our partner market makers. This price does not take into account the order size, and may not be the final execution price.
The bid and ask prices include a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
Note that in the v2 endpoint, **Place crypto orders with fee tiers**, partner exchanges provide prices instead of market makers, with orders routed accordingly. For more information on routing, visit our [Help Center](https://robinhood.com/us/en/support/articles/crypto-order-routing/)
.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/best\_bid\_ask/
https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/marketdata/best\_bid\_ask/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "price": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/crypto/#tag/Market-Data/operation/api_v1_crypto_marketdata_estimated_price)
Get Estimated Price
-----------------------------------------------------------------------------------------------------------------------------
This endpoint returns the estimated total cost or credit for a particular symbol, book side, and asset quantity. You can include a list of quantities in a single request to retrieve the price for various hypothetical order sizes.
The estimated price represents the expected execution price if you were to subsequently place an order. To estimate the cost for a Buy order, request an Ask quote. If you are preparing to place a Sell order, request a Bid quote. The execution price may vary due to market volatility and once executed the transaction may not be undone.
The bid and ask prices are the best prices our market makers provide for an order, inclusive of a spread. The buy spread is the percent difference between the ask and the mid price. The sell spread is the percent difference between the bid and the mid price.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol
required | string
Example: symbol=BTC-USD
A string matching a valid currency pair, for example BTC-USD. Ensure that the symbol is provided in all uppercase.
Only USD symbols are accepted. |
| side
required | string
Enum: "bid" "ask" "both"
Example: side=bid
Order side. e.g. bid, ask, or both. |
| quantity
required | string
Example: quantity=0.1,1,1.999
Quantity must be between `min_order_size` and `max_order_size` as defined in our `Get Crypto Trading Pairs` endpoint.
A max of 10 quantities can be specified for each request. |
### Responses
**200**
**400**
get/api/v1/crypto/marketdata/estimated\_price/
https://trading.robinhood.com/api/v1/crypto/marketdata/estimated\_price/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/marketdata/api/v1/estimated\_price/?symbol=BTC-USD&side=ask&quantity=0.1,1,1.999" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "results": [ * { * "symbol": "string", * "side": "bid", * "price": 0.1, * "quantity": 0.1, * "bid_inclusive_of_sell_spread": 0.1, * "sell_spread": 0.1, * "ask_inclusive_of_buy_spread": 0.1, * "buy_spread": 0.1, * "timestamp": "string" } ] }`
[](https://docs.robinhood.com/crypto/#tag/Trading)
Trading
==========================================================
[](https://docs.robinhood.com/crypto/#tag/Trading/operation/api_v1_crypto_trading_trading_pairs)
Get Crypto Trading Pairs
-------------------------------------------------------------------------------------------------------------------------
Fetch a list of trading pairs.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| symbol | string
Example: symbol=BTC-USD
List of trading pair symbol(s) to retrieve data for.
Multiple symbols can be provided by using the "symbol" parameter with different values. Ensure that the symbol(s) are provided in all uppercase.
For example, **?symbol=BTC-USD&symbol=ETH-USD** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/trading\_pairs/
https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/trading\_pairs/?symbol=BTC-USD" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/trading_pairs/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "asset_code": "string", * "quote_code": "string", * "quote_increment": "string", * "asset_increment": "string", * "max_order_size": "string", * "min_order_size": "string", * "status": "tradable", * "symbol": "string" } ] }`
[](https://docs.robinhood.com/crypto/#tag/Trading/operation/api_v1_crypto_trading_holdings)
Get Crypto Holdings
---------------------------------------------------------------------------------------------------------------
Fetch a list of holdings for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| asset\_code | string
Example: asset\_code=BTC
The asset code(s) to retrieve data for.
Multiple asset codes can be provided by using the "asset\_code" parameter with different values. Ensure that the asset codes are provided in all uppercase.
For example, **?asset\_code=BTC&asset\_code=ETH** |
| limit | integer
Limit the number of results per page size |
| cursor | string |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/holdings/
https://trading.robinhood.com/api/v1/crypto/trading/holdings/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/holdings/?asset\_code=BTC" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/holdings?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "account_number": "string", * "asset_code": "string", * "total_quantity": 0.1, * "quantity_available_for_trading": 0.1 } ] }`
[](https://docs.robinhood.com/crypto/#tag/Trading/operation/api_v1_crypto_trading_orders)
Get Crypto Orders
-----------------------------------------------------------------------------------------------------------
Fetch a list of orders for the current user.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### query Parameters
| | |
| --- | --- |
| created\_at\_start | string
Example: created\_at\_start=2023-10-31T20:57:50Z
Filter by created at start time range (greater than or equal to) in ISO 8601 format |
| created\_at\_end | string
Example: created\_at\_end=2023-10-31T20:57:50Z
Filter by created at end time range (less than or equal to) in ISO 8601 format |
| symbol | string
Example: symbol=BTC-USD
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| id | string
Order ID, unique per order |
| side | string
Enum: "buy" "sell"
Buy or sell |
| state | string
Enum: "open" "canceled" "partially\_filled" "filled" "failed"
State of the order |
| type | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| updated\_at\_start | string
Example: updated\_at\_start=2023-10-31T20:57:50Z
Filter by updated at start time range (greater than or equal to) in ISO 8601 format |
| updated\_at\_end | string
Example: updated\_at\_end=2023-10-31T20:57:50Z
Filter by updated at end time range (less than or equal to) in ISO 8601 format |
| cursor | string |
| limit | integer
Limit the number of results per page size |
### Responses
**200**
**400**
**404**
get/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* cURL
Copy
curl \-X "GET" "https://trading.robinhood.com/api/v1/crypto/trading/orders/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
application/json
Copy
Expand all Collapse all
`{ * "next": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "previous": "[https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor={CURSOR_ID}](https://trading.robinhood.com/api/v1/crypto/trading/orders/?cursor=%7BCURSOR_ID%7D) ", * "results": [ * { * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } } ] }`
[](https://docs.robinhood.com/crypto/#tag/Trading/operation/api_v1_post_crypto_trading_order)
Place New Crypto Order
--------------------------------------------------------------------------------------------------------------------
Places a new crypto trading order with an order type.
**Note**: Depending on the type used in the request body, you must include the respective order configuration in the request body.
For order configurations that support both `asset_quantity` or `quote_amount`, only one can be present in the request body.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### Request Body schema: application/json
required
| | |
| --- | --- |
| symbol
required | string (Symbol)
Example: **BTC-USD**
Currency pair symbol. Ensure that the symbol is provided in all uppercase. |
| client\_order\_id
required | string (Client order ID)
User input order id for idempotency validation |
| side
required | string (Side)
Enum: "buy" "sell"
Buy or sell |
| type
required | string
Enum: "limit" "market" "stop\_limit" "stop\_loss"
Type of order |
| market\_order\_config | object
Market order configuration
\***Required for market orders** |
| limit\_order\_config | object
Limit order configuration
\***Required for limit orders** |
| stop\_loss\_order\_config | object
Stop loss order configuration
\***Required for stop loss orders** |
| stop\_limit\_order\_config | object
Stop limit order configuration
\***Required for stop limit orders** |
### Responses
**201**
**400**
post/api/v1/crypto/trading/orders/
https://trading.robinhood.com/api/v1/crypto/trading/orders/
### Request samples
* Payload
* cURL
Content type
application/json
Copy
Expand all Collapse all
`{ * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "type": "limit", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
### Response samples
* 201
* 400
Content type
application/json
Copy
Expand all Collapse all
`{ * "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", * "account_number": "string", * "symbol": "string", * "client_order_id": "11299b2b-61e3-43e7-b9f7-dee77210bb29", * "side": "buy", * "executions": [ * { * "effective_price": "string", * "quantity": "string", * "timestamp": "2019-08-24T14:15:22Z" } ], * "type": "limit", * "state": "open", * "average_price": 0.1, * "filled_asset_quantity": 0.1, * "created_at": "string", * "updated_at": "string", * "market_order_config": { * "asset_quantity": 0.1 }, * "limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1 }, * "stop_loss_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" }, * "stop_limit_order_config": { * "quote_amount": 0.1, * "asset_quantity": 0.1, * "limit_price": 0.1, * "stop_price": 0.1, * "time_in_force": "gtc" } }`
[](https://docs.robinhood.com/crypto/#tag/Trading/operation/api_v1_post_crypto_trading_cancel_order)
Cancel Open Crypto Order
-----------------------------------------------------------------------------------------------------------------------------
Cancels an open crypto trading order.
##### Authorizations:
(_API Key__API Signature__Timestamp_)
##### path Parameters
| | |
| --- | --- |
| id
required | string
Order ID, unique per order |
### Responses
**200**
**400**
**404**
post/api/v1/crypto/trading/orders/{id}/cancel/
https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/
### Request samples
* cURL
Copy
curl \-X "POST" "https://trading.robinhood.com/api/v1/crypto/trading/orders/{id}/cancel/" \\
\-H 'x-api-key: ' \\
\-H 'x-timestamp: ' \\
\-H 'x-signature: ' \\
\-H 'Content-Type: application/json; charset=utf-8'
### Response samples
* 200
* 400
* 404
Content type
text/plain
Copy
Cancel request was submitted for order {id}
---
# Connecting to Robinhood Chain – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/connecting/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Connecting to Robinhood Chain
On this page
Chevron Right
Robinhood Chain is an Arbitrum Layer-2 Chain built on Ethereum, using Ethereum blobs for data availability and ETH as the native gas token. Developers can add the network to their wallet using the configuration details below.
Network Configuration[](https://docs.robinhood.com/chain/connecting/#network-configuration)
----------------------------------------------------------------------------------------------
| Property | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| Chain ID | 4663 | 46630 |
| Currency Symbol | ETH | ETH |
| Block Explorer | [robinhoodchain.blockscout.com](https://robinhoodchain.blockscout.com/) | [explorer.testnet.chain.robinhood.com](https://explorer.testnet.chain.robinhood.com/) |
Developer Endpoints[](https://docs.robinhood.com/chain/connecting/#developer-endpoints)
------------------------------------------------------------------------------------------
Alchemy is the recommended infrastructure provider for building on Robinhood Chain. [Sign up for a free Alchemy account](https://dashboard.alchemy.com/)
and create an app on Robinhood Chain to get your API key.
| Endpoint | Mainnet URL | Testnet URL |
| --- | --- | --- |
| RPC | `https://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}` | `https://robinhood-testnet.g.alchemy.com/v2/{API_KEY}` |
| Websocket | `wss://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}` | `wss://robinhood-testnet.g.alchemy.com/v2/{API_KEY}` |
For historical reads and indexing, use an archive endpoint — available through providers such as Alchemy.
###
Other Providers[](https://docs.robinhood.com/chain/connecting/#other-providers)
Robinhood Chain is also supported by QuickNode, Blockdaemon, dRPC, and Validation Cloud. Sign up directly with your provider to get an endpoint.
QuickNode endpoints follow: `https://{ENDPOINT}.robinhood-mainnet.quiknode.pro/{TOKEN}`
Supported Services[](https://docs.robinhood.com/chain/connecting/#supported-services)
----------------------------------------------------------------------------------------
| Service | Description |
| --- | --- |
| Node API | Access standard JSON-RPC and Websocket endpoints for reading and writing to Robinhood Chain. |
| Data API | Instant, reliable access to indexed blockchain data like token balances, transaction history, NFTs, and portfolio activity |
| Gasless Transaction Infrastructure | Create and manage programmable wallets with built-in support for gas sponsorship, batched transactions, flexible policies, and spending controls. |
For more details on each service, visit the [Alchemy documentation](https://www.alchemy.com/docs/reference/robinhood-chain-api-quickstart)
.
Public Endpoints[](https://docs.robinhood.com/chain/connecting/#public-endpoints)
------------------------------------------------------------------------------------
The following public endpoints are available but are rate-limited and not recommended for production use. For production, use a provider (see above).
| Endpoint | Mainnet URL | Testnet URL |
| --- | --- | --- |
| RPC | `https://rpc.mainnet.chain.robinhood.com` | `https://rpc.testnet.chain.robinhood.com` |
| Sequencer Feed | `wss://feed.mainnet.chain.robinhood.com` | `wss://feed.testnet.chain.robinhood.com` |
| Sequencer | `https://sequencer.mainnet.chain.robinhood.com` | `https://sequencer.testnet.chain.robinhood.com` |
Bridge to Robinhood Chain[](https://docs.robinhood.com/chain/connecting/#bridge-to-robinhood-chain)
------------------------------------------------------------------------------------------------------
To move funds onto Robinhood Chain, use the canonical Arbitrum bridge or one of several cross-chain routes. See [Bridging](https://docs.robinhood.com/chain/bridging)
for all options and supported assets.
Connect a Wallet[](https://docs.robinhood.com/chain/connecting/#connect-a-wallet)
------------------------------------------------------------------------------------
To connect to Robinhood Chain via a wallet, follow the instructions [here](https://docs.robinhood.com/chain/add-network-to-wallet)
.
---
# Add network to your wallet – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/add-network-to-wallet/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Add network to your wallet
On this page
Chevron Right
Robinhood Wallet[](https://docs.robinhood.com/chain/add-network-to-wallet/#robinhood-wallet)
-----------------------------------------------------------------------------------------------
[Robinhood Wallet](https://robinhood.com/web3-wallet/)
provides support for Robinhood Chain. To enable:
1. Download Robinhood Wallet (requires iOS or Android)
[](https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733)
[](https://play.google.com/store/apps/details?id=com.robinhood.gateway)
2. Create a wallet
Connect using a Browser Wallet[](https://docs.robinhood.com/chain/add-network-to-wallet/#connect-using-a-browser-wallet)
---------------------------------------------------------------------------------------------------------------------------
Robinhood Chain is compatible with EVM Wallets (MetaMask, Phantom, and more). Click on your wallet below to automatically add Robinhood Chain.
MainnetTestnet
Connect your wallet to add Robinhood Chain
Browser Wallet
###
To add manually to MetaMask:[](https://docs.robinhood.com/chain/add-network-to-wallet/#to-add-manually-to-metamask)
1. In MetaMask, follow these instructions to add a network manually.
2. Enter the details below:
| Property | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| Chain ID | 4663 | 46630 |
| Default RPC URL | `https://rpc.mainnet.chain.robinhood.com/` | `https://rpc.testnet.chain.robinhood.com` |
| Currency Symbol | ETH | ETH |
| Block Explorer | [robinhoodchain.blockscout.com](https://robinhoodchain.blockscout.com/) | [explorer.testnet.chain.robinhood.com](https://explorer.testnet.chain.robinhood.com/) |
---
# Bridging – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/bridging/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Bridging
On this page
Chevron Right
Robinhood Chain supports moving assets through its canonical bridge plus several cross-chain routes from partners. The canonical bridge is the trustless default for moving funds between Ethereum and Robinhood Chain; the additional routes offer faster transfers and broader network coverage.
| Route | Type | Speed | Best for |
| --- | --- | --- | --- |
| [Arbitrum canonical bridge](https://portal.arbitrum.io/bridge?destinationChain=robinhood-chain&sourceChain=ethereum) | Trustless L1↔L2 | Deposit ~10 min · Withdrawal ~7 days (challenge period) | Move ETH and ERC-20s between Ethereum and Robinhood Chain |
| LayerZero OFT / [Stargate](https://stargate.finance/) | Messaging + Omnichain token (OFT) transfer | Minutes (varies with source-chain finality) | Fast token movement across chains, moving WBTC, USDG, and other OFTs |
| Chainlink CCIP | Messaging + token transfer | Minutes (varies with source-chain finality) | Programmable transfers that move tokens and trigger an action together — e.g., bridge USDG and deposit it into a lending market on arrival. |
| [Relay](https://relay.link/bridge/robinhood) | Intents-based bridge | Seconds | Fast, low-cost transfers — and bridge-and-execute (trigger an action on the destination chain) in one step |
| [Across](https://across.to/?to=robinhood) | Intents-based bridge | Seconds | Fast, capital-efficient asset bridging across chains |
| [LiFi](https://li.fi/)
/ [0x](https://www.0xprotocol.org/) | Cross-chain swap aggregators | Seconds–minutes | Swap-and-bridge in one step |
Canonical bridge[](https://docs.robinhood.com/chain/bridging/#canonical-bridge)
----------------------------------------------------------------------------------
The canonical bridge is the native bridge for Robinhood Chain. It is trustless and requires no third-party validators — security is inherited directly from Ethereum.
###
Depositing (Ethereum → Robinhood Chain)[](https://docs.robinhood.com/chain/bridging/#depositing-ethereum--robinhood-chain)
Deposits typically confirm within 10 minutes. To bridge ETH or ERC-20 tokens from Ethereum to Robinhood Chain, use the [Arbitrum canonical bridge](https://portal.arbitrum.io/bridge?destinationChain=robinhood-chain&sourceChain=ethereum)
**If a deposit doesn't arrive**
Deposits use Arbitrum's retryable ticket system. If the Robinhood Chain (L2) leg of a deposit fails — for example, due to insufficient gas — the funds are not lost. The deposit can be manually redeemed from the bridge interface within 7 days.
###
Withdrawing (Robinhood Chain → Ethereum)[](https://docs.robinhood.com/chain/bridging/#withdrawing-robinhood-chain--ethereum)
Withdrawing from Robinhood Chain is a three-step process:
1. Initiate the withdrawal on Robinhood Chain (L2).
2. Wait for the 7-day challenge period, a standard requirement of Arbitrum's fraud proof system.
3. Claim your funds by submitting a transaction on Ethereum (L1). This final step is required and incurs L1 gas costs.
###
For developers[](https://docs.robinhood.com/chain/bridging/#for-developers)
To bridge programmatically, interact with the Delayed Inbox contract on Ethereum L1. Contract addresses are available on the [Protocol Contracts](https://docs.robinhood.com/chain/protocol-contracts)
page.
Note that a bridged ERC-20's contract address on Robinhood Chain differs from its address on Ethereum. To resolve the corresponding L2 address, call `calculateL2TokenAddress` on the L2 Gateway Router, or refer to the [Protocol Contracts](https://docs.robinhood.com/chain/protocol-contracts)
page.
---
# Building with Stock Tokens – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/building-with-stock-tokens/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Building with Stock Tokens
On this page
Chevron Right
Stock tokens are standard ERC-20 tokens, so building with them uses the same patterns you already know — plus onchain price feeds for real-world asset data. This guide covers what you can build, how to integrate, and how to get started.
Use cases[](https://docs.robinhood.com/chain/building-with-stock-tokens/#use-cases)
--------------------------------------------------------------------------------------
| Use case | What it looks like | Example |
| --- | --- | --- |
| Portfolio & display | Show balances and live USD value | A wallet view listing a user's NVDA, AAPL, SPY tokens with real-time value and daily P&L |
| Trading | RFQ swap interfaces | An embedded widget that quotes NVDA ↔ USDG via 0x RFQ and settles onchain |
| Lending & borrowing | Stock tokens as collateral | Deposit NVDA as collateral on a lending market and borrow USDG — liquidity without selling |
| Indices & baskets | Bundle tokens into one product | An "AI basket" (NVDA, MSFT, GOOGL) that auto-values from each token's Chainlink feed |
| Yield strategies | Earn on equity exposure | A vault that supplies stock tokens to a lending market so holders earn yield on top of dividends |
| Price-aware contracts | Logic that reacts to equity prices | A contract that executes when a stock token crosses a threshold — onchain conditional logic |
| Perps & derivatives | Equity-backed leverage | Use stock tokens as margin or underlying on a perps venue |
| Global access (in eligible regions) | Equity exposure where direct access is limited | An app offering US-equity exposure to users in eligible regions |
_Tokenized stocks trade via RFQ at launch. They remain standard ERC-20s and can be transferred and held in any wallet._
Integrations, contracts & APIs[](https://docs.robinhood.com/chain/building-with-stock-tokens/#integrations-contracts--apis)
------------------------------------------------------------------------------------------------------------------------------
###
Contracts[](https://docs.robinhood.com/chain/building-with-stock-tokens/#contracts)
Stock tokens are ERC-20 (18 decimals). All standard token operations work without modification:
Copy
`IERC20 nvda = IERC20(NVDA_TOKEN_ADDRESS); uint256 balance = nvda.balanceOf(user); nvda.transfer(recipient, amount); nvda.approve(spender, amount);`
Stock tokens also implement ERC-8056 (Scaled UI Amount Extension), which defines the corporate-action multiplier (`uiMultiplier()`). The multiplier scales the effective amount without changing raw balances or total supply — `balanceOf()` and `totalSupply()` stay fixed. Stock tokens are not rebasing tokens. See the ERC-8056 spec.
Find all stock tokens and ETF addresses on the [Token Contracts](https://docs.robinhood.com/chain/contracts)
page.
###
Prices[](https://docs.robinhood.com/chain/building-with-stock-tokens/#prices)
Every stock token has a per-asset Chainlink price feed implementing the standard `AggregatorV3Interface` (`latestRoundData()`, read via the feed proxy — same interface as crypto feeds):
Copy
`AggregatorV3Interface feed = AggregatorV3Interface(NVDA_PRICE_FEED); (, int256 price, , uint256 updatedAt, ) = feed.latestRoundData(); require(price > 0 && updatedAt > 0, "Invalid price");`
The Chainlink price already includes the corporate-action multiplier (dividends, splits), so the value you read is the token's full price — don't apply the multiplier yourself. If you need the raw ratio, read it onchain via the token's `uiMultiplier()`.
See [Oracles & Price Feeds](https://docs.robinhood.com/chain/oracles-and-price-feeds)
for feed addresses, decimals, and best practices (staleness checks, sequencer uptime).
###
Multiplier Conversion[](https://docs.robinhood.com/chain/building-with-stock-tokens/#multiplier-conversion)
Each token represents a number of underlying shares equal to its raw token amount scaled by the multiplier:
Copy
`underlying shares = raw token amount × uiMultiplier ÷ 1e18`
* `uiMultiplier()` is fixed-point with 18 decimals — 1e18 = 1.0.
* At launch the multiplier is 1e18 (one token = one underlying share).
* When a corporate action is applied (e.g. a reinvested dividend or a stock split), the multiplier is updated and `UIMultiplierUpdated` is emitted with the effective timestamp.
###
Multiplier Updates[](https://docs.robinhood.com/chain/building-with-stock-tokens/#multiplier-updates)
When a corporate action schedules a multiplier change ahead of time, the pending value and its effective time are readable on-chain:
Copy
`interface IScaledUIAmountNewUIMultiplier { // The pending UI multiplier scheduled to take effect at effectiveAt. function newUIMultiplier() external view returns (uint256); // The timestamp at which the pending multiplier becomes effective. function effectiveAt() external view returns (uint256); }`
* **`newUIMultiplier()`** — the multiplier that will take effect at `effectiveAt()`. Before any update is scheduled this tracks the current multiplier.
* **`effectiveAt()`** — the timestamp at which `newUIMultiplier()` becomes the active `uiMultiplier()`.
###
UI-Adjust Views[](https://docs.robinhood.com/chain/building-with-stock-tokens/#ui-adjust-views)
Rather than mutating raw balances, the token exposes UI-adjusted (underlying-share) views of balance and supply:
Copy
`interface IScaledUIAmountBalances { // UI-adjusted balance of an account (raw balance scaled by uiMultiplier). function balanceOfUI(address account) external view returns (uint256); // UI-adjusted total supply. function totalSupplyUI() external view returns (uint256); }`
* **`balanceOfUI(account)`** — the account's balance expressed in underlying shares. Use this to display how many underlying shares a holder's tokens represent. To convert any raw amount yourself, apply the formula in Multiplier Conversion above.
* **`totalSupplyUI()`** — total supply expressed in underlying shares.
###
ERC-8056 events[](https://docs.robinhood.com/chain/building-with-stock-tokens/#erc-8056-events)
The multiplier and its movements are exposed by the core ERC-8056 interface:
Copy
`interface IScaledUIAmount { // Current UI multiplier, expressed with 18 decimals (1e18 = 1.0). function uiMultiplier() external view returns (uint256); // Emitted when the multiplier changes (e.g. a dividend or split). event UIMultiplierUpdated( uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp ); // Emitted on a transfer, carrying both the raw value and the UI-adjusted // (underlying-share) value. event TransferWithScaledUI( address indexed from, address indexed to, uint256 value, uint256 uiValue ); }`
* Subscribe to `UIMultiplierUpdated` to track corporate-action adjustments and the timestamp each became effective.
* Use `TransferWithScaledUI` to record the underlying-share value (`uiValue`) of each transfer alongside the raw value.
Getting started[](https://docs.robinhood.com/chain/building-with-stock-tokens/#getting-started)
--------------------------------------------------------------------------------------------------
1. Pick a stock token — grab its address from [Token Contracts](https://docs.robinhood.com/chain/contracts)
.
2. Read a balance — call `balanceOf` like any ERC-20.
3. Read its price — call `latestRoundData()` on the token's Chainlink feed.
4. Build — display it, swap it, use it as collateral, or compose it into your product.
###
Example: value a user's holdings in USD[](https://docs.robinhood.com/chain/building-with-stock-tokens/#example-value-a-users-holdings-in-usd)
Copy
`// Returns the USD value of a user's stock token balance. function holdingValueUsd( IERC20 stockToken, AggregatorV3Interface priceFeed, address user ) external view returns (uint256) { uint256 balance = stockToken.balanceOf(user); // 18 decimals (, int256 price, , uint256 updatedAt, ) = priceFeed.latestRoundData(); require(price > 0 && updatedAt > 0, "Invalid price"); // price: 8 decimals // (balance * price) scaled by token + feed decimals return (balance * uint256(price)) / 1e8; }`
Next steps[](https://docs.robinhood.com/chain/building-with-stock-tokens/#next-steps)
----------------------------------------------------------------------------------------
* [Token Contracts](https://docs.robinhood.com/chain/contracts)
— all stock token & ETF addresses
* [Oracles & Price Feeds](https://docs.robinhood.com/chain/oracles-and-price-feeds)
— price feed integration
* [Deploy a Contract](https://docs.robinhood.com/chain/deploy-smart-contracts)
— ship your contracts to Robinhood Chain
---
# Differences from Ethereum – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/differences-from-ethereum/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Differences from Ethereum
On this page
Chevron Right
Robinhood Chain is EVM-compatible — contracts written in Solidity or Vyper deploy without modification, and standard tooling works out of the box. However, as an Arbitrum Nitro Layer-2, a few behaviors differ from Ethereum mainnet. Understanding these prevents subtle bugs.
Block numbers[](https://docs.robinhood.com/chain/differences-from-ethereum/#block-numbers)
---------------------------------------------------------------------------------------------
`block.number` returns an estimate of the L1 (Ethereum) block number, not the Robinhood Chain block number, and updates only periodically. Do not use it to measure L2 time precisely or as a per-block counter.
To get the actual Robinhood Chain block number, use the **ArbSys** precompile:
Copy
`uint256 l2Block = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();`
Randomness[](https://docs.robinhood.com/chain/differences-from-ethereum/#randomness)
---------------------------------------------------------------------------------------
`block.prevrandao` / `block.difficulty` return a constant value on Robinhood Chain and are not a source of randomness. Never use them for randomness — use a dedicated oracle (e.g. Chainlink VRF) instead.
Block hashes[](https://docs.robinhood.com/chain/differences-from-ethereum/#block-hashes)
-------------------------------------------------------------------------------------------
`blockhash(n)` is supported but is only reliable for recent blocks. Do not rely on it for older blocks or as a randomness source.
block.coinbase[](https://docs.robinhood.com/chain/differences-from-ethereum/#blockcoinbase)
----------------------------------------------------------------------------------------------
`block.coinbase` returns the network fee account, not a miner/validator address.
Gas & fees[](https://docs.robinhood.com/chain/differences-from-ethereum/#gas--fees)
--------------------------------------------------------------------------------------
Transaction fees have two components: L2 execution gas plus an L1 data (calldata) fee for posting the transaction to Ethereum. Gas estimation and `gasleft()` behave differently than on Ethereum as a result. Query gas pricing via the ArbGasInfo precompile. See [Gas & Fees](https://docs.robinhood.com/chain/gas-and-fees)
for details.
Address aliasing[](https://docs.robinhood.com/chain/differences-from-ethereum/#address-aliasing)
---------------------------------------------------------------------------------------------------
When an L1 contract sends a message to a contract on Robinhood Chain, the `msg.sender` seen on L2 is the aliased L1 address (the original address plus a fixed offset), not the original. Account for this in access-control logic. See [Cross-Chain Messaging](https://docs.robinhood.com/chain/cross-chain-messaging)
.
Contract size limit[](https://docs.robinhood.com/chain/differences-from-ethereum/#contract-size-limit)
---------------------------------------------------------------------------------------------------------
Robinhood Chain allows larger contracts than Ethereum — a maximum code size of 96 KB (vs. Ethereum's 24 KB) and a max init code size of 192 KB. Contracts that exceed Ethereum's limit can deploy here.
Arbitrum precompiles[](https://docs.robinhood.com/chain/differences-from-ethereum/#arbitrum-precompiles)
-----------------------------------------------------------------------------------------------------------
Robinhood Chain provides Arbitrum-specific precompiles (ArbSys, ArbGasInfo, ArbAddressTable, and others) for L2-specific functionality. See the [Protocol Contracts](https://docs.robinhood.com/chain/protocol-contracts)
page for the full list and addresses.
Transaction finality[](https://docs.robinhood.com/chain/differences-from-ethereum/#transaction-finality)
-----------------------------------------------------------------------------------------------------------
Transactions receive a fast soft confirmation from the sequencer, then achieve hard finality once posted to and confirmed on Ethereum. See [Transaction Finality](https://docs.robinhood.com/chain/transaction-finality)
for the full model.
Transaction screening[](https://docs.robinhood.com/chain/differences-from-ethereum/#transaction-screening)
-------------------------------------------------------------------------------------------------------------
Robinhood Chain maintains compliance standards through sequencer-level screening. While rare, this mechanism can influence smart-contract execution; for instance, any transaction associated with a sanctioned address will be excluded from inclusion. Standard read operations—such as `eth_call`, `eth_getLogs`, or balance queries—remain fully accessible and unaffected. Since a blocked transfer is never processed, it simply appears as though the event never occurred, ensuring indexers remain synchronized with the actual state.
Read more here: [Advanced Compliance Filtering](https://docs.arbitrum.io/launch-arbitrum-chain/configure-your-chain/advanced/compliance-filtering)
Transaction ordering[](https://docs.robinhood.com/chain/differences-from-ethereum/#transaction-ordering)
-----------------------------------------------------------------------------------------------------------
On Ethereum, miners or validators order transactions based on priority fees, where higher payments typically secure earlier inclusion. Robinhood Chain employs a **first-come, first-served** model based on sequencer arrival time. Priority gas auctions do not exist here; consequently, increasing your fee will not shift your transaction ahead of others already in the queue.
Further reading[](https://docs.robinhood.com/chain/differences-from-ethereum/#further-reading)
-------------------------------------------------------------------------------------------------
* [Gas & Fees](https://docs.robinhood.com/chain/gas-and-fees)
* [Transaction Finality](https://docs.robinhood.com/chain/transaction-finality)
* [Cross-Chain Messaging](https://docs.robinhood.com/chain/cross-chain-messaging)
* [Arbitrum: Solidity differences](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/solidity-support)
---
# Gas & Fees – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/gas-and-fees/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Gas & Fees
On this page
Chevron Right
Robinhood Chain uses ETH as its native gas token. Transaction fees are denominated in ETH, the same as on Ethereum.
Because Robinhood Chain is a Layer-2 that posts its data to Ethereum, a transaction fee has two components:
* **L2 execution fee** — the cost of executing your transaction on Robinhood Chain. This works like Ethereum gas (gas used × L2 gas price) and is typically very low and stable.
* **L1 data fee** — the cost of posting your transaction's data to Ethereum for data availability. This varies with Ethereum network congestion and is proportional to the size of your transaction's calldata.
How fees are charged[](https://docs.robinhood.com/chain/gas-and-fees/#how-fees-are-charged)
----------------------------------------------------------------------------------------------
Both components are bundled into the gas your transaction pays — you don't pay them separately. Standard fee estimation (`eth_estimateGas`, wallet fee previews) automatically accounts for both, so most developers don't need to handle them manually.
Optimizing fees[](https://docs.robinhood.com/chain/gas-and-fees/#optimizing-fees)
------------------------------------------------------------------------------------
Because the L1 data fee scales with calldata size, the most effective way to reduce fees is to minimize transaction calldata:
* Pack function arguments tightly.
* Avoid unnecessary data in calls.
* Batch operations where possible (see [Account Abstraction](https://docs.robinhood.com/chain/account-abstraction)
for batched UserOperations).
Further reading[](https://docs.robinhood.com/chain/gas-and-fees/#further-reading)
------------------------------------------------------------------------------------
* [Differences from Ethereum](https://docs.robinhood.com/chain/differences-from-ethereum)
* [Connecting to Robinhood Chain](https://docs.robinhood.com/chain/connecting)
— ETH as the native gas token
* [Protocol Contracts](https://docs.robinhood.com/chain/protocol-contracts)
— ArbGasInfo and NodeInterface precompiles
* [Arbitrum: gas and fees](https://docs.arbitrum.io/how-arbitrum-works/gas-fees)
---
# Stock Tokens – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/stock-tokens/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Overview
On this page
Chevron Right
Robinhood Chain is built for tokenized real-world assets — and Robinhood Stock Tokens are our flagship real-world asset. Stock Tokens are tokenised debt securities issued by Robinhood Assets (Jersey) Limited ("RHJ"). The Product provides economic exposure to underlying securities like US shares and ETFs, but does not grant investors any legal or beneficial rights in, or against the issuer of, those underlying securities. Stock Tokens are issued as standard ERC-20 tokens that can be held, transferred, and composed into applications onchain.
For developers, this means programmable access to real-world assets using the same tools you already use for any ERC-20 — no special SDK required to get started.
Why build with stock tokens[](https://docs.robinhood.com/chain/stock-tokens/#why-build-with-stock-tokens)
------------------------------------------------------------------------------------------------------------
* **Programmable real-world assets**
* **Standard ERC-20 interface** — works out of the box with existing wallets, libraries, and tooling.
* **Onchain prices** — every Stock Token has a live Chainlink price feed, so your contracts can read prices directly onchain.
* **Composable** — build trading, lending, structured products, and more on top of real-world asset exposure.
* **Self-custodied and 24/7** — assets live in users' wallets and are accessible around the clock.
What you can build[](https://docs.robinhood.com/chain/stock-tokens/#what-you-can-build)
------------------------------------------------------------------------------------------
A few examples of what developers can build with Stock Tokens:
* List and display Robinhood Stock Tokens in a wallet, portfolio tracker, or trading interface.
* Enable trading.
* Build lending markets that use stock tokens as collateral.
See [Building with Stock Tokens](https://docs.robinhood.com/chain/building-with-stock-tokens)
for use cases, integration patterns, and code.
How Stock Tokens work[](https://docs.robinhood.com/chain/stock-tokens/#how-stock-tokens-work)
------------------------------------------------------------------------------------------------
* Each Stock Token is a standard ERC-20 contract with 18 decimals.
* Each token corresponds to a specific underlying equity or ETF, identified by its ticker symbol.
* Prices are published onchain via per-asset Chainlink data feeds.
Corporate actions & the multiplier[](https://docs.robinhood.com/chain/stock-tokens/#corporate-actions--the-multiplier)
-------------------------------------------------------------------------------------------------------------------------
The platform manages dividends and stock splits through an onchain multiplier, which adjusts the shares-per-token ratio while keeping your raw balance static until redemption. You can access this value via the token's `uiMultiplier()` function, defined by [ERC-8056](https://eips.ethereum.org/EIPS/eip-8056)
(Scaled UI Amount Extension). Onchain swaps remain unaffected, and the oracle automatically incorporates the multiplier into the price (see [Oracles & Price Feeds](https://docs.robinhood.com/chain/oracles-and-price-feeds)
).
Get started[](https://docs.robinhood.com/chain/stock-tokens/#get-started)
----------------------------------------------------------------------------
| Goal | Where to go |
| --- | --- |
| Build with Stock Tokens | [Building with Stock Tokens](https://docs.robinhood.com/chain/building-with-stock-tokens) |
| Find contract addresses | [Token Contracts](https://docs.robinhood.com/chain/contracts) |
| Read onchain prices | [Oracles & Price Feeds](https://docs.robinhood.com/chain/oracles-and-price-feeds) |
Disclaimer[](https://docs.robinhood.com/chain/stock-tokens/#disclaimer)
--------------------------------------------------------------------------
Stock Tokens are ERC-20s issued by RHJ. RHJ also acts as the tokenizer. Only Authorised Participants (at issuance, the only Authorised Participant is BBVI) may subscribe for Stock Tokens directly from RHJ after KYB onboarding (the primary market), so developers build by composing with existing tokens rather than minting. For how holders acquire and redeem tokens.
Stock Tokens are tokenised debt securities issued by Robinhood Assets (Jersey) Limited. They provide economic exposure to underlying securities but do not grant investors any legal or beneficial rights in, or against the issuer of, those underlying securities. Stock Tokens carry a high level of risk and are not appropriate for all investors. Investors should be prepared for the possibility of losing some or all of their investment. Eligible investors should carefully review the Base Prospectus (together with any supplements) and the applicable Final Terms, available here: [http://docs.robinhood.com/rhj](http://docs.robinhood.com/rhj)
Stock Tokens are not registered under U.S. securities laws and may not be offered, sold, or delivered, directly or indirectly, in the United States or to, or for the account or benefit of, U.S. persons. Offers and sales of Stock Tokens are subject to restrictions in other jurisdictions, including, without limitation, Canada, the United Kingdom, and Switzerland. A full list of the jurisdictions in which offers or sales are restricted or prohibited is available here: [http://docs.robinhood.com/rhj](http://docs.robinhood.com/rhj)
Robinhood Assets (Jersey) Limited is a private limited company incorporated in Jersey, with its registered address at First Floor, La Chasse Chambers, Ten La Chasse, St. Helier, JE2 4UE, Jersey. The Issuer is registered under the registration number 162428.
Stock Tokens have not been and will not be registered under the U.S. Securities Act of 1933, as amended from time to time (the "Securities Act") or with any securities regulatory authority of any state or other jurisdiction of the United States. Stock Tokens may not be offered, sold or delivered within the United States to, or for the account or benefit of U.S. Persons (as defined in Regulation S under the Securities Act ("Regulation S")), and (ii) may be offered, sold or otherwise delivered at any time only outside of the United States and to transferees that are not U.S. Persons (as defined in Regulation S).
This website is directed only at persons who are resident or incorporated outside of the United Kingdom, and is therefore exempt from the general restriction in Section 21 of the Financial Services and Markets Act 2000 on the communication of invitations or inducements to engage in investment activity on the grounds that it is being issued to and/or directed at non-UK persons, and that the products and services described are not available to UK persons. It should not therefore be acted upon by any person who is resident in, or incorporated in, the United Kingdom.
Nothing on this website constitutes, and may not be used in connection with, an offer or solicitation in any place where offers or solicitations are not permitted by law. Nothing on this website constitutes investment, legal, tax or financial advice. Prospective investors should make their own assessment as to the suitability of investing in the Products.
Robinhood Markets, Inc., 85 Willow Road, Menlo Park, CA 94025. ©2026 Robinhood Markets, Inc. All rights reserved.
---
# Transaction Finality – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/transaction-finality/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Transaction Finality
On this page
Chevron Right
Robinhood Chain transactions reach finality in stages. Understanding them helps you choose the right confirmation level for your application — fast soft confirmations for everyday UX, full Ethereum finality for high-value operations.
Stages of finality[](https://docs.robinhood.com/chain/transaction-finality/#stages-of-finality)
--------------------------------------------------------------------------------------------------
| Stage | What happens | Typical latency | Guarantee |
| --- | --- | --- | --- |
| Soft confirmation | The sequencer accepts, orders, and executes your transaction and returns a receipt. | Sub-second | The sequencer has committed to your transaction's inclusion and ordering. Reversible only if the sequencer posts a batch with a different transaction order. |
| Posted to Ethereum | The sequencer batches transactions and posts the batch to the Ethereum (L1) Inbox. | Minutes | Ordering is now fixed — your transaction can only be reorganized if Ethereum itself reorganizes. |
| Ethereum finality | The L1 block containing the batch reaches finality on Ethereum. | ~13 minutes after posting | Full finality — your transaction inherits Ethereum's security and is irreversible. |
Choosing a confirmation level[](https://docs.robinhood.com/chain/transaction-finality/#choosing-a-confirmation-level)
------------------------------------------------------------------------------------------------------------------------
* Everyday UX (most apps): the soft confirmation from the sequencer is fast and reliable — sufficient for typical interactions.
* High-value or irreversible actions: wait until the transaction is posted to Ethereum, or for full Ethereum finality, before treating it as settled.
Withdrawals to Ethereum[](https://docs.robinhood.com/chain/transaction-finality/#withdrawals-to-ethereum)
------------------------------------------------------------------------------------------------------------
Finality is distinct from the withdrawal delay. Moving assets from Robinhood Chain back to Ethereum via the canonical bridge is subject to a 7-day challenge period — a requirement of Arbitrum's fraud-proof system, separate from transaction finality. See [Bridging](https://docs.robinhood.com/chain/bridging)
for details.
Reorganizations[](https://docs.robinhood.com/chain/transaction-finality/#reorganizations)
--------------------------------------------------------------------------------------------
Once a transaction is posted to Ethereum, it cannot be reorganized unless Ethereum itself reorganizes. Before posting, soft-confirmed transactions rely on the sequencer for the order it returned — in normal operation this is reliable, but it is not yet backed by Ethereum's security.
Further reading[](https://docs.robinhood.com/chain/transaction-finality/#further-reading)
--------------------------------------------------------------------------------------------
* [Differences from Ethereum](https://docs.robinhood.com/chain/differences-from-ethereum)
* [Bridging](https://docs.robinhood.com/chain/bridging)
— the 7-day withdrawal challenge period
* [Arbitrum: transaction lifecycle](https://docs.arbitrum.io/how-arbitrum-works/transaction-lifecycle)
---
# Robinhood Chain Token Contracts – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/contracts/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Token Contracts
On this page
Chevron Right
Token Smart Contracts[](https://docs.robinhood.com/chain/contracts/#token-smart-contracts)
---------------------------------------------------------------------------------------------
The following contracts are deployed on Robinhood Chain.
Use the addresses on this page to identify the **canonical** Robinhood Stock Token for each underlying — a token with a matching name/ticker but a different contract address is not a Robinhood Stock Token.
| Contract | Robinhood Chain |
| --- | --- |
| WETH | [**`0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73`**](https://robinhoodchain.blockscout.com/address/0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73) |
| USDG | [**`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`**](https://robinhoodchain.blockscout.com/address/0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168) |
###
Stock Tokens[](https://docs.robinhood.com/chain/contracts/#stock-tokens)
| Contract | Robinhood Chain |
| --- | --- |
| AAPL | [**`0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9`**](https://robinhoodchain.blockscout.com/address/0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9) |
| AMD | [**`0x86923f96303D656E4aa86D9d42D1e57ad2023fdC`**](https://robinhoodchain.blockscout.com/address/0x86923f96303D656E4aa86D9d42D1e57ad2023fdC) |
| AMZN | [**`0x12f190a9F9d7D37a250758b26824B97CE941bF54`**](https://robinhoodchain.blockscout.com/address/0x12f190a9F9d7D37a250758b26824B97CE941bF54) |
| BABA | [**`0xad25Ac6C84D497db898fa1E8387bf6Af3532a1c4`**](https://robinhoodchain.blockscout.com/address/0xad25Ac6C84D497db898fa1E8387bf6Af3532a1c4) |
| BE | [**`0x822CC93fFD030293E9842c30BBD678F530701867`**](https://robinhoodchain.blockscout.com/address/0x822CC93fFD030293E9842c30BBD678F530701867) |
| COIN | [**`0x6330D8C3178a418788dF01a47479c0ce7CCF450b`**](https://robinhoodchain.blockscout.com/address/0x6330D8C3178a418788dF01a47479c0ce7CCF450b) |
| CRCL | [**`0xdF0992E440dD0be65BD8439b609d6D4366bf1CB5`**](https://robinhoodchain.blockscout.com/address/0xdF0992E440dD0be65BD8439b609d6D4366bf1CB5) |
| CRWV | [**`0x5f10A1C971B69e47e059e1dC91901B59b3fB49C3`**](https://robinhoodchain.blockscout.com/address/0x5f10A1C971B69e47e059e1dC91901B59b3fB49C3) |
| GOOGL | [**`0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3`**](https://robinhoodchain.blockscout.com/address/0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3) |
| INTC | [**`0xc72b96e0E48ecd4DC75E1e45396e26300BC39681`**](https://robinhoodchain.blockscout.com/address/0xc72b96e0E48ecd4DC75E1e45396e26300BC39681) |
| META | [**`0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35`**](https://robinhoodchain.blockscout.com/address/0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35) |
| MSFT | [**`0xe93237C50D904957Cf27E7B1133b510C669c2e74`**](https://robinhoodchain.blockscout.com/address/0xe93237C50D904957Cf27E7B1133b510C669c2e74) |
| MU | [**`0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD`**](https://robinhoodchain.blockscout.com/address/0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD) |
| NVDA | [**`0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC`**](https://robinhoodchain.blockscout.com/address/0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC) |
| ORCL | [**`0xb0992820E760d836549ba69BC7598b4af75dEE03`**](https://robinhoodchain.blockscout.com/address/0xb0992820E760d836549ba69BC7598b4af75dEE03) |
| PLTR | [**`0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A`**](https://robinhoodchain.blockscout.com/address/0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A) |
| SNDK | [**`0xB90A19fF0Af67f7779afF50A882A9CfF42446400`**](https://robinhoodchain.blockscout.com/address/0xB90A19fF0Af67f7779afF50A882A9CfF42446400) |
| SPCX | [**`0x4a0E65A3EcceC6dBe60AE065F2e7bb85Fae35eEa`**](https://robinhoodchain.blockscout.com/address/0x4a0E65A3EcceC6dBe60AE065F2e7bb85Fae35eEa) |
| TSLA | [**`0x322F0929c4625eD5bAd873c95208D54E1c003b2d`**](https://robinhoodchain.blockscout.com/address/0x322F0929c4625eD5bAd873c95208D54E1c003b2d) |
| USAR | [**`0xd917B029C761D264c6A312BBbcDA868658eF86a6`**](https://robinhoodchain.blockscout.com/address/0xd917B029C761D264c6A312BBbcDA868658eF86a6) |
###
Tokenized ETFs[](https://docs.robinhood.com/chain/contracts/#tokenized-etfs)
| Contract | Robinhood Chain |
| --- | --- |
| QQQ | [**`0xD5f3879160bc7c32ebb4dC785F8a4F505888de68`**](https://robinhoodchain.blockscout.com/address/0xD5f3879160bc7c32ebb4dC785F8a4F505888de68) |
| SGOV | [**`0x92FD66527192E3e61d4DDd13322Aa222DE86F9B5`**](https://robinhoodchain.blockscout.com/address/0x92FD66527192E3e61d4DDd13322Aa222DE86F9B5) |
| SLV | [**`0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f`**](https://robinhoodchain.blockscout.com/address/0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f) |
| SPY | [**`0x117cc2133c37B721F49dE2A7a74833232B3B4C0C`**](https://robinhoodchain.blockscout.com/address/0x117cc2133c37B721F49dE2A7a74833232B3B4C0C) |
| CUSO | [**`0xa30FA36Db767ad9eD3f7a60fC79526fB4d56D344`**](https://robinhoodchain.blockscout.com/address/0xa30FA36Db767ad9eD3f7a60fC79526fB4d56D344) |
---
# Account Abstraction – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/account-abstraction/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Account Abstraction
On this page
Chevron Right
Robinhood Chain has first-class support for ERC-4337 account abstraction, and also supports EIP-7702, which lets existing externally-owned accounts delegate to smart contract code — so users can get smart-account features (batching, sponsorship, session keys) without migrating to a new address.
Account abstraction on Robinhood Chain is powered by Alchemy, with ZeroDev available as an alternative.
What's available[](https://docs.robinhood.com/chain/account-abstraction/#whats-available)
--------------------------------------------------------------------------------------------
| Service | Description |
| --- | --- |
| Alchemy | Create and manage programmable wallets to submit and manage transactions with built-in batching, configurable spend policies, and gas sponsorship for users. |
| ZeroDev | Smart AA wallets that can be embedded as UI or used through API. Supports gas sponsorship, transaction batching, transaction automation, and cross-chain execution. |
| Privy | Embedded wallets and account abstraction tooling |
Network configuration[](https://docs.robinhood.com/chain/account-abstraction/#network-configuration)
-------------------------------------------------------------------------------------------------------
| Property | Value |
| --- | --- |
| Chain ID | 4663 |
| Bundler / RPC URL | `https://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}` |
Deployed ERC-4337 contracts[](https://docs.robinhood.com/chain/account-abstraction/#deployed-erc-4337-contracts)
-------------------------------------------------------------------------------------------------------------------
| Contract | Address |
| --- | --- |
| ERC-4337 Entrypoint v0.6.0 | **`0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789`** |
| ERC-4337 SenderCreator v0.6.0 | **`0x7fc98430eAEdbb6070B35B39D798725049088348`** |
| ERC-4337 Entrypoint v0.7.0 | **`0x0000000071727De22E5E9d8BAf0edAc6f37da032`** |
| ERC-4337 SenderCreator v0.7.0 | **`0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C`** |
| ERC-4337 Entrypoint v0.8.0 | **`0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108`** |
| ERC-4337 SenderCreator v0.8.0 | **`0x449ED7C3e6Fee6a97311d4b55475DF59C44AdD33`** |
| ERC-4337 Safe Module Setup v0.3.0 | **`0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47`** |
| ERC-4337 Safe 4337 Module v0.3.0 (supporting Entrypoint v0.7.0) | **`0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226`** |
Quickstart[](https://docs.robinhood.com/chain/account-abstraction/#quickstart)
---------------------------------------------------------------------------------
###
Using Alchemy[](https://docs.robinhood.com/chain/account-abstraction/#using-alchemy)
Alchemy recommends using the latest version `@alchemy/wallet-apis` for the easiest setup.
Sending sponsored txs on Robinhood mainnet:
1. Create an Alchemy account and [create an app on Robinhood Chain](https://dashboard.alchemy.com/apps?utm_source=docs&utm_medium=referral&utm_content=wallets_transactions_send-transactions)
to get your API key
2. In the Alchemy dashboard, create a [Gas Manager policy to sponsor gas](https://dashboard.alchemy.com/gas-manager/policy/create?utm_source=docs&utm_medium=referral&utm_content=wallets_transactions_sponsor-gas)
, and note your Policy ID
3. Install dependencies
Copy
`npm install @alchemy/wallet-apis @alchemy/common viem`
4. Create a client and send gas-sponsored operation
Copy
``import { createSmartWalletClient, alchemyWalletTransport } from "@alchemy/wallet-apis"; import { robinhoodMainnet } from "@alchemy/common/chains"; import { privateKeyToAccount } from "viem/accounts"; import { zeroAddress } from "viem"; const client = createSmartWalletClient({ transport: alchemyWalletTransport({ apiKey: "YOUR_API_KEY", }), chain: robinhoodMainnet, signer: privateKeyToAccount("0xYOUR_PRIVATE_KEY" as const), paymaster: { policyId: "YOUR_POLICY_ID", // sponsor gas for the user }, }); // prepare and send calls const { id } = await client.sendCalls({ calls: [{ to: zeroAddress, value: BigInt(0) }], }); // get calls status const status = await client.waitForCallsStatus({ id }); console.log(`Call ID: ${id}`); console.log(`Status: ${status.status}`);``
###
Using ZeroDev[](https://docs.robinhood.com/chain/account-abstraction/#using-zerodev)
If you prefer ZeroDev for gas sponsorship, configure a ZeroDev paymaster pointed at Robinhood Chain (chain ID 4663).
Install ZeroDev SDK:
Copy
`npm i @zerodev/sdk @zerodev/ecdsa-validator`
Send a sponsored transaction with ZeroDev:
Copy
`import { createKernelAccount, createKernelAccountClient, createZeroDevPaymasterClient } from "@zerodev/sdk" import { KERNEL_V3_1, getEntryPoint } from "@zerodev/sdk/constants" import { signerToEcdsaValidator } from "@zerodev/ecdsa-validator" import { http, createPublicClient, zeroAddress } from "viem" import { generatePrivateKey, privateKeyToAccount } from "viem/accounts" import { robinhoodMainnet } from "viem/chains" const ZERODEV_RPC = 'https://rpc.zerodev.app/api/v3/YOUR_PROJECT_ID/chain/4663' const chain = robinhoodMainnet const entryPoint = getEntryPoint("0.7") const kernelVersion = KERNEL_V3_1 const main = async () => { // Construct a signer const privateKey = generatePrivateKey() const signer = privateKeyToAccount(privateKey) // Construct a public client const publicClient = createPublicClient({ // Use your own RPC provider in production (e.g. Infura/Alchemy). transport: http(ZERODEV_RPC), chain }) // Construct a validator const ecdsaValidator = await signerToEcdsaValidator(publicClient, { signer, entryPoint, kernelVersion }) // Construct a Kernel account const account = await createKernelAccount(publicClient, { plugins: { sudo: ecdsaValidator, }, entryPoint, kernelVersion }) const zerodevPaymaster = createZeroDevPaymasterClient({ chain, transport: http(ZERODEV_RPC), }) // Construct a Kernel account client const kernelClient = createKernelAccountClient({ account, chain, bundlerTransport: http(ZERODEV_RPC), // Required - the public client client: publicClient, paymaster: { getPaymasterData(userOperation) { return zerodevPaymaster.sponsorUserOperation({userOperation}) } }, }) const accountAddress = kernelClient.account.address console.log("My account:", accountAddress) // Send a UserOp const userOpHash = await kernelClient.sendUserOperation({ callData: await kernelClient.account.encodeCalls([{ to: zeroAddress, value: BigInt(0), data: "0x", }]), }) console.log("UserOp hash:", userOpHash) console.log("Waiting for UserOp to complete...") await kernelClient.waitForUserOperationReceipt({ hash: userOpHash, timeout: 1000 * 15, }) console.log("UserOp completed: https://robinhoodchain.blockscout.com/op/" + userOpHash) process.exit() } main()`
For more information, check [ZeroDev docs](https://docs.zerodev.app/)
.
Further reading[](https://docs.robinhood.com/chain/account-abstraction/#further-reading)
-------------------------------------------------------------------------------------------
* [Alchemy documentation](https://www.alchemy.com/docs/wallets)
* [ERC-4337 specification](https://docs.erc4337.io/index.html)
* [ZeroDev documentation](https://docs.zerodev.app/)
---
# Deploy a Contract – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/deploy-smart-contracts/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Deploy a Contract
On this page
Chevron Right
Robinhood Chain is fully EVM-compatible, so smart contracts written in Solidity or Vyper deploy without modification using standard Ethereum tooling. This guide covers deploying a simple contract with Foundry or Hardhat — pick whichever you prefer.
Prerequisites[](https://docs.robinhood.com/chain/deploy-smart-contracts/#prerequisites)
------------------------------------------------------------------------------------------
Before you begin, you'll need:
* A wallet with ETH on Robinhood Chain for gas — see [Add network to your wallet](https://docs.robinhood.com/chain/add-network-to-wallet)
.
* The network details below.
| Property | Mainnet | Testnet |
| --- | --- | --- |
| Network | Robinhood Chain | Robinhood Chain Testnet |
| Chain ID | 4663 | 46630 |
| RPC URL | `https://rpc.mainnet.chain.robinhood.com` | `https://rpc.testnet.chain.robinhood.com` |
| Block Explorer | [robinhoodchain.blockscout.com](https://robinhoodchain.blockscout.com/) | [explorer.testnet.chain.robinhood.com](https://explorer.testnet.chain.robinhood.com/) |
_We recommend deploying to testnet first. The steps below target mainnet — to deploy to testnet instead, use the testnet values above: set `RH_RPC_URL` to the testnet RPC, use chain ID 46630, and verify against `https://explorer.testnet.chain.robinhood.com/api/`._
_Security note: Never commit a real private key. Use an environment variable, and prefer a throwaway deployer key for testing._
Deploy with Foundry[](https://docs.robinhood.com/chain/deploy-smart-contracts/#deploy-with-foundry)
------------------------------------------------------------------------------------------------------
###
1\. Install Foundry[](https://docs.robinhood.com/chain/deploy-smart-contracts/#1-install-foundry)
If Foundry is already installed, skip this step. Run the installer and follow the prompts:
Copy
`# Install foundryup curl -L https://foundry.paradigm.xyz | bash # Install forge, anvil, cast, and chisel foundryup`
###
2\. Create a project[](https://docs.robinhood.com/chain/deploy-smart-contracts/#2-create-a-project)
Copy
`# Initialize a new project mkdir rh-deploy && cd rh-deploy forge init`
###
3\. Create a contract[](https://docs.robinhood.com/chain/deploy-smart-contracts/#3-create-a-contract)
Create `src/HelloRobinhood.sol` with the following content:
Copy
`// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; contract HelloRobinhood { function hello() external pure returns (string memory) { return "Hello, Robinhood Chain!"; } }`
###
4\. Deploy[](https://docs.robinhood.com/chain/deploy-smart-contracts/#4-deploy)
Copy
`# Set environment variables export PRIVATE_KEY=0x export RH_RPC_URL=https://rpc.mainnet.chain.robinhood.com # Deploy contract forge create HelloRobinhood \ --rpc-url $RH_RPC_URL \ --private-key $PRIVATE_KEY \ --broadcast`
###
5\. Verify on Block Explorer[](https://docs.robinhood.com/chain/deploy-smart-contracts/#5-verify-on-block-explorer)
Copy
`# Verify the contract on Blockscout forge verify-contract \ src/HelloRobinhood.sol:HelloRobinhood \ --chain-id 4663 \ --rpc-url $RH_RPC_URL \ --verifier blockscout \ --verifier-url https://robinhoodchain.blockscout.com/api/`
After verification, view your contract at `https://robinhoodchain.blockscout.com/address/`.
Deploy with Hardhat[](https://docs.robinhood.com/chain/deploy-smart-contracts/#deploy-with-hardhat)
------------------------------------------------------------------------------------------------------
###
1\. Create a project[](https://docs.robinhood.com/chain/deploy-smart-contracts/#1-create-a-project)
Initialize your environment and Hardhat project:
Copy
`# Initialize project and install Hardhat mkdir rh-deploy && cd rh-deploy npm init -y npm install --save-dev hardhat npx hardhat init`
###
2\. Configure Robinhood Chain[](https://docs.robinhood.com/chain/deploy-smart-contracts/#2-configure-robinhood-chain)
Update `hardhat.config.js` with the network settings:
Copy
`require("@nomicfoundation/hardhat-toolbox"); module.exports = { solidity: "0.8.13", networks: { robinhood: { url: process.env.RH_RPC_URL, chainId: 4663, accounts: [process.env.PRIVATE_KEY], }, }, etherscan: { apiKey: { robinhood: "empty" }, customChains: [ { network: "robinhood", chainId: 4663, urls: { apiURL: "https://robinhoodchain.blockscout.com/api", browserURL: "https://robinhoodchain.blockscout.com/", }, }, ], }, };`
Set your environment variables before proceeding:
Copy
`export PRIVATE_KEY=0x export RH_RPC_URL=https://rpc.mainnet.chain.robinhood.com`
###
3\. Create a contract[](https://docs.robinhood.com/chain/deploy-smart-contracts/#3-create-a-contract-1)
Create `contracts/HelloRobinhood.sol`:
Copy
`// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; contract HelloRobinhood { function hello() external pure returns (string memory) { return "Hello, Robinhood Chain!"; } }`
###
4\. Compile and Deploy[](https://docs.robinhood.com/chain/deploy-smart-contracts/#4-compile-and-deploy)
Create `scripts/deploy.js` and then execute the deployment command:
Copy
`const hre = require("hardhat"); async function main() { const contract = await hre.ethers.deployContract("HelloRobinhood"); await contract.waitForDeployment(); console.log("Deployed to:", await contract.getAddress()); } main().catch((error) => { console.error(error); process.exitCode = 1; });`
Copy
`# Compile and run deployment script npx hardhat compile npx hardhat run scripts/deploy.js --network robinhood`
###
5\. Verify on Block Explorer[](https://docs.robinhood.com/chain/deploy-smart-contracts/#5-verify-on-block-explorer-1)
Copy
`# Verify the contract on Blockscout npx hardhat verify --network robinhood `
After verification, view your contract at `https://robinhoodchain.blockscout.com/address/`.
---
# Robinhood Chain Contracts – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/protocol-contracts/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Protocol Contracts
On this page
Chevron Right
Core contracts[](https://docs.robinhood.com/chain/protocol-contracts/#core-contracts)
----------------------------------------------------------------------------------------
The following contracts are deployed on Ethereum (L1).
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| Rollup | [**`0x23A19d23e89166adedbDcB432518AB01e4272D94`**](https://etherscan.io/address/0x23A19d23e89166adedbDcB432518AB01e4272D94) | [**`0xdc5F8E399DBd8a9F5F87AeC4C23Beb12431b386D`**](https://sepolia.etherscan.io/address/0xdc5F8E399DBd8a9F5F87AeC4C23Beb12431b386D) |
| Sequencer Inbox | [**`0xBd0D173EEb87D57A09521c24388a12789F33ba96`**](https://etherscan.io/address/0xBd0D173EEb87D57A09521c24388a12789F33ba96) | [**`0xA0D9dB3DC9791D54b5183C1C1866eFe1eCA7D414`**](https://sepolia.etherscan.io/address/0xA0D9dB3DC9791D54b5183C1C1866eFe1eCA7D414) |
| CoreProxyAdmin | [**`0x1232813BDd40aa9d53066A880dE78a4Be70B90FD`**](https://etherscan.io/address/0x1232813BDd40aa9d53066A880dE78a4Be70B90FD) | [**`0x20d5d542c1bF0a3c295524Eaef336fC07e890622`**](https://sepolia.etherscan.io/address/0x20d5d542c1bF0a3c295524Eaef336fC07e890622) |
Cross-chain messaging contracts[](https://docs.robinhood.com/chain/protocol-contracts/#cross-chain-messaging-contracts)
--------------------------------------------------------------------------------------------------------------------------
The following contracts are deployed on Ethereum (L1).
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| Delayed Inbox | [**`0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D`**](https://etherscan.io/address/0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D) | [**`0xF2939afA86F6f933A3CE17fCAB007907B6b0B7a4`**](https://sepolia.etherscan.io/address/0xF2939afA86F6f933A3CE17fCAB007907B6b0B7a4) |
| Bridge | [**`0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3`**](https://etherscan.io/address/0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3) | [**`0x96295BDad104eaD97cC08797b3dC68efF59CcF30`**](https://sepolia.etherscan.io/address/0x96295BDad104eaD97cC08797b3dC68efF59CcF30) |
| Outbox | [**`0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9`**](https://etherscan.io/address/0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9) | [**`0x8D180Caf588f3Da027BEf1F42a106Da93F90b166`**](https://sepolia.etherscan.io/address/0x8D180Caf588f3Da027BEf1F42a106Da93F90b166) |
Token bridge smart contracts[](https://docs.robinhood.com/chain/protocol-contracts/#token-bridge-smart-contracts)
--------------------------------------------------------------------------------------------------------------------
###
Core contracts (L1)[](https://docs.robinhood.com/chain/protocol-contracts/#core-contracts-l1)
The following contracts are deployed on Ethereum (L1).
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| L1 Gateway Router | [**`0x6a2E3a1e16FC29f27Ce61429746D558d656975bB`**](https://etherscan.io/address/0x6a2E3a1e16FC29f27Ce61429746D558d656975bB) | [**`0xF6F11aAEE80875776C264d93B37B34cE437382D1`**](https://sepolia.etherscan.io/address/0xF6F11aAEE80875776C264d93B37B34cE437382D1) |
| L1 ERC20 Gateway | [**`0x85001CC4867C5e1C22dA4B79BB8852B9e2a06da0`**](https://etherscan.io/address/0x85001CC4867C5e1C22dA4B79BB8852B9e2a06da0) | [**`0x52C2976cbDEf48BcC51d07d3c523769F76ECBd09`**](https://sepolia.etherscan.io/address/0x52C2976cbDEf48BcC51d07d3c523769F76ECBd09) |
| L1 Arb-Custom Gateway | [**`0x9368EAEbFe6E063C69dcF8126711A6997E0eCeE1`**](https://etherscan.io/address/0x9368EAEbFe6E063C69dcF8126711A6997E0eCeE1) | [**`0xFB4aa8024F70B00121723A9C923BaD0Dd2dFaf8F`**](https://sepolia.etherscan.io/address/0xFB4aa8024F70B00121723A9C923BaD0Dd2dFaf8F) |
| L1 Weth Gateway | [**`0xF7e12b9614b509C747ab4423bC4ACF923759Cf1B`**](https://etherscan.io/address/0xF7e12b9614b509C747ab4423bC4ACF923759Cf1B) | [**`0x8f8A6799F2b1978c6586318543c73D8Fb12f218f`**](https://sepolia.etherscan.io/address/0x8f8A6799F2b1978c6586318543c73D8Fb12f218f) |
| L1 Weth | [**`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`**](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) | [**`0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9`**](https://sepolia.etherscan.io/address/0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9) |
| L1 Proxy Admin | [**`0x1232813BDd40aa9d53066A880dE78a4Be70B90FD`**](https://etherscan.io/address/0x1232813BDd40aa9d53066A880dE78a4Be70B90FD) | [**`0x20d5d542c1bF0a3c295524Eaef336fC07e890622`**](https://sepolia.etherscan.io/address/0x20d5d542c1bF0a3c295524Eaef336fC07e890622) |
| L1 Multicall | [**`0x7cdCB0Cc61f47B8Dd8f47C5A29edaDd84a1BDf5e`**](https://etherscan.io/address/0x7cdCB0Cc61f47B8Dd8f47C5A29edaDd84a1BDf5e) | |
###
Core contracts (L2)[](https://docs.robinhood.com/chain/protocol-contracts/#core-contracts-l2)
The following contracts are deployed on the corresponding L2 chain.
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| L2 Gateway Router | [**`0x1E324B9316138CA9a73F960213621AD1aaf01B89`**](https://robinhoodchain.blockscout.com/address/0x1E324B9316138CA9a73F960213621AD1aaf01B89) | [**`0x77bF00A6A90c600f214b34BAFBB7918c0cF113A8`**](https://explorer.testnet.chain.robinhood.com/address/0x77bF00A6A90c600f214b34BAFBB7918c0cF113A8) |
| L2 ERC20 Gateway | [**`0xfd9b17206278C16DdaacF6AC8f05dBf97EdCb31e`**](https://robinhoodchain.blockscout.com/address/0xfd9b17206278C16DdaacF6AC8f05dBf97EdCb31e) | [**`0x8689aFB9086734e12beA6b5DF541a1da252Ea32a`**](https://explorer.testnet.chain.robinhood.com/address/0x8689aFB9086734e12beA6b5DF541a1da252Ea32a) |
| L2 Arb-Custom Gateway | [**`0x912285144fC0f6e89d3Ed16F5Ab72f87A1878959`**](https://robinhoodchain.blockscout.com/address/0x912285144fC0f6e89d3Ed16F5Ab72f87A1878959) | [**`0xE4EE9C15e2cA44136796342e31b67d953E67a70b`**](https://explorer.testnet.chain.robinhood.com/address/0xE4EE9C15e2cA44136796342e31b67d953E67a70b) |
| L2 Weth Gateway | [**`0x1D187C3E2dA52D72BC9C41e3AbA0fdFa6a7bF055`**](https://robinhoodchain.blockscout.com/address/0x1D187C3E2dA52D72BC9C41e3AbA0fdFa6a7bF055) | [**`0x5A8F55202A625D12FFCb76F857FE4563bC8Ce413`**](https://explorer.testnet.chain.robinhood.com/address/0x5A8F55202A625D12FFCb76F857FE4563bC8Ce413) |
| L2 Weth | [**`0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73`**](https://robinhoodchain.blockscout.com/address/0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73) | [**`0x7943e237c7F95DA44E0301572D358911207852Fa`**](https://explorer.testnet.chain.robinhood.com/address/0x7943e237c7F95DA44E0301572D358911207852Fa) |
| L2 Proxy Admin | [**`0xa3Acd31AFb851B4eB9DAD00F5204c01D924267dF`**](https://robinhoodchain.blockscout.com/address/0xa3Acd31AFb851B4eB9DAD00F5204c01D924267dF) | [**`0xE743e696B00789Ef489cF617477771764E9283a0`**](https://explorer.testnet.chain.robinhood.com/address/0xE743e696B00789Ef489cF617477771764E9283a0) |
Precompiles[](https://docs.robinhood.com/chain/protocol-contracts/#precompiles)
----------------------------------------------------------------------------------
The following precompiles are deployed on every L2 chain and always have the same address.
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| ArbAddressTable | [**`0x0000000000000000000000000000000000000066`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000066) | [**`0x0000000000000000000000000000000000000066`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000066) |
| ArbAggregator | [**`0x000000000000000000000000000000000000006D`**](https://robinhoodchain.blockscout.com/address/0x000000000000000000000000000000000000006D) | [**`0x000000000000000000000000000000000000006D`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000000000000000000000000000000006D) |
| ArbFunctionTable | [**`0x0000000000000000000000000000000000000068`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000068) | [**`0x0000000000000000000000000000000000000068`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000068) |
| ArbGasInfo | [**`0x000000000000000000000000000000000000006C`**](https://robinhoodchain.blockscout.com/address/0x000000000000000000000000000000000000006C) | [**`0x000000000000000000000000000000000000006C`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000000000000000000000000000000006C) |
| ArbInfo | [**`0x0000000000000000000000000000000000000065`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000065) | [**`0x0000000000000000000000000000000000000065`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000065) |
| ArbOwner | [**`0x0000000000000000000000000000000000000070`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000070) | [**`0x0000000000000000000000000000000000000070`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000070) |
| ArbOwnerPublic | [**`0x000000000000000000000000000000000000006b`**](https://robinhoodchain.blockscout.com/address/0x000000000000000000000000000000000000006b) | [**`0x000000000000000000000000000000000000006b`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000000000000000000000000000000006b) |
| ArbRetryableTx | [**`0x000000000000000000000000000000000000006E`**](https://robinhoodchain.blockscout.com/address/0x000000000000000000000000000000000000006E) | [**`0x000000000000000000000000000000000000006E`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000000000000000000000000000000006E) |
| ArbStatistics | [**`0x000000000000000000000000000000000000006F`**](https://robinhoodchain.blockscout.com/address/0x000000000000000000000000000000000000006F) | [**`0x000000000000000000000000000000000000006F`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000000000000000000000000000000006F) |
| ArbSys | [**`0x0000000000000000000000000000000000000064`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000064) | [**`0x0000000000000000000000000000000000000064`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000064) |
| ArbWasm | [**`0x0000000000000000000000000000000000000071`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000071) | [**`0x0000000000000000000000000000000000000071`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000071) |
| ArbWasmCache | [**`0x0000000000000000000000000000000000000072`**](https://robinhoodchain.blockscout.com/address/0x0000000000000000000000000000000000000072) | [**`0x0000000000000000000000000000000000000072`**](https://explorer.testnet.chain.robinhood.com/address/0x0000000000000000000000000000000000000072) |
| NodeInterface | [**`0x00000000000000000000000000000000000000C8`**](https://robinhoodchain.blockscout.com/address/0x00000000000000000000000000000000000000C8) | [**`0x00000000000000000000000000000000000000C8`**](https://explorer.testnet.chain.robinhood.com/address/0x00000000000000000000000000000000000000C8) |
Misc[](https://docs.robinhood.com/chain/protocol-contracts/#misc)
--------------------------------------------------------------------
The following contracts are deployed on the corresponding L2 chain.
| Contract | Robinhood Chain | Robinhood Chain Testnet |
| --- | --- | --- |
| L2 Multicall | [**`0x2cAC2D899eCC914d704FeaAE33ac1bF36277DaD1`**](https://robinhoodchain.blockscout.com/address/0x2cAC2D899eCC914d704FeaAE33ac1bF36277DaD1) | [**`0xa432504b6F04Cafe775b09D8AA92e8dbe41Ec7a8`**](https://explorer.testnet.chain.robinhood.com/address/0xa432504b6F04Cafe775b09D8AA92e8dbe41Ec7a8) |
| Permit2 | [**`0x000000000022D473030F116dDEE9F6B43aC78BA3`**](https://robinhoodchain.blockscout.com/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | [**`0x000000000022D473030F116dDEE9F6B43aC78BA3`**](https://explorer.testnet.chain.robinhood.com/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) |
---
# Cross-Chain Messaging – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/cross-chain-messaging/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Cross-Chain Messaging
On this page
Chevron Right
Robinhood Chain supports arbitrary message passing between Ethereum (L1) and Robinhood Chain (L2). This is the lower-level primitive beneath [Bridging](https://docs.robinhood.com/chain/bridging)
— where bridging moves assets, cross-chain messaging passes arbitrary calls and data, letting you call an L2 contract from Ethereum or trigger an L1 action from L2.
Messaging works in two directions:
* L1 → L2 via retryable tickets, submitted through the Delayed Inbox. Typically completes in minutes.
* L2 → L1 via the ArbSys precompile. Subject to the 7-day challenge period before it can be executed on Ethereum.
Robinhood Chain is an Arbitrum Chain, so messaging uses the standard Arbitrum Nitro mechanisms. We recommend the Arbitrum SDK (`@arbitrum/sdk`) rather than encoding messages by hand.
Key contracts[](https://docs.robinhood.com/chain/cross-chain-messaging/#key-contracts)
-----------------------------------------------------------------------------------------
| Contract | Layer | Address |
| --- | --- | --- |
| Delayed Inbox | Ethereum (L1) | **`0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D`** |
| Bridge | Ethereum (L1) | **`0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3`** |
| Outbox | Ethereum (L1) | **`0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9`** |
| Rollup | Ethereum (L1) | **`0x23A19d23e89166adedbDcB432518AB01e4272D94`** |
| ArbSys | Robinhood Chain (L2) | **`0x0000000000000000000000000000000000000064`** |
Register Robinhood Chain with the Arbitrum SDK[](https://docs.robinhood.com/chain/cross-chain-messaging/#register-robinhood-chain-with-the-arbitrum-sdk)
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Because Robinhood Chain is a custom Arbitrum chain, register it once before using the SDK:
Copy
`import { registerCustomArbitrumNetwork } from "@arbitrum/sdk"; registerCustomArbitrumNetwork({ name: "Robinhood Chain", chainId: 4663, parentChainId: 1, // Ethereum mainnet confirmPeriodBlocks: 45818, ethBridge: { bridge: "0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3", inbox: "0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D", sequencerInbox: "0xBd0D173EEb87D57A09521c24388a12789F33ba96", outbox: "0xf0ce991ea4A0d2400A4AB49b20ae333f6Dce3DE9", rollup: "0x23A19d23e89166adedbDcB432518AB01e4272D94", }, });`
L1 → L2 messaging (retryable tickets)[](https://docs.robinhood.com/chain/cross-chain-messaging/#l1--l2-messaging-retryable-tickets)
--------------------------------------------------------------------------------------------------------------------------------------
To send a message from Ethereum to a contract on Robinhood Chain, create a retryable ticket through the Delayed Inbox. The Arbitrum SDK handles gas estimation and submission:
Copy
`import { ParentToChildMessageCreator } from "@arbitrum/sdk"; const messageCreator = new ParentToChildMessageCreator(parentSigner); // an Ethereum signer const tx = await messageCreator.createRetryableTicket( { to: "0x...", // target contract on Robinhood Chain data: "0x...", // calldata l2CallValue: 0n, from: await parentSigner.getAddress(), }, childProvider // a Robinhood Chain provider ); await tx.wait();`
If the L2 execution fails (for example, due to insufficient gas), the ticket is not lost — it can be redeemed manually within 7 days.
Address aliasing: When an L1 contract calls an L2 contract via a retryable ticket, the `msg.sender` seen on Robinhood Chain is not the original L1 address — it is the aliased address (the L1 address plus a fixed offset). Account for this in any access-control logic that checks the caller. Use the SDK's `applyAlias` / `undoAlias` helpers to convert between the two.
L2 → L1 messaging[](https://docs.robinhood.com/chain/cross-chain-messaging/#l2--l1-messaging)
------------------------------------------------------------------------------------------------
Sending a message from Robinhood Chain to Ethereum is a two-step process: initiate on L2, then execute on L1 after the challenge period.
###
1\. Initiate the message (on Robinhood Chain)[](https://docs.robinhood.com/chain/cross-chain-messaging/#1-initiate-the-message-on-robinhood-chain)
Interact with the ArbSys precompile via the SDK to trigger the L2 transaction. This method removes the necessity for custom wrapper contracts:
Copy
`import { ArbSys__factory } from "@arbitrum/sdk"; const arbSys = ArbSys__factory.connect( "0x0000000000000000000000000000000000000064", childSigner // a Robinhood Chain signer ); const tx = await arbSys.sendTxToL1( destinationL1Address, // target contract on Ethereum data, // calldata { value: 0n } ); const receipt = await tx.wait();`
If one of your own contracts needs to trigger an L2→L1 message, it can call `ArbSys(0x…64).sendTxToL1(...)` directly. For sending a standalone message, the SDK call above is enough.
###
2\. Execute the message (on Ethereum)[](https://docs.robinhood.com/chain/cross-chain-messaging/#2-execute-the-message-on-ethereum)
Once the 7-day challenge period concludes, final execution occurs on L1 by claiming the message through the Outbox. The SDK simplifies this workflow:
Copy
`import { ChildTransactionReceipt } from "@arbitrum/sdk"; const childReceipt = new ChildTransactionReceipt(receipt); const [message] = await childReceipt.getChildToParentMessages(parentSigner); // This promise resolves only after the challenge window expires await message.waitUntilReadyToExecute(childProvider); await message.execute(parentSigner);`
Further reading[](https://docs.robinhood.com/chain/cross-chain-messaging/#further-reading)
---------------------------------------------------------------------------------------------
* [Arbitrum SDK](https://docs.arbitrum.io/sdk)
* [Arbitrum cross-chain messaging docs](https://docs.arbitrum.io/how-arbitrum-works/l1-to-l2-messaging)
* [Bridging](https://docs.robinhood.com/chain/bridging)
— for moving assets rather than messages
---
# Oracles & Price Feeds – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/oracles-and-price-feeds/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Oracles & Price Feeds
On this page
Chevron Right
Robinhood Chain uses [Chainlink](https://chain.link/)
for onchain price data. Both crypto assets and Stock Tokens have Chainlink price feeds, so your contracts can read reliable prices directly onchain — including live prices for tokenized equities and ETFs.
Reading a price feed[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#reading-a-price-feed)
---------------------------------------------------------------------------------------------------------
Chainlink price feeds implement the standard `AggregatorV3Interface`. Read the latest price with `latestRoundData()`, accessed through the feed's proxy address:
Copy
`// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface AggregatorV3Interface { function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function decimals() external view returns (uint8); } contract PriceConsumer { AggregatorV3Interface internal priceFeed; constructor(address feedProxy) { priceFeed = AggregatorV3Interface(feedProxy); } function getLatestPrice() public view returns (int256) { (, int256 answer, , uint256 updatedAt, ) = priceFeed.latestRoundData(); require(answer > 0, "Invalid price"); require(updatedAt > 0, "Round not complete"); return answer; } }`
Decimals: prices are returned as integers — call `decimals()` to scale. Most USD feeds use 8 decimals (e.g. 30000000000 at 8 decimals = $300.00).
Stock Token price feeds[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#stock-token-price-feeds)
---------------------------------------------------------------------------------------------------------------
Each Stock Token on Robinhood Chain has its own Chainlink price feed. These feeds use the same `AggregatorV3Interface` and `latestRoundData()` as crypto feeds — reading a stock price is identical to reading any other Chainlink feed. Point the consumer above at the stock's feed proxy.
The feed returns the price of one token, which is the underlying share price times the multiplier. `latestRoundData()` returns this directly, so you don't apply the multiplier yourself. The multiplier accounts for corporate actions (dividends, splits) and is also readable onchain via the token's `uiMultiplier()`.
The token price diverges from the underlying share price over time. Because dividends are reinvested into the token via the multiplier, a stock token tracks the total return of the underlying — price changes plus reinvested dividends — not just the share price. As dividends accrue, the multiplier rises and one token comes to represent more than one share, so the feed price drifts above the headline share price. This is expected.
Example: a token tracking a $100 stock starts at a multiplier of 1.0 (1 token = 1 share, feed price $100). After a dividend is reinvested, the multiplier rises to ~1.05 — one token now represents 1.05 shares. If the share price is still $100, the feed price is $105 (1.05 × $100). `latestRoundData()` always returns this full, multiplier-adjusted value.
Stock feeds update 24/5, following market hours.
###
Displaying balances and prices[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#displaying-balances-and-prices)
The feed returns the price of a single token. `uiMultiplier()` is the shares-per-token ratio, returned as an integer scaled by 1e18. Always divide by 1e18 after applying it (as shown below), otherwise the result is off by a factor of 1e18. Depending on what you want to show users:
* Token value (default): use the feed price directly.
* Underlying share price: `feedPrice * 1e18 / uiMultiplier()`
* Share-equivalent units: `balance * uiMultiplier() / 1e18`
The economic value is identical in every case — only the presentation differs.
See [Building with Stock Tokens](https://docs.robinhood.com/chain/building-with-stock-tokens)
for end-to-end examples.
Available feeds[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#available-feeds)
-----------------------------------------------------------------------------------------------
Feed proxy addresses, decimals, and heartbeats are maintained by Chainlink. See the [Robinhood price feeds page](https://docs.chain.link/data-feeds/price-feeds/addresses?network=robinhood)
for the current list — it's the source of truth, so always read addresses and parameters from there rather than hardcoding them.
Checking sequencer uptime (recommended on L2)[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#checking-sequencer-uptime-recommended-on-l2)
---------------------------------------------------------------------------------------------------------------------------------------------------------
Because Robinhood Chain is a Layer-2, verify the sequencer is up before trusting a price — during a sequencer outage, feeds can go stale. Chainlink provides an L2 Sequencer Uptime Feed for this; check it before reading any price:
Copy
`(, int256 sequencerStatus, uint256 startedAt, , ) = sequencerUptimeFeed.latestRoundData(); require(sequencerStatus == 0, "Sequencer down"); // 0 = up require(block.timestamp - startedAt > GRACE_PERIOD, "Grace period not over");`
Oracle Pauses During Corporate Actions[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#oracle-pauses-during-corporate-actions)
---------------------------------------------------------------------------------------------------------------------------------------------
While a corporate action is being processed, the price oracle for the affected token is **paused** — feeds are expected to stop publishing fresh prices while the token's terms or multiplier are being updated — and **unpaused** once processing completes. You can read this state on-chain via `oraclePaused()` on the token.
Integrators reading prices on-chain should treat a paused oracle as "price temporarily unavailable" for that token, rather than as a zero or stale price. The flag is advisory and not enforced on-chain, so a paused oracle may still return a value — keep your staleness check (`updatedAt` vs. heartbeat) as the primary guard rather than relying on the flag alone. These pause windows align with the trading pauses around corporate actions.
Best practices[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#best-practices)
---------------------------------------------------------------------------------------------
* Check staleness — compare `updatedAt` against the feed's heartbeat; reject stale prices.
* Validate the answer — reject zero or negative values.
* Read `decimals()` — never hard-code.
* Check sequencer uptime — see above.
* Account for the multiplier on corp actions — the feed quotes per-token price; read `uiMultiplier()` (and pending `newUIMultiplier()` / `effectiveAt()`) consistently before converting to share terms.
* Check the oracle pause flag — read `oraclePaused()`; treat `true` as "do not trust the price," but keep your staleness check as the primary guard since the flag is advisory and not enforced on-chain.
Further reading[](https://docs.robinhood.com/chain/oracles-and-price-feeds/#further-reading)
-----------------------------------------------------------------------------------------------
* [Chainlink Data Feeds](https://docs.chain.link/data-feeds)
* [Chainlink L2 Sequencer Uptime Feeds](https://docs.chain.link/data-feeds/l2-sequencer-feeds)
* [Building with Stock Tokens](https://docs.robinhood.com/chain/building-with-stock-tokens)
---
# Run a Robinhood Chain full node – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/run-a-full-node/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Run a full node
On this page
Chevron Right
Robinhood Chain is an Arbitrum Chain running Arbitrum Nitro. This guide walks through deploying and syncing your own full node.
Running a node is time consuming, resource intensive, and potentially costly. If you don't already know why you need your own node, you probably don't.
If you just need an RPC endpoint, use the public endpoints or a provider:
* Public Mainnet: `https://rpc.mainnet.chain.robinhood.com`
* Alchemy: `https://robinhood-mainnet.g.alchemy.com/v2/{API_KEY}`
Download the Robinhood Chain mainnet genesis config [here](https://cdn.robinhood.com/assets/generated_assets/hoodchain_docsite/chain-node-configs/robinhood-genesis.json)
, or the testnet node config [here](https://cdn.robinhood.com/assets/generated_assets/hoodchain_docsite/chain-node-configs/robinhood-chain-testnet-config.json)
.
Hardware requirements[](https://docs.robinhood.com/chain/run-a-full-node/#hardware-requirements)
---------------------------------------------------------------------------------------------------
| Component | Requirement |
| --- | --- |
| CPU | Modern multi-core (8+) CPU with strong single-core performance |
| RAM | 64 GB RAM (128 GB recommended) |
| Storage | Locally attached NVMe SSD; (2 × current chain size) + 20% buffer. Several TBs of data |
| Node Type | Full node (Archive nodes require substantially more disk capacity) |
Prerequisites[](https://docs.robinhood.com/chain/run-a-full-node/#prerequisites)
-----------------------------------------------------------------------------------
Because Robinhood Chain posts its data to Ethereum, your node needs access to an Ethereum (L1) endpoint — your own or via a provider.
You need both:
* An L1 execution RPC endpoint
* An L1 beacon (consensus) endpoint — required to read blob data
If you run your own L1 node, it must be fully synced before Robinhood Chain can finish syncing.
You'll also need Docker installed and running.
Running the node[](https://docs.robinhood.com/chain/run-a-full-node/#running-the-node)
-----------------------------------------------------------------------------------------
Start the node with Docker, supplying your L1 endpoints and the Robinhood Chain config:
Copy
`docker run --rm -it \ -v /path/to/data:/home/user/.arbitrum \ -p 8547:8547 -p 8548:8548 \ offchainlabs/nitro-node:v3.11 \ --parent-chain.connection.url= \ --parent-chain.blob-client.beacon-url= \ --chain.id=4663 \ --init.genesis-json-file=/path/to/robinhood-genesis.json \ --http.addr=0.0.0.0 --http.port=8547 \ --http.api=net,web3,eth`
To subscribe to the sequencer feed for low-latency updates, add `--node.feed.input.url=wss://feed.mainnet.chain.robinhood.com`. The feed URL must be `wss://`, not `https://`.
Once running, confirm the node responds:
Copy
`curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false]}' \ -H "Content-Type: application/json" http://localhost:8547`
Initial sync can take a long time and will consume significant L1 request quota — monitor your L1 provider usage.
Running a validator[](https://docs.robinhood.com/chain/run-a-full-node/#running-a-validator)
-----------------------------------------------------------------------------------------------
Robinhood Chain utilizes BoLD for dispute resolution through a permissioned set of validators. Operating a validator necessitates being included in the allowlist and staking a 1 WETH bond (defensive validators are highly encouraged). Reach out to Robinhood to become part of the validator set.
Syncing[](https://docs.robinhood.com/chain/run-a-full-node/#syncing)
-----------------------------------------------------------------------
Check sync progress with `eth_syncing`. A fully synced node returns `false`:
Copy
`curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_syncing","params":[]}' \ -H "Content-Type: application/json" http://localhost:8547`
You can also watch the node logs for block production messages.
If you try to send transactions before the node is fully synced, you may see `nonce has already been used` — wait for sync to complete.
Faster sync (optional): to skip syncing from genesis, initialize from a snapshot by adding `--init.url=` on first start.
Node configuration[](https://docs.robinhood.com/chain/run-a-full-node/#node-configuration)
---------------------------------------------------------------------------------------------
Robinhood Chain requires the genesis configuration provided by Robinhood, passed to the node via `--init.genesis-json-file` (see Running the node).
Robinhood Chain runs ArbOS 61. Confirm the current Nitro/ArbOS version before starting. On ArbOS upgrades, un-upgraded nodes stop cleanly and resume after updating — with no data loss.
Troubleshooting[](https://docs.robinhood.com/chain/run-a-full-node/#troubleshooting)
---------------------------------------------------------------------------------------
###
General checks[](https://docs.robinhood.com/chain/run-a-full-node/#general-checks)
* View logs via `docker logs -f ` to identify errors.
* Confirm the container status is healthy and not in a restart loop.
* Verify network connectivity to L1 execution and beacon endpoints from the host.
* Confirm your L1 node is fully synced; an unsynced L1 will stall L2 syncing.
###
Syncing issues[](https://docs.robinhood.com/chain/run-a-full-node/#syncing-issues)
* Check the L1 connection and beacon URL; most failures are due to unreachable beacon endpoints.
* Ensure the server clock is accurate using `ntp` or `chrony`.
Sync is slow:
* Verify disk I/O performance; networked storage will significantly throttle sync speed.
###
Connectivity issues[](https://docs.robinhood.com/chain/run-a-full-node/#connectivity-issues)
* Verify container ports (8547 for HTTP, 8548 for WS) are correctly mapped and open.
* Ensure `--http.addr=0.0.0.0` is set to allow external RPC access.
Support[](https://docs.robinhood.com/chain/run-a-full-node/#support)
-----------------------------------------------------------------------
[Robinhood Chain Support](mailto:chain-developers-group@robinhood.com)
---
# Notices & Upgrades – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/notices-and-upgrades/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Overview
On this page
Chevron Right
This section lists network upgrade notices and configuration changes for Robinhood Chain.
* Node operators should monitor this page — some upgrades require you to update your node before a scheduled activation.
* Developers should review notices for any behavior changes that could affect contracts or integrations.
* End users generally don't need to take action.
How network upgrades work[](https://docs.robinhood.com/chain/notices-and-upgrades/#how-network-upgrades-work)
----------------------------------------------------------------------------------------------------------------
Robinhood Chain runs Arbitrum Nitro and periodically upgrades its ArbOS version. These upgrades activate onchain at a scheduled time. Before each activation, node operators must run a compatible Nitro node version — an un-upgraded node stops cleanly at the upgrade block and resumes normally once updated, with no data loss or resync required. Most upgrades require no action from dApp developers or end users, though some include EVM or behavior changes worth reviewing.
Notices[](https://docs.robinhood.com/chain/notices-and-upgrades/#notices)
----------------------------------------------------------------------------
| Date | Notice | Status |
| --- | --- | --- |
---
# Report an issue – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/report-issue/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Report an issue
On this page
Chevron Right
This document provides an overview of how to report issues or questions for Robinhood Chain.
* To report technical issues, please contact us [here](mailto:chain-developers-group@robinhood.com)
.
* To report potential vulnerabilities, please submit a report [here](mailto:chain-developers-group@robinhood.com)
.
* To discuss partnerships, please contact us [here](mailto:chain-developers-group@robinhood.com)
.
---
# Robinhood Chain Terms of Service – Robinhood Chain Documentation
[Skip to content](https://docs.robinhood.com/chain/terms-of-service/#vocs-content)
Search...
[](https://docs.robinhood.com/chain)
[](https://docs.robinhood.com/chain)
Menu
Chevron Down
Menu
Terms of Service
On this page
Chevron Right
Introduction[](https://docs.robinhood.com/chain/terms-of-service/#introduction)
----------------------------------------------------------------------------------
These Terms of Service ("Terms") set forth the legally binding terms and conditions that govern your access to and use of Robinhood Chain Sequencer, Robinhood Chain Public RPC, Full Node Snapshot, and the Robinhood Chain Testnet, each which is defined below, and any other content, tools, documentation, SDKs, features, and functionality made available on or through [https://docs.robinhood.com/chain](https://docs.robinhood.com/chain)
(collectively, the "Services"). The Services are provided by RHDA, LLC ("Robinhood," "we," "us," or "our").
For purposes of these Terms, "you" and "your" refer to you as the user of the Services; if you access or use the Services on behalf of a company or other entity, "you" includes both you and that entity, and you represent and warrant that you have the authority to bind the entity to these Terms and that you agree to these Terms on its behalf.
By using or accessing the Services, you agree to be bound by these Terms and any documentation and guidelines accompanying the Services, and all other terms, policies, and guidelines applicable to your use. If you do not agree to these Terms, please do not access or use the Services.
**SECTION 12 OF THESE TERMS CONTAIN A MANDATORY ARBITRATION AGREEMENT PURSUANT TO THE FEDERAL ARBITRATION ACT AND A WAIVER OF YOUR RIGHT TO BRING OR JOIN A CLASS PROCEEDING. THE ARBITRATION AGREEMENT REQUIRES THAT YOU MAY ONLY BRING CLAIMS ON AN INDIVIDUAL BASIS AND WILL PROHIBIT YOU FROM HAVING ANY CLAIMS AGAINST US RESOLVED BY A JURY OR IN A COURT OF LAW. BY ACCESSING OR USING THE SERVICES, YOU AGREE TO RESOLVE ALL DISPUTES CONCERNING THE SERVICES THROUGH ARBITRATION IF YOU OR WE ELECT TO USE ARBITRATION. YOU HAVE THE RIGHT TO REJECT THE ARBITRATION AGREEMENT AS SET FORTH BELOW.**
Accessing Services[](https://docs.robinhood.com/chain/terms-of-service/#accessing-services)
----------------------------------------------------------------------------------------------
###
The Services[](https://docs.robinhood.com/chain/terms-of-service/#the-services)
Robinhood Chain is a permissionless, Ethereum-compatible Layer-2 blockchain designed to support a new era of on-chain financial infrastructure ("Robinhood Chain"). You acknowledge and agree that the Services may contain bugs, errors, security vulnerabilities, or design flaws and may not function as intended. Developer documentation and related technical resources for the Services are available at [https://docs.robinhood.com/chain](https://docs.robinhood.com/chain)
.
**Robinhood Chain itself, including its protocol smart contracts and any associated bridging contracts that allow you to transfer Digital Assets between Robinhood Chain and other compatible networks (the "Bridging Smart Contracts"), nor any associated cross-chain oracle, verification services or other infrastructure (each, a "Third Party Provider") is not part of the Services.** Robinhood does not control what third parties build on Robinhood Chain, the activity of such parties, any user transacting on Robinhood Chain, and Robinhood does not take possession, custody, or control of any Digital Asset on Robinhood Chain or bridged through the Bridging Smart Contracts. You acknowledge and agree that Robinhood makes no representations or warranties with respect to Robinhood Chain or the Bridging Smart Contracts, and that, if you use Robinhood Chain or the Bridging Smart Contracts, you do so at your own risk. For purposes of these Terms, Digital "Assets" means any cryptocurrency, virtual currency, virtual commodity, digital representation of value, decentralized application tokens, protocol tokens, cryptofinance coins, tokens, or similar digital assets, blockchain-based assets, or other similar digital representations of assets, whether fungible or non-fungible.
Robinhood offers the following Services that enable you to access and interact with Robinhood Chain:
**The Sequencer:** Robinhood operates a sequencer node that receives, records, and reports transactions on Robinhood Chain (the "Robinhood Chain Sequencer"). The Robinhood Sequencer is non-custodial and it does not store, hold, or control your Digital Assets at any time, other than collecting applicable gas fees. The Robinhood Chain Sequencer cannot modify, reverse, or cancel transactions once submitted, and does not have access to your private keys. Robinhood makes no guarantee of uptime or continuous availability of the Robinhood Chain Sequencer and will not be liable for any losses arising from sequencer downtime, latency, or unavailability.
**Public RPC:** Robinhood makes available a public remote procedure call ("RPC") endpoint that allows you to read data from and broadcast transactions to Robinhood Chain (the "Robinhood Chain Public RPC"). The Robinhood Chain Public RPC is subject to rate limits and is not intended for production-grade, high-throughput, or latency-sensitive applications. Robinhood makes no guarantee of uptime, availability, or data completeness with respect to the Robinhood Chain Public RPC, and may throttle, suspend, modify, or discontinue the Robinhood Chain Public RPC at any time and without notice.
**Full Node Snapshot:** Robinhood may from time to time publish database snapshots of Robinhood Chain (each, a "Full Node Snapshot"). Full Node Snapshots are provided "as is" and solely as a convenience. Robinhood makes no representations or warranties regarding any Full Node Snapshot accuracy, completeness, integrity, or availability, and you are solely responsible for verifying any data obtained from a Full Node Snapshot against the canonical state of Robinhood Chain. Robinhood may change the format, hosting location, retention, or publication cadence of Full Node Snapshots, or discontinue them entirely, at any time and without notice.
**Robinhood Chain Testnet:** The Robinhood Chain Testnet is a test environment that allows you to build and test applications integrated with Robinhood Chain. You are permitted to access and use the Robinhood Chain Testnet only to test and improve the experience, security, and design of Robinhood Chain or applications built on it, subject to these Terms. Testnet tokens have no monetary value and will not be converted into any rewards offered by Robinhood. Robinhood may change, discontinue, or terminate all or any part of the Robinhood Chain Testnet at any time and without notice.
**Documentation and Developer Tools:** Robinhood makes available developer documentation, SDKs, APIs, and related tools through [https://docs.robinhood.com/chain](https://docs.robinhood.com/chain)
to facilitate development on Robinhood Chain.
###
Eligibility[](https://docs.robinhood.com/chain/terms-of-service/#eligibility)
To access or use the Services, you represent and warrant that: (a) you are at least eighteen (18) years old and have full legal capacity to enter into these Terms; (b) your access to and use of the Services is not prohibited by applicable laws or regulations in your jurisdiction; and (c) you are not a Prohibited Person. Robinhood reserves the right to verify eligibility and deny or terminate access at its discretion. You may not use a virtual private network (VPN), proxy, or other tool to mask or misrepresent your identity, location, or IP address in connection with your use of the Services, including for the purpose of circumventing any geographic or eligibility restriction.
For purposes of these Terms, a "Prohibited Person" means any individual or entity that is (a) the subject of sanctions administered by any governmental authority (including the U.S. Treasury Department's OFAC list, the U.K. or E.U. consolidated lists), (b) located, resident, or organized in any jurisdiction subject to comprehensive sanctions, or (c) owned or controlled by such persons.
###
Prohibited Use[](https://docs.robinhood.com/chain/terms-of-service/#prohibited-use)
You may use the Services only in accordance with these Terms. Further, you may not use the Services in connection with any of the following activities (each, a "Prohibited Use").
**Unlawful Activity.** Any activity that violates or facilitates the violation of applicable laws, regulations, or sanctions, or involves proceeds of unlawful activity, including the creation, distribution, or dissemination of unlawful content or information or assets illegally obtained.
**Abuse or Harm to Others.** Conduct that interferes with or restricts another person's use of the Services, including harassment, abuse, threats, stalking, defamation, extortion, impersonation, or infringement of others' legal rights; exploiting or harming minors; soliciting or misusing personal data; transmitting spam, junk mail, or other unsolicited promotional materials; or promoting hate, discrimination, or violence.
**Fraud or Deception.** Any activity intended to deceive or defraud Robinhood, other users, or third parties, including providing false, misleading, or inaccurate information, or engaging in conduct designed to misrepresent facts or unlawfully obtain property or value.
**Network Abuse or Security Violations.** Any activity that interferes with, disrupts, degrades, or attempts to circumvent the intended operation, security, or integrity of the Services, or any underlying blockchain or infrastructure, including unauthorized access attempts, use of automated tools (such as bots, scrapers, or spiders), denial-of-service activity, or bypassing technical or usage restrictions.
**Intellectual Property and Rights Violations.** Any activity that infringes, misappropriates, or otherwise violates the intellectual property, privacy, publicity, or other legal rights of Robinhood or any third party, including unauthorized use of Robinhood's name, trademarks, logos, or branding, or any conduct that falsely implies endorsement by or affiliation with Robinhood.
You further agree you will not encourage or induce any third party to engage in any Prohibited Use.
###
Acknowledgments and Covenants[](https://docs.robinhood.com/chain/terms-of-service/#acknowledgments-and-covenants)
By accessing or using the Services, you confirm that:
* you will use the Services solely for lawful testing, experimentation, evaluation, and development purposes;
* you will not engage in any Prohibited Use and will comply with all applicable laws, rules, and regulations, including sanctions and export control laws, in connection with your access to and use of the Services;
* your use of the Services is subject to and will comply with these Terms and all applicable technical documentation, guidelines, policies, and limitations provided by Robinhood, as may be updated from time to time, and you will not attempt to exceed, bypass, or circumvent any such limitations;
* you will not misrepresent, obscure, or mask your identity when using the Services, will avoid conflicts of interest and intentional unethical conduct, and will not intentionally or negligently cause reputational harm to Robinhood;
* you understand and acknowledge that Robinhood Chain may operate on public or semi-public infrastructure and that your activity—including addresses, transactions, smart contracts, and other interactions—may be publicly visible, and you do not expect privacy or confidentiality with respect to such activity;
* you will perform only those transactions and interactions that are lawful in your jurisdiction;
* you have obtained and reviewed sufficient information regarding the Services and related functionality to make an informed decision to access and use the Services;
* you bear sole responsibility for all activities conducted through or in connection with your access to the Services, including transactions, interactions, disclosures, submissions of information, and acceptance of agreements; and
* you have the legal authority to access and use the Services and to enter into these Terms, including on behalf of any entity you represent.
###
Beta Features[](https://docs.robinhood.com/chain/terms-of-service/#beta-features)
From time to time, Robinhood may make available through the Services certain features, services, smart contracts, tools, or functionality designated as "beta," "early access," "testnet," "preview," or similar labels (collectively, "Beta Features"). Beta Features may be made available to all users or to a limited subset of users at Robinhood's sole discretion. The availability of a Beta Feature does not constitute a commitment that such feature will ever be made generally available in any final or production form. Robinhood may modify, suspend, or discontinue any Beta Feature at any time, with or without notice, and without liability to you.
BETA FEATURES ARE PROVIDED ON AN "AS-IS" AND "AS-AVAILABLE" BASIS WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY. Beta Features may contain bugs, errors, or vulnerabilities—including in any associated smart contracts—that could result in unexpected behavior, failed transactions, or loss of Digital Assets. The disclaimers, limitations of liability, and assumption-of-risk provisions set forth elsewhere in these Terms apply with full force to your use of any Beta Feature. By accessing or using any Beta Feature, you represent that you understand and voluntarily accept the additional risks associated with pre-release software, including risks specific to blockchain technology and smart contracts, and that the general risk disclosures and liability limitations in these Terms apply to your use of Beta Features.
###
Additional Features, Services, and Products[](https://docs.robinhood.com/chain/terms-of-service/#additional-features-services-and-products)
Robinhood may from time to time offer additional features, products, or services through the Services (each, an "Additional Feature"). Your use of certain Additional Features may be subject to supplemental terms, conditions, policies, or guidelines made available by Robinhood in connection with such Additional Feature (collectively, "Supplemental Terms"). By accessing or using an Additional Feature, you agree to the applicable Supplemental Terms. All Supplemental Terms are hereby incorporated by reference into these Terms. In the event of a conflict between these Terms and any Supplemental Terms, the Supplemental Terms shall control solely with respect to the applicable Additional Feature.
Connecting a Wallet[](https://docs.robinhood.com/chain/terms-of-service/#connecting-a-wallet)
------------------------------------------------------------------------------------------------
To access and use certain Services you must use a non-custodial digital wallet that enables you to interact with public blockchains (a "Wallet"). All Services are non-custodial. At no point will Robinhood have custody, possession, access to, or control over your Wallet or its contents, including any Digital Assets. Your use of any Wallet is subject to the applicable terms of service or equivalent agreement of the applicable Wallet provider. You are solely responsible for maintaining the security of your Wallet, including safeguarding your cryptographic private keys, seed phrases, and other credentials associated with your Wallet.
By connecting your Wallet to the Services, you acknowledge and agree that: (a) Robinhood shall have no responsibility and disclaims all liability in connection with your use of such Wallet; (b) Robinhood makes no representations or warranties regarding the compatibility or functionality of the Services with any specific Wallet; and (c) you are solely responsible for your use of any Wallet, and Robinhood will not be liable for any acts, omissions, or losses resulting from your Wallet being compromised, including as a result of loss or misappropriation of your private keys or unauthorized access to your Wallet. You may disconnect your Wallet from Robinhood Chain at any time.
Fees[](https://docs.robinhood.com/chain/terms-of-service/#fees)
------------------------------------------------------------------
Your use of the Services or any Third-Party Services (as defined below) may result in certain fees, including, without limitation, fees for using the Services, transaction fees imposed by the applicable blockchain network in connection with your activity on such network, among other fees.
Ownership; Feedback[](https://docs.robinhood.com/chain/terms-of-service/#ownership-feedback)
-----------------------------------------------------------------------------------------------
###
Ownership of Materials; Reservation of Rights[](https://docs.robinhood.com/chain/terms-of-service/#ownership-of-materials-reservation-of-rights)
The Services and all content, software, code, documentation, interfaces, designs, graphics, text, audiovisual elements, and other materials made available through the Services (collectively, the "Robinhood Materials"), excluding any open-source software, are owned by Robinhood, its licensors, or other providers of such material and are protected by applicable and/or international copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws. You agree not to take any action inconsistent with such ownership. Open-source components, if any, are governed solely by their applicable open-source licenses.
No rights are granted to you other than those expressly set forth in these Terms. Robinhood, on behalf of itself and its licensors, reserves all right, title, and interest in and to the Services and Robinhood Materials. If your access to or use of the Services is terminated or suspended, your license will immediately cease and you must promptly stop using and, at Robinhood's option, delete or destroy any copies of Robinhood Materials in your possession or control.
###
Limited License; Restrictions[](https://docs.robinhood.com/chain/terms-of-service/#limited-license-restrictions)
Subject to your compliance with these Terms, Robinhood grants you a non-exclusive, limited, revocable, terminable, personal, non-transferable, and non-sublicensable license to access and use the Services and Robinhood Materials solely for their intended purpose.
Except as expressly permitted, you may not: (a) copy, reproduce, distribute, sell, lease, sublicense, or otherwise make the Services or Robinhood Materials available to any third party; (b) modify, adapt, translate, or create derivative works from the Services or Robinhood Materials; (c) frame, mirror, or incorporate the Services or Robinhood Materials into any website, application, or other work; (d) reverse engineer, decompile, disassemble, or attempt to discover source code or underlying ideas or algorithms; (e) use the Services or Robinhood Materials to develop or operate a competing product or service; (f) use the Services or Robinhood Materials for any purpose not expressly permitted by these Terms; or (g) imply any affiliation with, or endorsement by, Robinhood without prior written consent.
###
Feedback[](https://docs.robinhood.com/chain/terms-of-service/#feedback)
If you choose to submit suggestions, ideas, bug reports, comments, or other feedback about the Services or related materials ("Feedback"), you acknowledge that your Feedback is provided voluntarily and is not confidential. You agree that Robinhood may use, disclose, reproduce, modify, distribute, and otherwise exploit any Feedback for any purpose, without restriction and without compensation to you, and you grant Robinhood a perpetual, irrevocable, worldwide, royalty-free, and sublicensable license to do so. You represent and warrant that you have all rights necessary to provide the Feedback and grant the rights described above.
###
Trademarks[](https://docs.robinhood.com/chain/terms-of-service/#trademarks)
Any product or service names, logos or slogans that may appear on the Services are trademarks of Robinhood or its associated licensors and suppliers and may not be copied, imitated or used, in whole or in part, without prior written permission. All other trademarks, registered trademarks, product names and company names or logos mentioned through the Services are the property of their respective owners. Reference to any products, services, processes or other information, by name, trademark, manufacturer, supplier or otherwise does not constitute or imply endorsement, sponsorship or recommendation by Robinhood.
Changes, Suspensions and Discontinuation[](https://docs.robinhood.com/chain/terms-of-service/#changes-suspensions-and-discontinuation)
-----------------------------------------------------------------------------------------------------------------------------------------
Robinhood may, in its sole discretion, reset, modify, update, suspend, restrict, or permanently discontinue the Services at any time and without notice. Robinhood may also limit, condition, or revoke access to the Services, including by restricting or blocking specific wallet addresses from participating on Robinhood Chain. Further, Robinhood does not guarantee that Services, or any feature, data, or functionality thereof, will be available, uninterrupted, or maintained for any period of time. **Robinhood shall have no liability for any losses, damages, or consequences arising from any changes to the Services or from the suspension, limitation, or termination of your access to the Services.**
In the event of the termination of your right to access or use any part or all of the Services, discontinuation of the Services, or other termination of your right to access any portion or all of the Services we may: (a) block any and all of your Wallets and other applications from accessing the Services; (b) delete or deactivate your profile and all related information and/or materials associated therewith, without liability to you; and/or (c) cancel any open transaction, or other use of the Services that are pending at the time of discontinuation or termination.
Third Party Services[](https://docs.robinhood.com/chain/terms-of-service/#third-party-services)
--------------------------------------------------------------------------------------------------
The Services may enable access to third-party services, sites, technology applications, or resources ("Third-Party Services"), which may be subject to separate terms and policies. Third-Party Services and links to other websites are provided solely as a convenience to you. Any integration or inclusion of any Third-Party Service does not imply endorsement or recommendation by Robinhood. Robinhood does not control and is not responsible for any Third-Party Services, including their availability, content, accuracy, or privacy practices. You acknowledge you are solely responsible for any losses, costs, risks, or disputes arising from your use of Third-Party Services, and any dealings with third parties are solely between you and the applicable third party. Robinhood disclaims all liability for any loss or damage arising from or related to your use of or reliance on Third-Party Services.
Assumption of Risk; Disclaimer of Warranties[](https://docs.robinhood.com/chain/terms-of-service/#assumption-of-risk-disclaimer-of-warranties)
-------------------------------------------------------------------------------------------------------------------------------------------------
###
Assumption of Risk[](https://docs.robinhood.com/chain/terms-of-service/#assumption-of-risk)
You represent and agree that you have read and understand the risks of using the Services, and that you voluntarily assume all such risks. You acknowledge that you are solely responsible for any loss or damage arising from your access to or use of the Services, and that we are not liable for any such loss.
Without limiting the foregoing, you acknowledge and agree that Robinhood will not be responsible for any communication failures, disruptions, errors, distortions or delays you may experience when using the Services, however caused. Robinhood takes no responsibility for and will not be liable for any losses, damages or claims arising from the use of the Services, including, but not limited to, any losses, damages or claims arising from:
* (a) reliance on blockchain data, transaction information, or other information displayed through the Services;
* (b) server failure, service interruptions, or temporary unavailability of data;
* (c) delays, inaccuracies, or discrepancies in displayed blockchain data;
* (d) decisions made based on information obtained through the Services;
* (e) use of third-party services or websites accessed through links on the Services; or
* (f) phishing, viruses, third-party attacks, or any other unauthorized third-party activities, including fraudulent websites impersonating the Services.
You further understand and agree that:
* Robinhood does not own or control any Third-Party Providers and makes no representations or warranties regarding their operation or security. You assume all risks associated with Robinhood Chain, the Bridging Smart Contracts, and related infrastructure, and release Robinhood from any claims arising out of network, infrastructure, or smart-contract failures, exploits, pauses, or upgrades.
* Robinhood Chain may be subject to periodic protocol upgrades that could significantly alter chain operation, disrupt the Bridging Smart Contracts or Services, or introduce bugs, malfunctions, or cyberattack vectors resulting in damage or loss.
* Robinhood Chain, the Bridging Smart Contracts, and the Services depend on open-source code and third-party infrastructure. These components may be subject to bugs, exploits, cyberattacks, key compromise, validator downtime, or other failures that could result in irreversible loss or devaluation of digital assets or in failed, delayed, replayed, or censored transactions.
###
Disclaimer of Warranties[](https://docs.robinhood.com/chain/terms-of-service/#disclaimer-of-warranties)
TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SERVICES ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. TO THE MAXIMUM EXTENT PERMITTED BY LAW, ROBINHOOD, ITS AFFILIATES, ITS LICENSORS, AND SERVICE PROVIDERS DISCLAIM ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.
WITHOUT LIMITING THE FOREGOING, ROBNIHOOD MAKES NO REPRESENTATIONS OR WARRANTIES THAT: (A) ACCESS TO OR OPERATION OF THE SERVICES WILL BE CONTINUOUS, UNINTERRUPTED, TIMELY, OR AVAILABLE AT ANY PARTICULAR TIME; (B) THE SERVICES WILL BE COMPATIBLE OR INTEROPERABLE WITH ANY SOFTWARE, SYSTEM, OR THIRD-PARTY SERVICE, INCLUDING ANY WALLET OR TOOL; (C) THE SERVICES WILL BE SECURE, COMPLETE, FREE OF ERRORS, DEFECTS, OR HARMFUL CODE; (D) ANY DATA, TRANSACTIONS, OR CONTENT WILL BE ACCURATELY PROCESSED, STORED, OR PRESERVED, OR PROTECTED FROM UNAUTHORIZED ACCESS, ALTERATION, OR LOSS; OR (E) THE SERVICES WILL PREVENT THEFT, HACKING, CYBER ATTACKS, OR OTHER LOSSES OR DEVALUATION RESULTING FROM THIRD-PARTY CONDUCT.
NO PART OF THE SERVICES ACTS AS A CUSTODIAN, TRUSTEE, FIDUCIARY, AGENT, OR REPRESENTATIVE FOR ANY PERSON. AT NO POINT DOES THE SERVICES HAVE POSSESSION OF, ACCESS TO, OR CONTROL OVER ANY PERSON'S DIGITAL ASSETS, PRIVATE KEYS, SEED PHRASES, OR BLOCKCHAIN WALLETS, NOR DOES THE SERVICES UNDERTAKE ANY OBLIGATION TO MANAGE, SAFEGUARD, OR ADMINISTER ANY SUCH DIGITAL ASSETS OR WALLETS ON BEHALF OF ANY PERSON. YOU ACKNOWLEDGE THAT ROBINHOOD DOES NOT CONTROL OR CUSTODY YOUR DIGITAL ASSETS OR OTHER FUNDS IN ANY MANNER.
###
Data Accuracy Disclaimer[](https://docs.robinhood.com/chain/terms-of-service/#data-accuracy-disclaimer)
The Services display blockchain data and related information obtained from various blockchain networks and third-party sources. While Robinhood strives to provide accurate and up-to-date information, Robinhood makes no representations or warranties regarding the accuracy, completeness, timeliness, or reliability of any data displayed through the Services, including but not limited to transaction data, wallet balances, token information, smart contract data, gas prices, or network statistics.
Blockchain data may be subject to delays, errors, or discrepancies due to network conditions, third-party data providers, or other factors beyond Robinhood's control. You acknowledge that you should not rely solely on the information provided through the Services for making any decisions, and you are encouraged to verify all information independently through primary sources. Robinhood shall not be liable for any losses or damages arising from your reliance on data displayed through the Services.
###
Disclaimer of Intellectual Property[](https://docs.robinhood.com/chain/terms-of-service/#disclaimer-of-intellectual-property)
Any display, reference, or use of third-party intellectual property through the Services is for informational purposes only and does not constitute or imply any endorsement, affiliation, sponsorship, or approval by Robinhood unless expressly stated otherwise.
Robinhood expressly disclaims any liability for any unauthorized use, infringement, or misappropriation of third-party intellectual property by users or any other third party. Users are solely responsible for ensuring that any content they upload, display, or make available through the Services complies with all applicable intellectual property laws and does not infringe the rights of any third party.
Limitation of Liability[](https://docs.robinhood.com/chain/terms-of-service/#limitation-of-liability)
--------------------------------------------------------------------------------------------------------
TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, YOU EXPRESSLY UNDERSTAND AND AGREE THAT IN NO EVENT WILL ROBINHOOD, ITS AFFILIATES, AND ITS AND THEIR RESPECTIVE OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS, OR LICENSORS (COLLECTIVELY, THE "ROBINHOOD ENTITIES") BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY DAMAGES, OR DAMAGES FOR LOSS OF PROFITS INCLUDING DAMAGES FOR LOSS OF GOODWILL, USE, OR DATA OR OTHER INTANGIBLE LOSSES (EVEN IF THE ROBINHOOD ENTITIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY, OR OTHERWISE, ARISING FROM OR RELATING TO: (A) THE USE OR THE INABILITY TO USE THE SERVICES, OR ANY PART THEREOF; (B) THE COST OF PROCUREMENT OF SUBSTITUTE GOODS AND SERVICES RESULTING FROM ANY GOODS, DATA, INFORMATION, OR SERVICES PURCHASED OR OBTAINED OR MESSAGES RECEIVED OR TRANSACTIONS ENTERED INTO THROUGH OR FROM THE SERVICES; (C) UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; (D) STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON OR THROUGH THE SERVICES, INCLUDING ANY THIRD-PARTY PROVIDERS; (E) INTERRUPTION OR CESSATION OF FUNCTION RELATED TO THE SERVICES; (F) BUGS, VIRUSES, TROJAN HORSES, OR THE LIKE THAT MAY BE TRANSMITTED TO OR THROUGH THE SERVICES; (G) ERRORS OR OMISSIONS IN, OR LOSS OR DAMAGE INCURRED AS A RESULT OF THE USE OF, ANY CONTENT MADE AVAILABLE THROUGH THE SERVICES; (H) THIRD-PARTY SERVICES, THIRD PARTY CONTENT, AND/OR OTHER THIRD PARTY MATERIALS; OR (I) ANY OTHER MATTER RELATING TO THE SERVICES OR ANY PART THEREOF. IN NO EVENT WILL THE ROBINHOOD ENTITIES EXCEED ONE HUNDRED DOLLARS ($100).
WITHOUT LIMITING THE FOREGOING, THE ROBINHOOD ENTITIES SHALL HAVE NO LIABILITY FOR ANY LOSSES, DEPEGS, THEFTS, OR OTHER DAMAGES ARISING OUT OF OR RELATED TO (i) THE BRIDGING SMART CONTRACTS, (ii) ANY THIRD-PARTY PROVIDERS SYSTEMS, SOFTWARE, KEYS OR SIGNATURES, OR (iii) ANY BRIDGE-RELATED UPGRADES, OR MAINTENANCE ACTION OR INACTION.
Indemnification[](https://docs.robinhood.com/chain/terms-of-service/#indemnification)
----------------------------------------------------------------------------------------
To the fullest extent permitted by applicable law, you will indemnify, defend, and hold Robinhood and its affiliates, licensors, and service providers, and their respective officers, directors, employees, contractors, agents, licensors, suppliers, successors (collectively, the "Indemnified Parties") harmless from and against any and all claims, costs, losses, damages, judgments, tax assessments, penalties, interest, and expenses (including reasonable attorneys' fees) arising out of any claim, action, audit, investigation, inquiry, or other proceeding instituted by a person or entity that arises out of or relates to: (a) your access to or use of the Services, (b) your violation or breach of these Terms or any applicable law or regulation, (c) your violation of any third-party right, including any right of privacy, publicity rights or intellectual property rights, (d) connecting to any Third-Party Service, or (e) your willful misconduct, gross negligence or fraud. If you are obligated to indemnify any Indemnified Party hereunder, then you agree that Robinhood (or, at its discretion, the applicable Indemnified Party) will have the right, in its sole discretion, to control any action or proceeding and to determine whether Robinhood wishes to settle, and if so, on what terms, and you agree to fully cooperate with Robinhood in the defense or settlement of such claim.
No Financial or Investment Advice[](https://docs.robinhood.com/chain/terms-of-service/#no-financial-or-investment-advice)
----------------------------------------------------------------------------------------------------------------------------
The Services and any information provided therein are for informational purposes only. Nothing contained in or provided through the Services constitutes, or is intended to constitute, financial, investment, tax, legal, or other professional advice. Robinhood is not a financial advisor, broker, dealer, or investment advisor with respect to the Services, and does not provide personalized investment recommendations or advice.
Any information regarding digital assets, tokens, cryptocurrencies, or blockchain projects displayed through the Services should not be construed as a recommendation to buy, sell, hold, or otherwise transact in any digital asset. You should consult your own financial, legal, tax, and other professional advisors before making any decisions relating to digital assets or blockchain technology. Robinhood expressly disclaims any liability for any decisions made or actions taken based on information obtained through the Services.
Arbitration[](https://docs.robinhood.com/chain/terms-of-service/#arbitration)
--------------------------------------------------------------------------------
PLEASE READ THIS ARBITRATION AGREEMENT CAREFULLY. IT PROVIDES THAT DISPUTES MAY BE RESOLVED BY BINDING ARBITRATION. UNLESS YOU PROMPTLY REJECT IT, THE ARBITRATION AGREEMENT WILL HAVE A SUBSTANTIAL EFFECT ON YOUR RIGHTS IN THE EVENT OF A DISPUTE. ARBITRATION REPLACES THE RIGHT TO GO TO COURT, INCLUDING THE RIGHT TO A JURY AND THE RIGHT TO ASSERT OR PARTICIPATE IN A CLASS, REPRESENTATIVE, OR CONSOLIDATED PROCEEDING, WHETHER IN COURT OR IN ARBITRATION. IN ARBITRATION, A DISPUTE IS RESOLVED BY AN ARBITRATOR INSTEAD OF A JUDGE OR JURY. ARBITRATION PROCEDURES ARE SIMPLER AND MORE LIMITED THAN COURT PROCEDURES.
Maintaining good relationships with users of the Services is important to us. Most concerns can be resolved by contacting us through the support channels identified in the Services or associated documentation. If we are unable to resolve a concern to your satisfaction, this section explains how disputes between you and us may be resolved.
###
Definitions[](https://docs.robinhood.com/chain/terms-of-service/#definitions)
For purposes of this Arbitration Agreement: (1) "We," "us", and "our" mean Robinhood Digital Assets, LLC, and its parents, subsidiaries, affiliates, successors, officers, directors, agents, and employees, and any person or entity named as a co-defendant with us in a Claim; and (2) "You," "your," and "yours" mean any individual or entity that accesses or uses the Services, any person acting on such user's behalf. Defined terms not set forth in this section have the meanings given elsewhere in these Terms.
###
Agreement to Arbitrate[](https://docs.robinhood.com/chain/terms-of-service/#agreement-to-arbitrate)
Either you or we may elect to arbitrate any Claim pursuant to this Arbitration Agreement. IF YOU DO NOT REJECT THIS ARBITRATION AGREEMENT, YOU AND WE AGREE THAT, FOR ANY DISPUTE SUBJECT TO ARBITRATION: (1) YOU AND WE ARE WAIVING THE RIGHT TO HAVE THE DISPUTE DECIDED BY A JUDGE OR JURY; AND (2) THIS ARBITRATION AGREEMENT PRECLUDES YOU AND US FROM PARTICIPATING IN A CLASS ACTION, REPRESENTATIVE ACTION, OR CONSOLIDATED PROCEEDING, WHETHER IN COURT OR IN ARBITRATION.
###
Governing Law[](https://docs.robinhood.com/chain/terms-of-service/#governing-law)
This Arbitration Agreement is governed by the Federal Arbitration Act ("FAA"), 9 U.S.C. §§ 1 et seq., with respect to both substance and procedure, and not by any state arbitration law, except that the law of the State of Delaware will govern the validity and enforceability of the formation of this Agreement.
###
Claim[](https://docs.robinhood.com/chain/terms-of-service/#claim)
A "Claim" is any unresolved claim, dispute or controversy between you and us, whether past, present or future, arising out of or related to these Terms, the Services or any relationship resulting from your use of the Services. "Claim" has the broadest possible meaning, and includes, but is not limited to: (i) initial claims, counterclaims, cross-claims and third-party claims; (ii) claims, regardless of what legal theory they are based on or what remedy, whether based upon contract, tort, consumer rights, fraud and other intentional torts, constitution, statute, regulation, ordinance, common law and equity (including any claim for injunctive or declaratory relief); (iii) claims by or against any third party using or providing any product, service or benefit in connection with the Services; and (iv) claims that arise from access to or use of the Services, advertisements, promotions, or statements related to the Services.
The only exception to arbitration of Claims is that both you and we have the right to pursue a Claim in a small claims court instead of arbitration, if the Claim is in that court's jurisdiction and proceeds on an individual basis.
Any disputes regarding whether any Claim is subject to arbitration and/or the scope of this Arbitration Agreement shall be decided by a court, not the arbitrator.
###
Commencing an Arbitration[](https://docs.robinhood.com/chain/terms-of-service/#commencing-an-arbitration)
To start an arbitration, the party electing arbitration must notify the other of such election. This notice may be given before or after a lawsuit has been filed concerning the Claim or with respect to other Claims brought later in the lawsuit, and it may be given by papers filed in the lawsuit such as a motion to compel arbitration. If you elect arbitration, you must notify us in writing at Robinhood Digital Assets, LLC, Attn: Robinhood Chain Arbitration, at the address specified in these Terms. Your notice must include your name, address, and sufficient information to identify your use of the Services. If we elect arbitration, we will notify you in writing at your last known address or email address we have on file for you.
###
Binding Arbitration[](https://docs.robinhood.com/chain/terms-of-service/#binding-arbitration)
Binding arbitration is a means of having an independent third party (the arbitrator) resolve a dispute without using the court system, judges or juries. Either you or we may elect to resolve any Claim by binding arbitration. Each arbitration, including the selection of the arbitrator, shall be administered by the American Arbitration Association ("AAA"), according to the Consumer Arbitration Rules of the AAA in effect at the time the arbitration is commenced and the Mass Arbitration Supplementary Rules with respect to mass arbitration matters. A single arbitrator will conduct proceedings under the Consumer Arbitration Rules, and a Process Arbitrator and single Merits Arbitrator will conduct each mass arbitration case. If there is a conflict between the applicable AAA rules and procedures and this Arbitration Agreement and/or this Agreement, this Arbitration Agreement and this Agreement will control. If the AAA is unable to handle the Claim for any reason, the matter shall be arbitrated instead by a neutral arbitrator selected by agreement of the parties (or, if the parties cannot agree, selected by a court in accordance with the FAA), pursuant to the AAA rules of procedure. No company may serve as administrator, without the consent of all parties, if it adopts or has in place any formal or informal policy that is inconsistent with and purports to override the terms of the Class Action Waiver in this Arbitration Agreement. If you have a question about the AAA, you can contact them as follows: American Arbitration Association, 1633 Broadway 10th Floor, New York, NY 10019, [www.adr.org](http://www.adr.org/)
.
###
Powers and Qualifications of Arbitrators and Arbitration Procedures[](https://docs.robinhood.com/chain/terms-of-service/#powers-and-qualifications-of-arbitrators-and-arbitration-procedures)
All arbitrators will be required to be practicing attorneys or retired judges and will be required to be experienced and knowledgeable in the substantive laws applicable to the subject matter of the dispute. The arbitrator shall follow applicable substantive law to the extent consistent with the FAA, applicable statutes of limitation and privilege rules that would apply in a court proceeding, and shall be authorized to award all remedies available in an individual lawsuit under applicable substantive law, including, without limitation, compensatory, statutory and punitive damages (which shall be governed by the constitutional standards applicable in judicial proceedings), declaratory, injunctive and other equitable relief, and attorneys' fees and costs, subject to the terms of this Agreement, to the extent permitted by applicable law. Upon the timely request of either party, the arbitrator shall write a brief explanation of the basis of his or her award. The arbitrator's award will be final and binding, except for any appeal right under the FAA. Any court with jurisdiction may enter judgment upon the arbitrator's award. Unless appealed, the arbitration ruling will be considered final, binding, and enforceable by any court having jurisdiction. A party may file a notice of appeal pursuant to and governed by the AAA's Optional Appellate Arbitration Rules. A party may only appeal on the grounds that the arbitration award is based upon (a) an error of law that is material and prejudicial (reviewed de novo) and/or (b) determination of facts that are erroneous (reviewed for clear error). The appeal tribunal shall render its decision exclusively on the record before the arbitrator. For the avoidance of doubt, and consistent with AAA Optional Appellate Arbitration Rule A-19, under no circumstances shall the appeal tribunal order a new arbitration hearing or send the case back to the original arbitrator.
###
Costs and Fees[](https://docs.robinhood.com/chain/terms-of-service/#costs-and-fees)
Each Party will be responsible for the arbitration costs as allocated by the applicable AAA rules ([www.adr.org](http://www.adr.org/)
). However, except for claims filed as part of a mass arbitration, if the arbitrator ultimately rules in your favor, you will be entitled to reimbursement by us for all fees you paid to the AAA. If you cannot obtain a waiver of the AAA's or arbitrator's filing, administrative, hearing and/or other fees, we will consider in good faith any written request by you for us to bear such fees. Each party will bear the expense of its own attorneys, experts and witnesses, regardless of which party prevails, unless applicable law or this Agreement gives a right to recover any of those fees from the other party.
###
Class Action Waiver[](https://docs.robinhood.com/chain/terms-of-service/#class-action-waiver)
Claims in arbitration will proceed on an individual basis, on behalf of the named parties only. YOU AGREE NOT TO SEEK TO PROCEED ON ANY CLAIM IN ARBITRATION AS A CLASS CLAIM OR CLASS ACTION, PRIVATE ATTORNEY GENERAL PROCEEDING, OR OTHER REPRESENTATIVE OR CONSOLIDATED PROCEEDING. YOU AGREE NOT TO BE PART OF, OR REPRESENTED IN, ANY CLASS ACTION OR OTHER REPRESENTATIVE ACTION BROUGHT BY ANYONE ELSE. YOU AGREE NOT TO SEEK ANY AWARD OR REMEDY IN ARBITRATION AGAINST OR ON BEHALF OF ANYONE WHO IS NOT A NAMED PARTY TO THE ARBITRATION, INCLUDING BUT NOT LIMITED TO PUBLIC INJUNCTIVE RELIEF. The arbitrator shall have no authority to conduct any class, private attorney general or other representative proceeding, and the arbitrator may not award relief for the benefit of non-parties, including public injunctive relief. Any question regarding the enforceability or interpretation of this "Class Action Waiver" section shall be decided by a court and not the arbitrator. If a court determines that any of the terms of this "Class Action Waiver" section is legally unenforceable for any reason, the court's determination shall be subject to appeal, and you and we agree that the arbitration and litigation shall proceed as follows: (i) all Claims for which arbitration is legally enforceable must be filed and adjudicated in arbitration; (ii) any Claims for which arbitration is not legally enforceable will be decided through litigation in court; (iii) any Claims that are to be decided through litigation in court will be stayed pending completion of the arbitration of all other Claims; and (iv) when litigation in court resumes, the court will not be bound by any determination made by the arbitrator. Rights Preserved: This Arbitration Agreement and the exercise of any of the rights you and we have under this Agreement does not stop you or us from exercising any lawful rights either of us has to use other available remedies; to comply with Legal Process; to obtain provisional remedies such as injunctive relief, attachment or garnishment by a court of appropriate jurisdiction; or to bring an individual action in court that is limited to preventing the other party from using or obtaining any provisional or self-help remedies and that does not involve a request for damages or monetary relief.
###
In California[](https://docs.robinhood.com/chain/terms-of-service/#in-california)
If an action or proceeding is initiated before any court in California and neither you nor we request that the dispute be submitted to arbitration, then, upon motion by either you or us, the dispute shall be heard by an active attorney or a retired judge selected by the AAA who is then appointed by the court in which the action commenced, according to the reference provision of the California Code of Civil Procedure, Section 638 et seq. This reference process is not subject to a trial by jury; the trial is conducted before the active attorney or retired judge under California law.
###
Enforcement[](https://docs.robinhood.com/chain/terms-of-service/#enforcement)
You or we may bring an action, including a summary or expedited motion, to compel arbitration of Claims subject to arbitration, or to stay the litigation of any Claims pending arbitration, in any court having jurisdiction. Such action may be brought at any time, even if such claims are part of a lawsuit, unless a trial has begun or a final judgment has been entered. Any dispute concerning the validity or enforceability of this Arbitration Agreement must be decided by a court; any dispute concerning the validity or enforceability of the Agreement as a whole is for the arbitrator. Failure or forbearance to enforce this Arbitration Agreement at any particular time or in connection with any particular Claims will not constitute a waiver of any rights to require arbitration at a later time or in connection with any other Claims. Any additional or different agreement between you and us regarding arbitration must be in writing.
###
Survival and Severability of Terms[](https://docs.robinhood.com/chain/terms-of-service/#survival-and-severability-of-terms)
This Arbitration Agreement shall survive: (a) termination or changes in the Terms or the Services, or the relationship between you and us concerning the Services; and (b) the bankruptcy of any party. If any portion of this Arbitration Agreement (except for the "Class Action Waiver" section set forth above) is deemed invalid or unenforceable, the remaining provisions of the Arbitration Agreement shall remain in force. No portion of this Arbitration Agreement may be amended or waived absent a written agreement between you and us.
###
Right to Reject[](https://docs.robinhood.com/chain/terms-of-service/#right-to-reject)
**You may reject this Arbitration Agreement by mailing a signed rejection notice to RHDA, LLC at 85 Willow Road, Menlo Park, CA 94025, Attn: ROBINHOOD CHAIN Arbitration Rejection Notice, within sixty (60) calendar days after FIRST ACCESSING OR USING THE SERVICES.** The notice must include your name, contact information, and a clear statement that you are rejecting the arbitration agreement. This is the only manner in which you can reject this Arbitration Agreement. Any other method, form, or means of rejection will be treated as being invalid or ineffective. Requests to reject this Arbitration Agreement that are made more than sixty (60) calendar days after first using or accessing the Services also are invalid. If you already have pending litigation or arbitration against/with us when you reject this Arbitration Agreement, any such rejection request will not apply to that litigation or arbitration. If you validly reject this Arbitration Agreement: only a court may be used to resolve any Claim; your rejection will not affect any other provision of the Agreement; and your rejection will apply only to this Arbitration Agreement and not to any other arbitration agreement for which the rejection period has already passed.
Governing Law[](https://docs.robinhood.com/chain/terms-of-service/#governing-law-1)
--------------------------------------------------------------------------------------
These Terms are governed by and construed in accordance with the laws of the State of Delaware, without regard to its internal principles of conflicts of law or choice of law. You agree that any dispute arising under these Terms, or relating in any way to your relationship with us, that is not arbitrated in accordance with Section 12 will be resolved exclusively in a federal or state court of competent jurisdiction located in the State of Delaware. You hereby consent to the personal jurisdiction of such courts and waive any objection to venue in such courts.
Privacy[](https://docs.robinhood.com/chain/terms-of-service/#privacy)
------------------------------------------------------------------------
Our Privacy Statements describe how we handle the information you provide to us when you use the Services. Please refer to the Privacy Statement that applies in your jurisdiction for further data protection related information. Our Privacy Statements are located at:
* US: [https://robinhood.com/us/en/support/articles/rhm-privacy-statement/](https://robinhood.com/us/en/support/articles/rhm-privacy-statement/)
* UK: [https://robinhood.com/gb/en/support/articles/privacy-policy/](https://robinhood.com/gb/en/support/articles/privacy-policy/)
, and
* EU: [https://robinhood.com/eu/en/support/articles/rh-financial-entities-privacy-statement/](https://robinhood.com/eu/en/support/articles/rh-financial-entities-privacy-statement/)
Modification of Terms[](https://docs.robinhood.com/chain/terms-of-service/#modification-of-terms)
----------------------------------------------------------------------------------------------------
Robinhood may amend these Terms or modify the Services, including any related documentation or guidelines, at any time by posting an updated version that we deem reasonable under the circumstances. The "Last Updated" date at the top of these Terms will reflect the most recent version. Any updated Terms will be effective upon posting and will apply prospectively only. Your continued access to or use of the Services after the updated Terms are posted constitutes your acceptance of the revised Terms. You may not modify these Terms without Robinhood's prior written consent.
Force Majeure[](https://docs.robinhood.com/chain/terms-of-service/#force-majeure)
------------------------------------------------------------------------------------
Robinhood will not be liable for any delay or failure to perform resulting from causes beyond its reasonable control, including acts of God, natural disasters, labor disputes, government actions, war, terrorism, civil unrest, network or infrastructure failures, power outages, failures of blockchain networks, or failures of third-party services.
Contact Us[](https://docs.robinhood.com/chain/terms-of-service/#contact-us)
------------------------------------------------------------------------------
You may contact us regarding the Services or these Terms by e-mail at [chain-developers-group@robinhood.com](mailto:chain-developers-group@robinhood.com)
.
Miscellaneous[](https://docs.robinhood.com/chain/terms-of-service/#miscellaneous)
------------------------------------------------------------------------------------
These Terms and any dispute arising out of or relating to the Services are governed by and construed in accordance with the laws of the State of Delaware, without regard to its conflict of laws principles. Any notices or other communications provided by us under these Terms including those regarding modifications to these Terms will be posted online, in the Services, or through other electronic communication. You agree and consent to receive electronically all communications, agreements, documents, notices, and disclosures that we provide in connection with your use of the Services. Nothing in these Terms creates any partnership, joint venture, agency, fiduciary, or employment relationship between you and Robinhood. You act solely as an independent user of the Services. If any provision of these Terms is held to be invalid, illegal, or unenforceable, the remaining provisions will remain in full force and effect. These Terms and any rights and licenses granted hereunder, may not be transferred or assigned by you and any attempted transfer or assignment will be null and void. We may assign these Terms without your consent, including to any affiliate. These Terms constitute the entire agreement between you and Robinhood regarding your access to and use of the Services and supersede all prior or contemporaneous agreements, communications, or understandings, whether written or oral, relating to the subject matter hereof. Robinhood's failure to enforce any right or provision of these Terms will not constitute a waiver of such right or provision or any other rights under these Terms.
---
# Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
About Robinhood RHJ
On this page
Chevron Right
Robinhood Assets (Jersey) Limited ("RHJ") is the issuer of Robinhood Stock Tokens. This site provides the issuer information, disclosures, and ongoing notices required in connection with the Stock Tokens.
About the Issuer[](http://docs.robinhood.com/rhj/#about-the-issuer)
----------------------------------------------------------------------
* **Issuer name:** Robinhood Assets (Jersey) Limited
* **Place of incorporation:** The Issuer is a private limited company incorporated in Jersey.
* **Registered address:** First Floor, La Chasse Chambers, Ten La Chasse, St. Helier, JE2 4UE, Jersey.
* **Email:** [contact.rhj@robinhood.com](mailto:contact.rhj@robinhood.com)
* **Issuer LEI:** 984500ADFHQZ9D6B9A29
* **Registration number:** The Issuer is registered under the registration number 162428.
###
Regulatory status[](http://docs.robinhood.com/rhj/#regulatory-status)
The Issuer is not regulated. However, in connection with the issuance of Stock Tokens, the Issuer has obtained certain consents in Jersey. Such consents do not constitute prudential supervision of the Issuer or an endorsement of its products. The relevant Jersey authorities do not assume any responsibility for the financial soundness of the Issuer or for the accuracy of any statements made, or opinions expressed, in relation to the Issuer or its products.
Sections[](http://docs.robinhood.com/rhj/#sections)
------------------------------------------------------
[FAQ\
\
Common questions about Robinhood Stock Tokens.](http://docs.robinhood.com/rhj/faq)
[Product\
\
What the Product is, key risks, and product details.](http://docs.robinhood.com/rhj/product)
[Service Provider Details\
\
Authorised Participant, custodian, broker, and other service providers.](http://docs.robinhood.com/rhj/service-providers)
[Technical Documentation\
\
Contract addresses, the ERC-8056 multiplier, and integration details on the Robinhood Chain developer docs.](https://docs.robinhood.com/chain/stock-tokens)
[Restricted Jurisdictions\
\
Where the Products may not be offered, sold, or delivered.](http://docs.robinhood.com/rhj/restricted-jurisdictions)
[Use of Website\
\
Terms governing your use of this website.](http://docs.robinhood.com/rhj/use-of-website)
[Price Deviations\
\
Tokens trading at a sustained premium or discount to their underlying.](http://docs.robinhood.com/rhj/price-deviations)
[Corporate Actions\
\
Corporate events affecting Stock Tokens and any resulting adjustments.](http://docs.robinhood.com/rhj/corporate-actions)
[Disclosures\
\
Issuer disclosures, including the Base Prospectus and Final Terms.](https://robinhood.com/eu/en/legal/rhj/)
---
# FAQ – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/faq/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
FAQ
On this page
Chevron Right
What are Robinhood Stock Tokens?[](http://docs.robinhood.com/rhj/faq/#what-are-robinhood-stock-tokens)
---------------------------------------------------------------------------------------------------------
Stock Tokens are tokenized debt securities issued by Robinhood Assets (Jersey) Limited. They provide economic exposure to underlying securities but do not grant investors any legal or beneficial rights in, or against the issuer of, those underlying securities.
Who can purchase Stock Tokens?[](http://docs.robinhood.com/rhj/faq/#who-can-purchase-stock-tokens)
-----------------------------------------------------------------------------------------------------
Stock Tokens are designed for global investors who want exposure to US capital markets. Stock Tokens are not available in the US or to US persons and are subject to restrictions in other jurisdictions, including Canada, the United Kingdom, and Switzerland. A full list of restrictions is available [here](https://docs.robinhood.com/rhj)
.
Due to regulatory restrictions, Stock Tokens are not available everywhere, including residents of the United States, Canada, the United Kingdom, or Switzerland.
How can I buy and hold Stock Tokens?[](http://docs.robinhood.com/rhj/faq/#how-can-i-buy-and-hold-stock-tokens)
-----------------------------------------------------------------------------------------------------------------
Where available, you can discover and swap Stock Tokens through Robinhood Wallet, decentralized exchanges (DEXs), or centralized exchanges (CEXs).
Are these tokens actually backed by real stocks?[](http://docs.robinhood.com/rhj/faq/#are-these-tokens-actually-backed-by-real-stocks)
-----------------------------------------------------------------------------------------------------------------------------------------
Yes. Every single Stock Token in circulation is backed 1:1 by the corresponding underlying equity. The underlying shares are held securely by our US-based custody partner.
How do I receive dividends on my Stock Tokens?[](http://docs.robinhood.com/rhj/faq/#how-do-i-receive-dividends-on-my-stock-tokens)
-------------------------------------------------------------------------------------------------------------------------------------
Instead of distributing cash dividends, a multiplier mechanism is used. When an underlying company pays a dividend, the dividend is automatically reinvested to purchase more shares of that stock. Instead of receiving a cash payout, your token's multiplier increases. This means your token dynamically represents more than one share of stock over time.
Can I redeem my Stock Tokens?[](http://docs.robinhood.com/rhj/faq/#can-i-redeem-my-stock-tokens)
---------------------------------------------------------------------------------------------------
Yes. You can sell your Stock Tokens from time to time in the secondary market. You can also redeem them directly with the Issuer, where there is no authorized participant (a firm that processes redemptions on investors' behalf), subject to completing the Issuer's KYC/AML (identity verification) processes.
What happens to my Stock Tokens if Robinhood goes bankrupt?[](http://docs.robinhood.com/rhj/faq/#what-happens-to-my-stock-tokens-if-robinhood-goes-bankrupt)
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Your Stock Tokens are backed 1:1 by the underlying shares, held by a licensed custodian. In the unlikely event of the Issuer's insolvency, an independent security agent will sell the underlying shares, and arrange for the cash proceeds to be paid to token holders.
---
# Product – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/product/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Product
On this page
Chevron Right
Stock Tokens (the "Product") are tokenised debt securities issued by Robinhood Assets (Jersey) Limited (the "Issuer" or "RHJ"). The Product provides economic exposure to underlying securities but does not grant investors any legal or beneficial rights in, or against the issuer of, those underlying securities. Any decision to invest in the Products should be made solely on the basis of the Base Prospectus (together with any supplements) and the applicable Final Terms, as well as the relevant Key Information Document where required. Nothing on this website constitutes, and may not be used in connection with, an offer or solicitation in any place where offers or solicitations are not permitted by law. Nothing on this website constitutes investment, legal, tax or financial advice. Prospective investors should make their own assessment as to the suitability of investing in the Products.
The Product carries a high level of risk and is not appropriate for all investors. The price of the Products can go down as well as up, and past performance is not an indication of future results. Investors should be aware that an investment in the Products may result in substantial risks for investors and Investors should be prepared for the possibility of losing some or all of their investment. Investors should carefully review the "Risk Factors" section of the Base Prospectus and the applicable Final Terms before making any investment decision.
The Financial Market Authority Liechtenstein, as competent authority under the EU Prospectus Regulation, has approved the Base Prospectus as meeting the standards of completeness, comprehensibility and consistency imposed by the EU Prospectus Regulation. Such approval is not to be considered as an endorsement of the Issuer or the quality of the Products. Investors should make their own assessment as to the suitability of investing in the Products.
Product details[](http://docs.robinhood.com/rhj/product/#product-details)
----------------------------------------------------------------------------
* **Supported blockchain:** Robinhood Chain
* **Securities ledger:** Transaction records for each Product are maintained on Robinhood Chain. See [Robinhood Chain contracts](http://docs.robinhood.com/chain/contracts)
.
* **Block confirmations for a legal transfer:** 1
###
Investor fee rate[](http://docs.robinhood.com/rhj/product/#investor-fee-rate)
* 0.00% (zero) for token purchase/subscription
* 0.00% (zero) for token redemption for the first 90 (ninety) days from the date of issuance
* 0.05% for token redemption after the date falling 90 (ninety) days after the date of issuance
The Issuer can change the Investor Fee Rate from time to time, subject to limits as specified in the applicable Final Terms.
---
# Service Provider Details – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/service-providers/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Service Provider Details
On this page
Chevron Right
* **Authorised Participant:** Bitstamp Global Ltd, Floor 4, Banco Popular Building, Road Town, Tortola VG1110, British Virgin Islands.
* **Broker and Custodian:** Alpaca Securities LLC, 12 E 49th Street, Floor 11, New York, NY 10017, USA.
* **Paying Account Provider:** JPMorgan Chase Bank, N.A., London Branch, 25 Bank Street, Canary Wharf, London, E14 5JP, United Kingdom.
* **Tokenizer:** Robinhood Assets (Jersey) Limited, c/o Cavendish Fiduciary (Jersey) Limited, First Floor, La Chasse Chambers, Ten La Chasse, St. Helier, JE2 4UE, Jersey.
* **Security Agent and Verification Agent:** Security Agent Services AG, Baarerstrasse 75, 6300 Zug, Switzerland.
---
# Restricted Jurisdictions – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/restricted-jurisdictions/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Restricted Jurisdictions
On this page
Chevron Right
The offer, sale, distribution and delivery of the Products are subject to restrictions in certain jurisdictions, including, without limitation, the U.S., Canada, the United Kingdom, and Switzerland, as set out in the Base Prospectus and applicable Final Terms.
The Products may not be offered, sold or delivered, directly or indirectly, in the United States or to, or for the account or benefit of, U.S. Persons or to Prohibited Investors. Prohibited Investors currently include investors in the following jurisdictions (which may be subject to change): Cuba, Belarus, Iran, North Korea, Russia, Syria, Ukraine, South Sudan, Sudan, Myanmar, and Venezuela.
---
# Use of Website – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/use-of-website/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Use of Website
On this page
Chevron Right
This website may contain forward-looking statements, which are based on current expectations and assumptions and are subject to risks and uncertainties. Actual outcomes may differ materially from those expressed or implied by such statements. The Issuer undertakes no obligation to update any forward-looking statements except as required by law. The Issuer reserves the right to amend the information on this website at any time without prior notice.
The information provided on or via this website is provided for information only and should not be read as any form of solicitation or offer from the Issuer or any other Robinhood entity to purchase any of the products described herein, or otherwise engage with any of the services described herein.
The Products have not been and will not be registered under the U.S. Securities Act of 1933, as amended from time to time (the "Securities Act") or with any securities regulatory authority of any state or other jurisdiction of the United States. The Product may not be offered, sold or delivered within the United States to, or for the account or benefit of U.S. Persons (as defined in Regulation S under the Securities Act ("Regulation S")), and (ii) may be offered, sold or otherwise delivered at any time only outside of the United States and to transferees that are not U.S. Persons (as defined in Regulation S).
This website is directed only at persons who are resident or incorporated outside of the United Kingdom, and is therefore exempt from the general restriction in Section 21 of the Financial Services and Markets Act 2000 on the communication of invitations or inducements to engage in investment activity on the grounds that it is being issued to and/or directed at non-UK persons, and that the products and services described are not available to UK persons. It should not therefore be acted upon by any person who is resident in, or incorporated in, the United Kingdom.
By using this website, you confirm and accept:
☐ You are not a U.S. Person, or a Canadian, Swiss or United Kingdom person, nor are you a person subject to, and/or located in any jurisdiction which is subject to, any form of international sanctions (in particular as imposed by the EU, Switzerland, the United Nations, the United Kingdom, or the USA).
☐ You have read, understood and accept the use of website section.
☐ You are one of the following: (1) a Professional Client as defined below; or (2) you are interested in purchasing the Product following an offer from an appropriately licensed financial institution.
"Professional Client" has the meaning given to it in article 4(3) and 5(1) of the Swiss Financial Services Act, but also includes: (i) a Qualified Investor according to article 2(e) of the Regulation (EU) 2017/1129 if located in a member country of the European Union (EU) or the European Economic Area, and (ii) if located in any other jurisdiction which is not restricted, an equivalent status under local law applicable to you, such as a professional, certified, qualified or other type of sophisticated investor, according to the applicable laws in your jurisdiction.
If you do not meet all of these requirements, you are not entitled to use this website.
---
# Corporate Actions – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/corporate-actions/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Corporate Actions
On this page
Chevron Right
This page lists corporate actions affecting Robinhood Stock Tokens. Corporate actions can include events such as stock splits, dividends, mergers, name changes, and delistings of an underlying asset.
For each corporate action, Robinhood will publish the relevant adjustment event, details of the corporate action, and information on any adjustments made to the terms and conditions of the affected Stock Tokens.
Trading during corporate actions[](http://docs.robinhood.com/rhj/corporate-actions/#trading-during-corporate-actions)
------------------------------------------------------------------------------------------------------------------------
Trading in an affected Stock Token is typically paused while a corporate action is processed. In most cases, placing new orders is unavailable from the early morning on the effective date (around 2 AM CET/CEST) and resumes once processing is complete, typically by the start of the US market day (around 3:30 PM CET/CEST).
During certain corporate actions, open orders for the affected token may be canceled. In limited cases, such as a delisting or liquidation, only sell or redemption activity may be permitted while the action is processed.
Recent and Upcoming Actions[](http://docs.robinhood.com/rhj/corporate-actions/#recent-and-upcoming-actions)
--------------------------------------------------------------------------------------------------------------
Corporate action data is temporarily unavailable. Please check back later.
---
# Price Deviations – Robinhood RHJ
[Skip to content](http://docs.robinhood.com/rhj/price-deviations/#vocs-content)
Search...
[](http://docs.robinhood.com/rhj)
[](http://docs.robinhood.com/rhj)
Menu
Chevron Down
Menu
Price Deviations
On this page
Chevron Right
A price deviation occurs when a Stock Token trades at a significant premium or discount to the expected price of its underlying asset. Robinhood discloses a deviation on this page when a token's on-chain price differs from its underlying's reference price by 5% or more for seven consecutive trading days.
On-chain token prices can deviate for a variety of factors, including differences in liquidity, variances in mint and burn pricing, and market conditions.
Deviations are assessed at the end of each business day (five days a week), comparing the NYSE closing price for the underlying — benchmarked to the nearest block — against the average on-chain price from a reputable source over the trailing seven-day period.
Current Deviations[](http://docs.robinhood.com/rhj/price-deviations/#current-deviations)
-------------------------------------------------------------------------------------------
Price deviation data is temporarily unavailable. Please check back later.
---