Search code examples
pythonapipython-requestscryptocurrency

Placing a crypto order with Robinhood nummus API


I am trying to extend this repo with support for cryptocurrency trading using Python (will create a PR once completed).

I have all the API methods working with the exception of actually placing trades.

The endpoint for placing crypto orders is https://nummus.robinhood.com/orders/

This endpoint expects a POST request to be made with the body in JSON format along with the following headers:

"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5",
"Content-Type": "application/json",
"X-Robinhood-API-Version": "1.0.0",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Origin": "https://robinhood.com",
"Authorization": "Bearer <access_token>"

The payload I'm sending looks like this:

{   
    'account_id': <account id>,
    'currency_pair_id': '3d961844-d360-45fc-989b-f6fca761d511', // this is BTC
    'price': <BTC price derived using quotes API>,
    'quantity': <BTC quantity>,
    'ref_id': str(uuid.uuid4()), // Im not sure why this is needed but I saw someone else use [the uuid library][2] to derive this value like this
    'side': 'buy',
    'time_in_force': 'gtc',
    'type': 'market'
}

The response I get is as follows: 400 Client Error: Bad Request for url: https://nummus.robinhood.com/orders/

I can confirm that I am able to authenticate successfully since I am able to use the https://nummus.robinhood.com/accounts/ and https://nummus.robinhood.com/holdings/ endpoints to view my account data and holdings.

I also believe that my access_token in the Authentication header is correct because if I set it to some random value (Bearer abc123, for instance) I get a 401 Client Error: Unauthorized response.

I think the issue has to do with the payload but I am not able to find good documentation for the nummus.robinhood.com API.

Does anyone see how/whether my request payload is malformed and/or can point me in the right direction to documentation for the nummus.robinhood.com/orders endpoint?


Solution

  • You need to pass the json payload as the value to the parameter json in the requests post call

    import requests
    
    json_payload = {   
        'account_id': <account id>,
        'currency_pair_id': '3d961844-d360-45fc-989b-f6fca761d511', // this is BTC
        'price': <BTC price derived using quotes API>,
        'quantity': <BTC quantity>,
        'ref_id': str(uuid.uuid4()), // Im not sure why this is needed but I saw someone else use [the uuid library][2] to derive this value like this
        'side': 'buy',
        'time_in_force': 'gtc',
        'type': 'market'
    }
    
    headers = {
        "Accept": "application/json",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5",
        "Content-Type": "application/json",
        "X-Robinhood-API-Version": "1.0.0",
        "Connection": "keep-alive",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
        "Origin": "https://robinhood.com",
        "Authorization": "Bearer <access_token>"
    }
    
    url = "https://nummus.robinhood.com/orders/"
    
    s = requests.Session()
    res = s.request("post", url, json=json_payload, timeout=10, headers=headers)
    print(res.status_code)
    print(res.text)