|
|
(54 intermediate revisions by 12 users not shown) |
Line 1: |
Line 1: |
| The [[MtGox]] API provides various methods to access different informations from the market, place orders, and more. | | The [[MtGox]] API provides methods to access information from the market, place orders, and more. |
|
| |
|
| Two APIs are available at this point: the HTTP api (available by posting to mtgox.com/code/*) and the websocket API. | | Two APIs are currently available: |
| | |
| | * [[MtGox/API/HTTP|HTTP API]] |
| | * [[MtGox/API/Pubnub|Streaming Pubnub API]] |
| | * [[MtGox/API/Streaming|Streaming websocket API]] |
| | |
| | __TOC__ |
|
| |
|
| ==Number Formats== | | ==Number Formats== |
Line 13: |
Line 19: |
| ! kind of field !! ...divide by !! ...multiply by | | ! kind of field !! ...divide by !! ...multiply by |
| |- | | |- |
| | BTC (volume, amount) || 1E8 (10,000,000) || 0.00000001 | | | BTC (volume, amount) || 1E8 (100,000,000) || 0.00000001 |
| |- | | |- |
| | USD (price) || 1E5 (100,000) || 0.00001 | | | USD, AUD, CAD, CHF, CNY, DKK, EUR, GBP, HKD, NZD, PLN, RUB, SGD, THB, NOK, CZK (price) || 1E5 (100,000) || 0.00001 |
| |- | | |- |
| | JPY (price) || 1E3 (1,000) || 0.001 | | | JPY, SEK (price) || 1E3 (1,000) || 0.001 |
| |} | | |} |
|
| |
|
| Implementation advice: it's probably best to use '''int''' or '''Decimal''' (if your language/db offers such a type) in your clients. Using '''float''' will likely lead to nasty rounding problems. | | Implementation advice: it's probably best to use '''int''' or '''Decimal''' (if your language/db offers such a type) in your clients. Using '''float''' will likely lead to nasty rounding problems. |
|
| |
|
| == currency symbols == | | == Currency Symbols == |
| List of the Currency symbols you can use with the API :
| | List of the currency symbols available with the API: |
| | |
| USD, AUD, CAD, CHF, CNY, DKK, EUR, GBP, HKD, JPY, NZD, PLN, RUB, SEK, SGD, THB
| |
| | |
| == HTTP API ==
| |
| This API is available in <nowiki>https://mtgox.com/api/*</nowiki>, and provides various informations. It also supports making an order, a withdraw, a deposit, etc. There is also a [https://rubygems.org/gems/mtgox Ruby gem] and [[Finance::MtGox|Perl module]] for interacting with the HTTP API.
| |
| | |
| === Authentication ===
| |
| | |
| | |
| '''Authentication information may be compromised. See [https://en.bitcoin.it/wiki/Talk:MtGox/API Discussion]''' Delete when verified...
| |
| | |
| | |
| Authentication is performed by signing each request using HMAC-SHA512. The request must contain an extra value "nonce" which must be an always incrementing numeric value. In addition to the "nonce" value, your POST data must also include your username and password values, named "name" and "pass" respectively. A reference implementation is provided here:
| |
| <source lang="php">
| |
| <?php
| |
| | |
| function mtgox_query($path, array $req = array()) {
| |
| // API settings
| |
| $key = '';
| |
| $secret = '';
| |
| | |
| // generate a nonce as microtime, with as-string handling to avoid problems with 32bits systems
| |
| $mt = explode(' ', microtime());
| |
| $req['nonce'] = $mt[1].substr($mt[0], 2, 6);
| |
| | |
| // generate the POST data string
| |
| $post_data = http_build_query($req, '', '&');
| |
| | |
| // generate the extra headers
| |
| $headers = array(
| |
| 'Rest-Key: '.$key,
| |
| 'Rest-Sign: '.base64_encode(hash_hmac('sha512', $post_data, base64_decode($secret), true)),
| |
| );
| |
| | |
| // our curl handle (initialize if required)
| |
| static $ch = null;
| |
| if (is_null($ch)) {
| |
| $ch = curl_init();
| |
| curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
| |
| curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MtGox PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
| |
| }
| |
| curl_setopt($ch, CURLOPT_URL, 'https://mtgox.com/api/'.$path);
| |
| curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
| |
| curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
| |
| | |
| // run the query
| |
| $res = curl_exec($ch);
| |
| if ($res === false) throw new Exception('Could not get reply: '.curl_error($ch));
| |
| $dec = json_decode($res, true);
| |
| if (!$dec) throw new Exception('Invalid data received, please make sure connection is working and requested API exists');
| |
| return $dec;
| |
| }
| |
| | |
| // example 1: get infos about the account, plus the list of rights we have access to
| |
| var_dump(mtgox_query('0/info.php'));
| |
| | |
| // old api (get funds)
| |
| var_dump(mtgox_query('0/getFunds.php'));
| |
| | |
| // trade example
| |
| // var_dump(mtgox_query('0/buyBTC.php', array('amount' => 1, 'price' => 15)));
| |
| </source>
| |
| | |
| === Cache ===
| |
| | |
| All of the API methods below have cached results, ticker, depth . . . have a 10 seconds cache .
| |
| No need to poll more often, you wont have more results, you could just be blocked by the prolexic anti ddos features.
| |
| | |
| === Methods API version 0===
| |
| | |
| ==== 0/data/getTrades.php ====
| |
| This allows retrieving all trades which happened in the last 24 hours. The returned data is cached and may not reflect latest activity.
| |
| | |
| Parameters:
| |
| * since: Passing a tid in "since" allows retrieving all trades since that trade. The passed id is may not exist. Ie. to get all trades from the very beginning one would just call https://mtgox.com/code/data/getTrades.php?since=0 . since returns only 100 trades, and you can call the method again by passing the latest trade you have imported in since.
| |
| | |
| * data is returned in standard json format like :
| |
| <source lang="php">
| |
| [
| |
| {"date":1279408157,
| |
| "price":"0.04951",
| |
| "amount":"20",
| |
| "price_int":"4951",
| |
| "amount_int":"2000000000",
| |
| "tid":"1",
| |
| "price_currency":"USD",
| |
| "item":"BTC",
| |
| "trade_type":""
| |
| "primary":"Y"
| |
| },
| |
| {"date":1279424586,"price":"0.05941","amount":"50.01","price_int":"5941","amount_int":"5001000000","tid":"2","price_currency":"USD","item":"BTC","trade_type":""}]
| |
| </source>
| |
| | |
| ==== 0/getDepth.php ====
| |
| Get the current Market depth
| |
| | |
| https://mtgox.com/api/0/data/getDepth.php?Currency=PLN
| |
| | |
| https://mtgox.com/api/0/data/getDepth.php?Currency=AUD
| |
| | |
| https://mtgox.com/api/0/data/getDepth.php?Currency=USD
| |
| | |
| ==== 0/getFunds.php ====
| |
| Get your current balance
| |
| | |
| https://mtgox.com/api/0/getFunds.php
| |
| | |
| getfunds is now deprecated since multi currency, please use info.php
| |
| | |
| ==== 0/buyBTC.php ====
| |
| Place an order to Buy BTC
| |
| | |
| https://mtgox.com/api/0/buyBTC.php
| |
| | |
| POST data: amount=#&price=#&Currency=PLN
| |
| | |
| returns a list of your open orders
| |
| | |
| you can omit the price to do a market order
| |
| | |
| ==== 0/sellBTC.php ====
| |
| Place an order to Sell BTC
| |
| | |
| https://mtgox.com/api/0/sellBTC.php
| |
| | |
| POST data: &amount=#&price=#&Currency=PLN
| |
| | |
| returns a list of your open orders
| |
| | |
| you can omit the price to do a market order
| |
| | |
| ==== 0/getOrders.php ====
| |
| Fetch a list of your open Orders
| |
| | |
| https://mtgox.com/api/0/getOrders.php
| |
| | |
| oid: Order ID
| |
| | |
| type: 1 for sell order or 2 for buy order
| |
| | |
| status: 1 for active, 2 for not enough funds
| |
| | |
| ==== 0/cancelOrder.php ====
| |
| Cancel an order
| |
| | |
| https://mtgox.com/api/0/cancelOrder.php
| |
| | |
| POST data: oid=#&type=#
| |
| | |
| oid: Order ID
| |
| | |
| type: 1 for sell order or 2 for buy order
| |
| | |
| ==== 0/redeemCode.php ====
| |
| Used to redeem a mtgox coupon code
| |
| | |
| https://mtgox.com/api/0/redeemCode.php
| |
| | |
| * call with a post parameter "code" containing the code to redeem
| |
| | |
| * it will return an array with amount (float amount value of code), currency (3 letters, BTC or USD), reference (the transaction id), and status
| |
| | |
| ==== 0/withdraw.php ====
| |
| withdraw / Send BTC
| |
| | |
| https://mtgox.com/api/0/withdraw.php
| |
| | |
| POST data: group1=BTC&btca=bitcoin_address_to_send_to&amount=#
| |
| | |
| * pass btca parameter to withdraw to a btc adress
| |
| | |
| * pass group1 for a coupon : BTC2CODE or USD2CODE
| |
| | |
| * pass group1=DWUSD for a dwolla withdraw
| |
| | |
| * pass green=1 to use the new greenaddress feature ( see [[GreenAddress]] )
| |
| * return code and status if successful
| |
| | |
| To make a withdraw in another Currency , use group1=USD2CODE and add a Currency parameter ( example Currency=EUR to get a mtgox EUR coupon )
| |
| | |
| ==== 0/btcAddress.php ====
| |
| get a bitcoin deposit adress for your account
| |
| | |
| https://mtgox.com/api/0/btcAddress.php
| |
| | |
| * pass POST data "description" to add a description that will appear in your history when this BTC address receive a deposit
| |
| | |
| * returns a bitcoin deposit address
| |
| | |
| ==== 0/history_[CUR].csv ====
| |
| | |
| Allows downloading your activity history for a given currency (BTC or USD for now).
| |
| | |
| https://mtgox.com/api/0/history_BTC.csv
| |
| | |
| https://mtgox.com/api/0/history_USD.csv
| |
| | |
| ==== 0/info.php ====
| |
| | |
| https://mtgox.com/api/0/info.php
| |
| | |
| returns info about your account, funds, fees, API privileges . . .
| |
| | |
| ==== 0/ticker ====
| |
| | |
| http://mtgox.com/api/0/data/ticker.php
| |
| | |
| returns the current ticker :
| |
| | |
| <source lang="php">
| |
| {"ticker":
| |
| {
| |
| "high":5.70653,
| |
| "low":5.4145,
| |
| "avg":5.561388723,
| |
| "vwap":5.610932845,
| |
| "vol":55698,
| |
| "last":5.56915,
| |
| "buy":5.51326,
| |
| "sell":5.5672
| |
| }
| |
| }
| |
| </source>
| |
| | |
| | |
| === API version 0 examples ===
| |
| | |
| ==== all api shell type CLI ====
| |
| | |
| python : http://www.goxsh.info/
| |
| | |
| perl : http://pastebin.com/vEpgw5nW
| |
| | |
| ==== other ====
| |
| | |
| https : http://stackoverflow.com/questions/7046370/https-request-with-boost-asio-and-openssl
| |
| | |
| https://github.com/sje397/mtgox-plasmoid
| |
| | |
| module perl : http://search.cpan.org/~mndrix/Finance-MtGox-0.02/
| |
| | |
| ==== gather data ====
| |
| | |
| https://github.com/Lexiks/MyBitBoard
| |
| | |
| ==== gettrade ====
| |
| | |
| python : https://bitcointalk.org/index.php?topic=39402.0
| |
| | |
| perl : http://pastebin.com/raw.php?i=pmhMXZJu
| |
| | |
| ==== ticker ====
| |
| | |
| http://pastebin.com/pd0ZR4WY
| |
| | |
| === Methods API version 1===
| |
| | |
| ==== Multi Currency Ticker ====
| |
| | |
| https://mtgox.com/api/1/BTCUSD/public/ticker
| |
| https://mtgox.com/api/1/BTCEUR/public/ticker
| |
| | |
| returns the current ticker for the selected currency :
| |
| | |
| <source lang="php">
| |
| {
| |
| "result":"success",
| |
| "return":
| |
| {
| |
| "high": {"value":"5.70653","value_int":"570653","display":"$5.70653","currency":"USD"},
| |
| "low": {"value":"5.4145","value_int":"541450","display":"$5.41450","currency":"USD"},
| |
| "avg": {"value":"5.561119626","value_int":"556112","display":"$5.56112","currency":"USD"},
| |
| "vwap": {"value":"5.610480461","value_int":"561048","display":"$5.61048","currency":"USD"},
| |
| "vol":
| |
| {
| |
| "value":"55829.58960346",
| |
| "value_int":"5582958960346",
| |
| "display":"55,829.58960346\u00a0BTC",
| |
| "currency":"BTC"
| |
| },
| |
| "last_local":{"value":"5.5594","value_int":"555940","display":"$5.55940","currency":"USD"},
| |
| "last_orig":{"value":"5.5594","value_int":"555940","display":"$5.55940","currency":"USD"},
| |
| "last":{"value":"5.5594","value_int":"555940","display":"$5.55940","currency":"USD"},
| |
| "buy":{"value":"5.53587","value_int":"553587","display":"$5.53587","currency":"USD"},
| |
| "sell":{"value":"5.56031","value_int":"556031","display":"$5.56031","currency":"USD"}
| |
| }
| |
| </source>
| |
| | |
| note : last_local include only the last trade in the selected currency, last_orig include data of the original last trade ( currency,price in currency . . . ),last can be a conversion of the last trde in another currency
| |
| | |
| ==== Multi Currency depth ====
| |
| | |
| https://mtgox.com/api/1/BTCPLN/public/depth?raw
| |
| | |
| https://mtgox.com/api/1/BTCAUD/public/depth?raw
| |
| | |
| ==== Multi currency trades ====
| |
| | |
| https://mtgox.com/api/1/BTCPLN/public/trades?raw
| |
| | |
| https://mtgox.com/api/1/BTCAUD/public/trades?raw
| |
| | |
| to get only the trades since a given trade id, you can add the parameter since=<trade_id>
| |
| | |
| https://mtgox.com/api/1/BTCUSD/public/trades?since=0
| |
| | |
| https://mtgox.com/api/1/BTCEUR/public/trades?since=1316312781670700
| |
| | |
| For multi currency,also returns the primary value,"Y" or "N", the primary currency is always the buyers currency
| |
| | |
| A trade can appear in more than one currency, to ignore duplicates, use only the trades having primary =Y
| |
| | |
| example of returned data :
| |
| <source lang="php">
| |
| {"date":1316312781,
| |
| "price":"3.5599",
| |
| "amount":"3.6900096",
| |
| "price_int":"355990",
| |
| "amount_int":"369000960",
| |
| "tid":"1316312781670700",
| |
| "price_currency":"EUR",
| |
| "item":"BTC",
| |
| "trade_type":"bid",
| |
| "primary":"Y",
| |
| "properties":"limit,mixed_currency"
| |
| }
| |
| </source>
| |
| | |
| ==== Cancelled Trades ====
| |
| | |
| https://mtgox.com/api/1/BTCUSD/public/cancelledtrades
| |
| | |
| returns a list of all the cancelled trades this last month, list of trade ids in json format .
| |
| | |
| == Websocket API ==
| |
| ported on 7/10/2011 from http://forum.bitcoin.org/index.php?topic=5855.0
| |
| | |
| ===Connecting===
| |
| | |
| You can connect via: ws://websocket.mtgox.com/mtgox
| |
| | |
| The WebSocket protocol version used is that described in [http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00 draft-ietf-hybi-thewebsocketprotocol-00] (aka draft-00).
| |
| | |
| ===Channels===
| |
| | |
| The websocket will subscribe you to some channels automatically:
| |
| | |
| {| class="wikitable"
| |
| |-
| |
| ! Channel ID !! Description
| |
| |-
| |
| | dbf1dee9-4f2e-4a08-8cb7-748919a71b21 || trades (each time a trade happens, you get something here)
| |
| |-
| |
| | d5f06780-30a8-4a48-a2f8-7ed181b4a13f || the mtgox ticker (lots of updates, with often the same data)
| |
| |-
| |
| | 24e67e0d-1cad-4cc0-9e7a-f8523ef460fe || depth information in realtime (price + amount + type... type=1=Ask, type=2=Bid)
| |
| |}
| |
| | |
| Additionally each user has a "own" channel which streams informations about orders (new order, deleted order, etc) and trades only the user's trades).
| |
| | |
| Each message is a JSON-encoded object, with at least "op" element. The "op" element contains the operation to be done (for outgoing messages), or the type of message (for incoming messages).
| |
| | |
| ===Possible outgoing commands===
| |
| | |
| '''unsubscribe''' Stop receiving messages from a channel (parameter "channel")
| |
| | |
| ===Incoming Data===
| |
| | |
| ====Ticker====
| |
| <source lang="javascript">
| |
| {
| |
| "channel":"d5f06780-30a8-4a48-a2f8-7ed181b4a13f",
| |
| "op":"private",
| |
| "origin":"broadcast",
| |
| "private":"ticker",
| |
| "ticker":{
| |
| "buy":0.9515,
| |
| "high":1,
| |
| "low":0.91,
| |
| "sell":0.9697,
| |
| "vol":34349
| |
| }
| |
| }
| |
| </source>
| |
| | |
| '''ticker''' contains the following:
| |
| | |
| {| class="wikitable"
| |
| |-
| |
| ! Name !! Value
| |
| |-
| |
| | buy || highest bid as float
| |
| |-
| |
| | sell || lowest ask as float
| |
| |-
| |
| | high || maximum rate since last close as float
| |
| |-
| |
| | low || minimum rate since last close as float
| |
| |-
| |
| | vol || traded volume since last close
| |
| |}
| |
| | |
| ====Trade====
| |
| | |
| <source lang="javascript">{
| |
| "channel":"dbf1dee9-4f2e-4a08-8cb7-748919a71b21",
| |
| "op":"private",
| |
| "origin":"broadcast",
| |
| "private":"trade",
| |
| "trade":{
| |
| "amount":2.71,
| |
| "amount_int":"271000000",
| |
| "date":1310279340,
| |
| "item":"BTC",
| |
| "price":14.43,
| |
| "price_currency":"USD",
| |
| "price_int":"1443000",
| |
| "tid":"1310279340877902",
| |
| "trade_type":"bid",
| |
| "type":"trade"
| |
| }
| |
| }
| |
| </source>
| |
| | |
| '''trade''' contains the following:
| |
| | |
| {| class="wikitable"
| |
| |-
| |
| ! Name !! Value
| |
| |-
| |
| | amount || the traded amount in item (BTC), float, deprecated
| |
| |-
| |
| | amount_int || the traded amount * 1E8
| |
| |-
| |
| | date || unix timestamp of trade
| |
| |-
| |
| | item || What was this trade about
| |
| |-
| |
| | price || price per unit, float, deprecated
| |
| |-
| |
| | price_int || price in smallest unit as integer (5 decimals of USD, 3 in case of JPY)
| |
| |-
| |
| | price_currency || currency in which trade was completed
| |
| |-
| |
| | tid || Trade id (big integer, which is in fact trade timestamp in microseconds)
| |
| |-
| |
| | trade_type || Did this trade result from the execution of a bid or a ask?
| |
| |-
| |
| |}
| |
| | |
| ====Depth====
| |
| | |
| Changes to the market depth data are broadcast so an up-to-date market depth can be kept by clients.
| |
| | |
| <source lang="javascript">{
| |
| "channel":"24e67e0d-1cad-4cc0-9e7a-f8523ef460fe",
| |
| "depth":{
| |
| "currency":"USD",
| |
| "item":"BTC",
| |
| "price":"14.43",
| |
| "price_int":"1443000",
| |
| "type":1,
| |
| "type_str":"ask",
| |
| "volume":"-2.71",
| |
| "volume_int":"-271000000"
| |
| },
| |
| "op":"private",
| |
| "origin":"broadcast",
| |
| "private":"depth"
| |
| }</source>
| |
| | |
| '''depth''' contains the following:
| |
| | |
| :{| class="wikitable"
| |
| |-
| |
| ! Name !! Value
| |
| |-
| |
| | currency || the currency affected
| |
| |-
| |
| | item || the item (BTC)
| |
| |-
| |
| | price || price as a float, deprecated
| |
| |-
| |
| | price_int || the price at which volume change happened (5 decimal for USD, 3 for JPY)
| |
| |-
| |
| | type || 1=ask, 2=bid. deprecated, use type_str
| |
| |-
| |
| | type_str || type of order at this depth, either "ask" or "bid"
| |
| |-
| |
| | volume || the volume change as float, deprecated
| |
| |-
| |
| | volume_int || volume change * 1E8
| |
| | |
| |}
| |
| | |
| === examples ===
| |
| | |
| ==== ticker ====
| |
| javascript, using hookio :
| |
| | |
| http://www.youtube.com/watch?v=KD5ljtNK72U
| |
| | |
| http://github.com/hookio
| |
| | |
| http://github.com/cronopio/hook.io-mtgox
| |
|
| |
|
| | USD, AUD, CAD, CHF, CNY, DKK, EUR, GBP, HKD, JPY, NZD, PLN, RUB, SEK, SGD, THB, NOK, CZK |
|
| |
|
| | ==Date and time== |
|
| |
|
| Another node.js project, using plain websockets (largely based on cronopio's work) :
| | Most dates you will find in mtgox API are UNIX time |
|
| |
|
| https://github.com/dlanod/node-mtgox-websocket-client
| | See http://en.wikipedia.org/wiki/Unix_time |
|
| |
|
| ==== arbitrage ====
| | Most programming languages should have tools for managing those timestamps |
| https://github.com/goteppo/ArBit
| |
|
| |
|
| ==== websocket ==== | | ==See Also== |
| https://github.com/cronopio/hook.io-ws
| |
|
| |
|
| https://github.com/dlanod/node-mtgox-websocket-client
| | * [http://bitcointalk.org/index.php?topic=164404.0 MtGox API version 2: Unofficial Documentation] |