├── README.md └── bitmexAPI.py /README.md: -------------------------------------------------------------------------------- 1 | # Bitmex API 2 | 3 | ## Description 4 | This API follows the calls layedout by the official bitmex documentation at "*https://www.bitmex.com/api/explorer/*". 5 | 6 | ### Repository Contains: 7 | - bitmexAPI.py : This contains all the calls for the REST api. 8 | 9 | 10 | ## Usage 11 | Usage for this is via creating the object for the api within a file and calling the defined functions within the object. 12 | 13 | ### Contact 14 | EMAIL: jlennie1996@gmail.com 15 | -------------------------------------------------------------------------------- /bitmexAPI.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | 3 | """ 4 | This is the bitmex REST API python call. 5 | Official documentation can be found at 'https://www.bitmex.com/api/explorer/' 6 | """ 7 | import hmac 8 | import hashlib 9 | import requests 10 | import time 11 | import sys 12 | from urllib.parse import urlencode 13 | 14 | 15 | REAL_BASE = 'https://www.bitmex.com/api/v1' 16 | TEST_BASE = 'https://testnet.bitmex.com/api/v1' 17 | 18 | 19 | """ 20 | ERROR 400: Parameter Error 21 | 22 | ERROR 401: Unauthorized 23 | 24 | ERROR 403: Access Denied 25 | 26 | ERROR 404: Not Found 27 | 28 | 29 | """ 30 | 31 | 32 | class Bitmex(object): 33 | 34 | def __init__(self, api_key=None, api_secret=None, testing=False): 35 | self.api_key = str(api_key) if api_key is not None else '' 36 | self.api_secret = str(api_secret) if api_secret is not None else '' 37 | self.BASE_URL = REAL_BASE if not(testing) else TEST_BASE 38 | 39 | 40 | ## Announcements. 41 | def get_announcement(self, **OPargs): 42 | """ 43 | This is used to get announcements from bitmex. 44 | 45 | PARAMS: 46 | columns : STRING 47 | """ 48 | params = {} 49 | params.update(OPargs) 50 | data = self.api_request("GET", "/announcement", params) 51 | return(data) 52 | 53 | 54 | def get_urgent_announcement(self): 55 | """ 56 | This is used to get urgent announcements from bitmex. 57 | """ 58 | data = self.api_request("GET", "/announcement/urgent", {}) 59 | return(data) 60 | 61 | 62 | ## API Keys. 63 | def get_API_keys(self, **OPargs): 64 | """ 65 | This gets your API keys. 66 | 67 | PARAMS: 68 | reverse : BOOLEAN 69 | """ 70 | params={} 71 | params.update(OPargs) 72 | data = self.api_signed_request("GET", "/apiKey", params) 73 | return(data) 74 | 75 | 76 | def create_API_key(self, **OPargs): 77 | """ 78 | This is used to create and API key. 79 | 80 | PARAMS: 81 | name : STRING 82 | cidr : STRING 83 | permissions : STRING 84 | enabled : BOOLEAN 85 | token : STRING 86 | """ 87 | params={} 88 | params.update(OPargs) 89 | data = self.api_signed_request("POST", "/apiKey", params) 90 | return(data) 91 | 92 | 93 | def remove_API_key(self, apiKeyID): 94 | """ 95 | This deletes an API key. 96 | 97 | PARAMS: 98 | apiKeyID : STRING 99 | """ 100 | params={"apiKeyID":apiKeyID} 101 | data = self.api_signed_request("DELETE", "/apiKey", params) 102 | return(data) 103 | 104 | 105 | def disable_API_key(self, apiKeyID): 106 | """ 107 | This disables your API key. 108 | 109 | PARAMS: 110 | apiKeyID : STRING 111 | """ 112 | params={"apiKeyID":apiKeyID} 113 | data = self.api_signed_request("POST", "/apiKey/disable", params) 114 | return(data) 115 | 116 | 117 | def enable_API_key(self, apiKeyID): 118 | """ 119 | This enables your API key. 120 | 121 | PARAMS: 122 | apiKeyID : STRING 123 | """ 124 | params={"apiKeyID":apiKeyID} 125 | data = self.api_signed_request("POST", "/apiKey/enable", params) 126 | return(data) 127 | 128 | 129 | ## Chat. 130 | def get_messages(self, **OPargs): 131 | """ 132 | This is used to get messages. 133 | 134 | PARAMS: 135 | count : DOUBLE 136 | start : DOUBLE 137 | reverse : BOOLEAN 138 | channelID : DOUBLE 139 | """ 140 | params={} 141 | params.update(OPargs) 142 | data = self.api_request("GET", "/chat", params) 143 | return(data) 144 | 145 | 146 | def send_message(self, **OPargs): 147 | """ 148 | This is used to send messages. 149 | 150 | PARAMS: 151 | message : STRING 152 | channelID : DOUBLE 153 | """ 154 | params={} 155 | params.update(OPargs) 156 | data = self.api_signed_request("POST", "/chat", params) 157 | return(data) 158 | 159 | 160 | def available_channels(self): 161 | """ 162 | This is used to get channels. 163 | """ 164 | data = self.api_request("GET", "/chat/channels", {}) 165 | return(data) 166 | 167 | 168 | def connected_users(self): 169 | """ 170 | This gets a list of connected users. 171 | """ 172 | data = self.api_request("GET", "/chat/connected", {}) 173 | return(data) 174 | 175 | 176 | ## Execution. 177 | def get_executions(self, **OPargs): 178 | """ 179 | 180 | PARAMS: 181 | symbol : STRING 182 | filter : STRING 183 | columns : STRING 184 | count : DOUBLE 185 | start : DOUBLE 186 | reverse : BOOLEAN 187 | startTime : DATE-TIME 188 | endTime : DATE-TIME 189 | """ 190 | params={} 191 | params.update(OPargs) 192 | data = self.api_signed_request("GET", "/execution", params) 193 | return(data) 194 | 195 | 196 | def get_all_executions(self, **OPargs): 197 | """ 198 | 199 | PARAMS: 200 | symbol : STRING 201 | filter : STRING 202 | columns : STRING 203 | count : DOUBLE 204 | start : DOUBLE 205 | reverse : BOOLEAN 206 | startTime : DATE-TIME 207 | endTime : DATE-TIME 208 | """ 209 | params={} 210 | params.update(OPargs) 211 | data = self.api_signed_request("GET", "/execution/tradeHistory", params) 212 | return(data) 213 | 214 | 215 | ## Funding. 216 | def funding_history(self, **OPargs): 217 | """ 218 | 219 | PARAMS: 220 | symbol : STRING 221 | filter : STRING 222 | columns : STRING 223 | count : DOUBLE 224 | start : DOUBLE 225 | reverse : BOOLEAN 226 | startTime : DATE-TIME 227 | endTime : DATE-TIME 228 | """ 229 | params={} 230 | params.update(OPargs) 231 | data = self.api_request("GET", "/funding", params) 232 | return(data) 233 | 234 | 235 | ## Global Notification. 236 | def get_global_notifications(self): 237 | """ 238 | """ 239 | data = self.api_request("GET", "/globalNotification", {}) 240 | return(data) 241 | 242 | 243 | ## Instrument. 244 | def get_instruments(self, **OPargs): 245 | """ 246 | 247 | PARAMS: 248 | symbol : STRING 249 | filter : STRING 250 | columns : STRING 251 | count : DOUBLE 252 | start : DOUBLE 253 | reverse : BOOLEAN 254 | startTime : DATE-TIME 255 | endTime : DATE-TIME 256 | """ 257 | params={} 258 | params.update(OPargs) 259 | data = self.api_request("GET", "/instrument", params) 260 | return(data) 261 | 262 | 263 | def get_all_instruments(self): 264 | """ 265 | """ 266 | data = self.api_request("GET", "/instrument/active", {}) 267 | return(data) 268 | 269 | 270 | def active_indices(self): 271 | """ 272 | """ 273 | data = self.api_request("GET", "/instrument/activeAndIndices", {}) 274 | return(data) 275 | 276 | 277 | def active_itervals(self): 278 | """ 279 | """ 280 | data = self.api_request("GET", "/activeIntervals", {}) 281 | return(data) 282 | 283 | 284 | def composite_index(self, **OPargs): 285 | """ 286 | 287 | PARAMS: 288 | symbol : STRING 289 | filter : STRING 290 | columns : STRING 291 | count : DOUBLE 292 | start : DOUBLE 293 | reverse : BOOLEAN 294 | startTime : DATE-TIME 295 | endTime : DATE-TIME 296 | """ 297 | params={} 298 | params.update(OPargs) 299 | data = self.api_request("GET", "/compositeIndex", params) 300 | return(data) 301 | 302 | 303 | def indice_prices(self): 304 | """ 305 | """ 306 | data = self.api_request("GET", "/indices", {}) 307 | return(data) 308 | 309 | 310 | 311 | ## Insurance. 312 | def get_insurance(self, **OPargs): 313 | """ 314 | 315 | PARAMS: 316 | symbol : STRING 317 | filter : STRING 318 | columns : STRING 319 | count : DOUBLE 320 | start : DOUBLE 321 | reverse : BOOLEAN 322 | startTime : DATE-TIME 323 | endTime : DATE-TIME 324 | """ 325 | params={} 326 | params.update(OPargs) 327 | data = self.api_request("GET", "/insurance", params) 328 | return(data) 329 | 330 | 331 | 332 | ## Leaderboard. 333 | def get_leaderboard(self, **OPargs): 334 | """ 335 | 336 | PARAMS: 337 | method : STRING 338 | """ 339 | params={} 340 | params.update(OPargs) 341 | data = self.api_request("GET", "/leaderboard", params) 342 | return(data) 343 | 344 | 345 | def get_leaderboard_name(self): 346 | """ 347 | """ 348 | data = self.api_signed_request("GET", "/leaderboard/name", {}) 349 | return(data) 350 | 351 | 352 | 353 | ## Liquidation. 354 | def get_liquidations(self, **OPargs): 355 | """ 356 | 357 | PARAMS: 358 | symbol : STRING 359 | filter : STRING 360 | columns : STRING 361 | count : DOUBLE 362 | start : DOUBLE 363 | reverse : BOOLEAN 364 | startTime : DATE-TIME 365 | endTime : DATE-TIME 366 | """ 367 | params={} 368 | params.update(OPargs) 369 | data = self.api_request("GET", "/liquidation", params) 370 | return(data) 371 | 372 | 373 | 374 | ## Notification. ## TO-DO 375 | def get_notifications(self): 376 | data = self.api_request("GET", "/notification") 377 | return(data) 378 | 379 | 380 | ## Order. 381 | def get_orders(self, **OPargs): 382 | """ 383 | 384 | PARAMS: 385 | symbol : STRING 386 | filter : STRING 387 | columns : STRING 388 | count : DOUBLE 389 | start : DOUBLE 390 | reverse : BOOLEAN 391 | startTime : DATE-TIME 392 | endTime : DATE-TIME 393 | """ 394 | params={} 395 | params.update(OPargs) 396 | data = self.api_signed_request("GET", "/order", params) 397 | return(data) 398 | 399 | 400 | def amend_order(self, **OPargs): 401 | """ 402 | 403 | PARAMS: 404 | orderID : STRING 405 | origClOrdID : STRING 406 | clOrdID : STRING 407 | simpleOrderQty : DOUBLE 408 | orderQty : DOUBLE 409 | simpleLeavesQty : DOUBLE 410 | leavesQty : DOUBLE 411 | price : DOUBLE 412 | stopPx : DOUBLE 413 | pregOffsetValue : DOUBLE 414 | text : STRING 415 | """ 416 | params={} 417 | params.update(OPargs) 418 | data = self.api_signed_request("PUT", "/order", params) 419 | return(data) 420 | 421 | 422 | def create_order(self, symbol, **OPargs): 423 | """ 424 | 425 | PARAMS: 426 | symbole : STRING 427 | side : STRING 428 | simpleOrderQty : DOUBLE 429 | orderQty : DOUBLE 430 | price : DOUBLE 431 | displayQty : DOUBLE 432 | stopPx : DOUBLE 433 | clOrderID : STRING 434 | clOrderLinkID : STRING 435 | pegOffsetValue : DOUBLE 436 | pegPriceType : STRING 437 | orderType : STRING 438 | timeInForce : STRING 439 | execInst : STRING 440 | contingencyType : STRING 441 | text : STRING 442 | """ 443 | params={"symbol":symbol} 444 | params.update(OPargs) 445 | data = self.api_signed_request("POST", "/order", params) 446 | return(data) 447 | 448 | 449 | def cancel_order(self, **OPargs): 450 | """ 451 | 452 | PARAMS: 453 | orderID : STRING 454 | clOrdID : STRING 455 | text : STRING 456 | """ 457 | params={} 458 | params.update(OPargs) 459 | data = self.api_signed_request("DELETE", "/order", params) 460 | return(data) 461 | 462 | 463 | def cancel_all_orders(self, **OPargs): 464 | """ 465 | 466 | PARAMS: 467 | symbol : STRING 468 | filter : STRING 469 | text : STRING 470 | """ 471 | params={} 472 | params.update(OPargs) 473 | data = self.api_signed_request("DELETE", "/order/all", params) 474 | return(data) 475 | 476 | 477 | def amend_multi_orders(self, **OPargs): 478 | """ 479 | 480 | PARAMS: 481 | orders : STRING 482 | """ 483 | params={} 484 | params.update(OPargs) 485 | data = self.api_signed_request("PUT", "/order/bulk", params) 486 | return(data) 487 | 488 | 489 | def create_multi_orders(self, **OPargs): 490 | """ 491 | 492 | PARAMS: 493 | orders : STRING 494 | """ 495 | params={} 496 | params.update(OPargs) 497 | data = self.api_signed_request("POST", "/order/bulk", params) 498 | return(data) 499 | 500 | 501 | def cancel_spec_orders(self, timeout): 502 | """ 503 | PARAMS: 504 | timeout : DOUBLE 505 | """ 506 | params={"timeout":timeout} 507 | data = self.api_signed_request("POST", "/order/cancelAllAfter", params) 508 | return(data) 509 | 510 | 511 | def close_position(self, symbol, **OPargs): 512 | """ 513 | 514 | PARAMS: 515 | symbol : STRING 516 | price : DOUBLE 517 | """ 518 | params={"symbol":symbol} 519 | params.update(OPargs) 520 | data = self.api_signed_request("POST", "/order/closePosition", params) 521 | return(data) 522 | 523 | 524 | 525 | ## OrderBook. 526 | def get_orderbook(self, symbol, **OPargs): 527 | """ 528 | 529 | PARAMS: 530 | symbol : STRING 531 | depth : DOUBLE 532 | """ 533 | params={"symbol":symbol} 534 | params.update(OPargs) 535 | data = self.api_request("GET", "/orderBook/L2", params) 536 | return(data) 537 | 538 | 539 | 540 | ## Position. 541 | def get_positions(self, **OPargs): 542 | """ 543 | 544 | PARAMS: 545 | filter : STRING 546 | columns : STRING 547 | count : DOUBLE 548 | """ 549 | params={} 550 | params.update(OPargs) 551 | data = self.api_signed_request("GET", "/position", params) 552 | return(data) 553 | 554 | 555 | def allow_isolated_margin(self, symbol, **OPargs): 556 | """ 557 | 558 | PARAMS: 559 | symbol : STRING 560 | enabled : DOUBLE 561 | """ 562 | params={"symbol":symbol} 563 | params.update(OPargs) 564 | data = self.api_signed_request("POST", "/position/isolate", params) 565 | return(data) 566 | 567 | 568 | def set_leverage(self, symbol, leverage): 569 | """ 570 | 571 | PARAMS: 572 | symbol : STRING 573 | leverage : DOUBLE 574 | """ 575 | params={"symbol":symbol, "leverage":leverage} 576 | data = self.api_signed_request("POST", "/position/leverage", params) 577 | return(data) 578 | 579 | 580 | def update_risk(self, symbol, riskLimit): 581 | """ 582 | 583 | PARAMS: 584 | symbol : STRING 585 | riskLimit : DOUBLE 586 | """ 587 | params={"symbol":symbol, "riskLimit":riskLimit} 588 | data = self.api_signed_request("POST", "/position/riskLimit", params) 589 | return(data) 590 | 591 | 592 | def transfer_equity(self, symbol, amount): 593 | """ 594 | 595 | PARAMS: 596 | symbol : STRING 597 | amount : DOUBLE 598 | """ 599 | params={"symbol":symbol, "amount":amount} 600 | data = self.api_signed_request("POST", "/position/transferMargin", params) 601 | return(data) 602 | 603 | 604 | 605 | ## Quote. 606 | def get_quotes(self, **OPargs): 607 | """ 608 | 609 | PARAMS: 610 | symbol : STRING 611 | filter : STRING 612 | columns : STRING 613 | count : DOUBLE 614 | start : DOUBLE 615 | reverse : BOOLEAN 616 | startTime : DATE-TIME 617 | endTime : DATE-TIME 618 | """ 619 | params={} 620 | params.update(OPargs) 621 | data = self.api_request("GET", "/quote", params) 622 | return(data) 623 | 624 | 625 | def get_bucket_quotes(self, **OPargs): 626 | """ 627 | 628 | PARAMS: 629 | binSize : STRING 630 | partial : BOOLEAN 631 | symbol : STRING 632 | filter : STRING 633 | columns : STRING 634 | count : DOUBLE 635 | start : DOUBLE 636 | reverse : BOOLEAN 637 | startTime : DATE-TIME 638 | endTime : DATE-TIME 639 | """ 640 | params={} 641 | params.update(OPargs) 642 | data = self.api_request("GET", "/quote/bucketed", params) 643 | return(data) 644 | 645 | 646 | 647 | ## Schema. 648 | def get_model_schemata_api(self, **OPargs): 649 | """ 650 | 651 | PARAMS: 652 | model : STRING 653 | """ 654 | params={} 655 | params.update(OPargs) 656 | data = self.api_request("GET", "/schema", params) 657 | return(data) 658 | 659 | 660 | def get_model_schemata_websocket(self): 661 | """ 662 | """ 663 | data = self.api_request("GET", "/schema/websocketHelp", {}) 664 | return(data) 665 | 666 | 667 | 668 | ## Settlement. 669 | def get_settlement(self, **OPargs): 670 | """ 671 | 672 | PARAMS: 673 | symbol : STRING 674 | filter : STRING 675 | columns : STRING 676 | count : DOUBLE 677 | start : DOUBLE 678 | reverse : BOOLEAN 679 | startTime : DATE-TIME 680 | endTime : DATE-TIME 681 | """ 682 | params={} 683 | params.update(OPargs) 684 | data = self.api_request("GET", "/settlement", params) 685 | return(data) 686 | 687 | 688 | 689 | ## Stats. 690 | def get_stats(self): 691 | """ 692 | """ 693 | data = self.api_request("GET", "/stats", {}) 694 | return(data) 695 | 696 | 697 | def get_hist_stats(self): 698 | """ 699 | """ 700 | data = self.api_request("GET", "/stats/history", {}) 701 | return(data) 702 | 703 | 704 | def get_summary_stats(self): 705 | """ 706 | """ 707 | data = self.api_request("GET", "/stats/historyUSD", {}) 708 | return(data) 709 | 710 | 711 | 712 | ## Trade. 713 | def get_trade(self, **OPargs): 714 | """ 715 | 716 | PARAMS: 717 | symbol : STRING 718 | filter : STRING 719 | columns : STRING 720 | count : DOUBLE 721 | start : DOUBLE 722 | reverse : BOOLEAN 723 | startTime : DATE-TIME 724 | endTime : DATE-TIME 725 | """ 726 | params={} 727 | params.update(OPargs) 728 | data = self.api_request("GET", "/trade", params) 729 | return(data) 730 | 731 | 732 | def get_bucket_trades(self, **OPargs): 733 | """ 734 | 735 | PARAMS: 736 | binSize : STRING 737 | partial : BOOLEAN 738 | symbol : STRING 739 | filter : STRING 740 | columns : STRING 741 | count : DOUBLE 742 | start : DOUBLE 743 | reverse : BOOLEAN 744 | startTime : DATE-TIME 745 | endTime : DATE-TIME 746 | """ 747 | params={} 748 | params.update(OPargs) 749 | data = self.api_request("GET", "/trade/bucketed", params) 750 | return(data) 751 | 752 | 753 | 754 | ## User. 755 | def get_user(self): 756 | """ 757 | """ 758 | data = self.api_signed_request("GET", "/user", {}) 759 | return(data) 760 | 761 | 762 | def update_user(self, **OPargs): 763 | """ 764 | 765 | PARAMS: 766 | oldPassword : STRING 767 | newPassword : STRING 768 | newPasswordConfirm : STRING 769 | username : STRING 770 | country : STRING 771 | pgpPubKey : STRING 772 | """ 773 | params={} 774 | params.update(OPargs) 775 | data = self.api_signed_request("POST", "/user", params) 776 | return(data) 777 | 778 | 779 | def get_affiliate_status(self): 780 | """ 781 | """ 782 | data = self.api_signed_request("GET", "/user/affiliateStatus", {}) 783 | return(data) 784 | 785 | 786 | def cancel_withdrawal(self, token): 787 | """ 788 | 789 | PARAMS: 790 | token : STRING 791 | """ 792 | params={"token":token} 793 | data = self.api_request("POST", "/user/cancel/Withdrawal", params) 794 | return(data) 795 | 796 | 797 | def check_referral_code(self, refCode): 798 | """ 799 | 800 | PARAMS: 801 | referralCode : STRING 802 | """ 803 | params={"referralCode":refCode} 804 | data = self.api_request("GET", "/user/checkReferralCode", params) 805 | return(data) 806 | 807 | 808 | def get_commission_stats(self, token=None): 809 | """ 810 | 811 | PARAMS: 812 | token : STRING 813 | """ 814 | 815 | data = self.api_signed_request("GET", "/user/commission", {}) 816 | if token == None: 817 | return(data) 818 | else: 819 | return(data["token"]) 820 | 821 | 822 | def register_communication_token(self, token, platformAgent): 823 | """ 824 | 825 | PARAMS: 826 | token : STRING 827 | platformAgent : STRING 828 | """ 829 | params={"token":token, "platformAgent":platformAgent} 830 | data = self.api_signed_request("GET", "/user/communicationToken", params) 831 | return(data) 832 | 833 | 834 | def confirm_email(self, token, **OPargs): 835 | """ 836 | 837 | PARAMS: 838 | type : STRING 839 | token : STRING 840 | """ 841 | params={"token":token} 842 | params.update(OPargs) 843 | data = self.api_request("POST", "/user/confirmEmail", params) 844 | return(data) 845 | 846 | 847 | def confirm_tfa(self, token, **OPargs): 848 | """ 849 | 850 | PARAMS: 851 | type : STRING 852 | token : STRING 853 | """ 854 | params={"token":token} 855 | params.update(OPargs) 856 | data = self.api_signed_request("POST", "/user/confirmEnableTFA", params) 857 | return(data) 858 | 859 | 860 | def confirm_withdrawal(self, token): 861 | """ 862 | 863 | PARAMS: 864 | token : STRING 865 | """ 866 | params={"token":token} 867 | data = self.api_request("POST", "/user/confirmWithdrawal", params) 868 | return(data) 869 | 870 | 871 | def get_deposit_address(self, **OPargs): 872 | """ 873 | 874 | PARAMS: 875 | currency : STRING 876 | """ 877 | params={} 878 | params.update(OPargs) 879 | data = self.api_signed_request("GET", "/user/depositAddress", params) 880 | return(data) 881 | 882 | 883 | def disable_tfa(self, token, **OPargs): 884 | """ 885 | 886 | PARAMS: 887 | type : STRING 888 | token : STRING 889 | """ 890 | params={"token":token} 891 | params.update(OPargs) 892 | data = self.api_signed_request("POST", "/user/disableTFA", params) 893 | return(data) 894 | 895 | 896 | def get_execution_history(self, symbol, timestamp): 897 | """ 898 | 899 | PARAMS: 900 | symbol : STRING 901 | timestamp : DATE-TIME 902 | """ 903 | params={"symbol":symbol, "timestamp":timestamp} 904 | data = self.api_signed_request("GET", "/user/executionHistory", params) 905 | return(data) 906 | 907 | 908 | def user_logout(self): 909 | """ 910 | """ 911 | data = self.api_request("POST", "/user/logout", {}) 912 | return(data) 913 | 914 | 915 | def all_logout(self): 916 | """ 917 | """ 918 | data = self.api_signed_request("POST", "/user/logoutAll", {}) 919 | return(data) 920 | 921 | 922 | def get_margin_status(self, **OPargs): 923 | """ 924 | 925 | PARAMS: 926 | currency : STRING 927 | """ 928 | params={} 929 | params.update(OPargs) 930 | data = self.api_signed_request("GET", "/user/margin", params) 931 | return(data) 932 | 933 | 934 | def get_withdrawal_fee(self, **OPargs): 935 | """ 936 | 937 | PARAMS: 938 | currency : STRING 939 | """ 940 | params={} 941 | params.update(OPargs) 942 | data = self.api_request("GET", "/user/minWithdrawalFee", params) 943 | return(data) 944 | 945 | 946 | def save_user_preferences(self, prefs, **OPargs): 947 | """ 948 | 949 | PARAMS: 950 | prefs : STRING 951 | overwrite : BOOLEAN 952 | """ 953 | params={"prefs":prefs} 954 | params.update(OPargs) 955 | data = self.api_signed_request("POST", "/user/preferences", params) 956 | return(data) 957 | 958 | 959 | def request_tfa(self, **OPargs): 960 | """ 961 | 962 | PARAMS: 963 | type : STRING 964 | """ 965 | params={} 966 | params.update(OPargs) 967 | data = self.api_signed_request("POST", "/user/requestEnableTFA", params) 968 | return(data) 969 | 970 | 971 | def request_withdrawal(self, currency, amount, address, **OPargs): 972 | """ 973 | 974 | PARAMS: 975 | otpToken : STRING 976 | currency : STRING 977 | amount : DOUBLE 978 | address : STRING 979 | fee : DOUBLE 980 | """ 981 | params={"currency":currency, "amount":amount, "address":address}.update(OPargs) 982 | data = self.api_signed_request("POST", "/user/requestWithdrawal", params) 983 | return(data) 984 | 985 | 986 | def get_wallet(self, **OPargs): 987 | """ 988 | 989 | PARAMS: 990 | currency : STRING 991 | """ 992 | params={} 993 | params.update(OPargs) 994 | data = self.api_signed_request("GET", "/user/wallet", params) 995 | return(data) 996 | 997 | 998 | def get_wallet_hist(self, **OPargs): 999 | """ 1000 | 1001 | PARAMS: 1002 | currency : STRING 1003 | """ 1004 | params={} 1005 | params.update(OPargs) 1006 | data = self.api_signed_request("GET", "/user/walletHistory", params) 1007 | return(data) 1008 | 1009 | 1010 | def get_wallet_sum(self, **OPargs): 1011 | """ 1012 | 1013 | PARAMS: 1014 | currency : STRING 1015 | """ 1016 | params={} 1017 | params.update(OPargs) 1018 | data = self.api_signed_request("GET", "/user/walletSummary", params) 1019 | return(data) 1020 | 1021 | 1022 | 1023 | ## User Event. 1024 | def get_user_events(self, **OPargs): 1025 | """ 1026 | 1027 | PARAMS: 1028 | count : DOUBLE 1029 | start : DOUBLE 1030 | """ 1031 | params={} 1032 | params.update(OPargs) 1033 | data = self.api_signed_request("GET", "/userEvent", params) 1034 | return(data) 1035 | 1036 | 1037 | 1038 | def api_request(self, method, path, params=None): 1039 | """ 1040 | This is used for basic API requests. 1041 | """ 1042 | query = "" 1043 | if params != None and params != {}: 1044 | encodedParams = urlencode(sorted(params.items())) 1045 | query = "?{0}".format(encodedParams) 1046 | 1047 | 1048 | fullURL = "{0}{1}{2}".format(self.BASE_URL, path, query) 1049 | 1050 | apiResponse = requests.request(method, fullURL) 1051 | 1052 | data = apiResponse.json() 1053 | 1054 | return(data) 1055 | 1056 | 1057 | def api_signed_request(self, method, path, params=None): 1058 | """ 1059 | This is used to get signed API requests 1060 | """ 1061 | query = "" 1062 | if self.api_key == '' or self.api_secret == '': 1063 | raise ValueError("Make sure you entered your API key/secret") 1064 | 1065 | if params != None and params != {}: 1066 | encodedParams = urlencode(sorted(params.items())) 1067 | query = "?{0}".format(encodedParams) 1068 | query = query.replace("%27", "%22") 1069 | 1070 | nonce = int(round(time.time()) + 5) 1071 | fullURL = bytes("{0}{1}{2}".format(self.BASE_URL, path, query), 'utf-8') 1072 | signURL = bytes('{0}/api/v1{1}{2}{3}'.format(method, path, query, nonce), 'utf-8') 1073 | 1074 | signature = hmac.new(bytes(self.api_secret, 'utf-8'), signURL, digestmod=hashlib.sha256).hexdigest() 1075 | 1076 | headers = { 1077 | "api-nonce":str(nonce), 1078 | "api-key":self.api_key, 1079 | "api-signature":signature 1080 | } 1081 | 1082 | apiResponse = requests.request(method, fullURL, headers=headers) 1083 | data = apiResponse.json() 1084 | 1085 | return(data) 1086 | 1087 | 1088 | --------------------------------------------------------------------------------