├── CryptoWatchClasses.cs ├── CryptowatchAPI.cs ├── LICENSE └── README.md /CryptoWatchClasses.cs: -------------------------------------------------------------------------------- 1 | // Copyright(c) 2017 Stock84-dev 2 | // https://github.com/Stock84-dev/Cryptowatch-API 3 | 4 | using System.Collections.Generic; 5 | using Newtonsoft.Json; 6 | 7 | namespace Cryptowatch 8 | { 9 | public class SiteInformation 10 | { 11 | public string revision { get; set; } 12 | public string uptime { get; set; } 13 | public string documentation { get; set; } 14 | public string[] indexes { get; set; } 15 | } 16 | 17 | /// 18 | /// An asset can be a crypto or fiat currency. 19 | /// 20 | public class Assets 21 | { 22 | public int id { get; set; } 23 | public string symbol { get; set; } 24 | public string name { get; set; } 25 | public bool fiat { get; set; } 26 | public string route { get; set; } 27 | } 28 | 29 | /// 30 | /// An asset can be a crypto or fiat currency. 31 | /// 32 | public class Asset 33 | { 34 | public int id { get; set; } 35 | public string symbol { get; set; } 36 | public string name { get; set; } 37 | public bool fiat { get; set; } 38 | public Markets1 markets { get; set; } 39 | } 40 | 41 | /// 42 | /// A pair of assets. Each pair has a base and a quote. For example, btceur has base btc and quote eur. 43 | /// 44 | public class Pairs 45 | { 46 | public string symbol { get; set; } 47 | public int id { get; set; } 48 | [JsonProperty("base")] 49 | public Base basePair { get; set; } 50 | [JsonProperty("quote")] 51 | public Quote quotePair { get; set; } 52 | public string route { get; set; } 53 | /// 54 | /// Not always set. 55 | /// 56 | public string futuresContractPeriod { get; set; } 57 | } 58 | 59 | public class Pair 60 | { 61 | public string symbol { get; set; } 62 | public int id { get; set; } 63 | [JsonProperty("base")] 64 | public Base basePair { get; set; } 65 | [JsonProperty("quote")] 66 | public Quote quotePair { get; set; } 67 | public string route { get; set; } 68 | public Markets[] markets { get; set; } 69 | } 70 | 71 | /// 72 | /// Exchanges are where all the action happens! 73 | /// 74 | public class Exchanges 75 | { 76 | public string symbol { get; set; } 77 | public string name { get; set; } 78 | public string route { get; set; } 79 | public bool active { get; set; } 80 | } 81 | 82 | /// 83 | /// Exchanges are where all the action happens! 84 | /// 85 | public class Exchange 86 | { 87 | public string symbol { get; set; } 88 | public string name { get; set; } 89 | public bool active { get; set; } 90 | public Route routes { get; set; } 91 | } 92 | 93 | /// 94 | /// A market is a pair listed on an exchange. For example, pair btceur on exchange kraken is a market. 95 | /// 96 | public class Markets 97 | { 98 | public int id { get; set; } 99 | public string exchange { get; set; } 100 | public string pair { get; set; } 101 | public bool active { get; set; } 102 | public string route { get; set; } 103 | } 104 | 105 | /// 106 | /// A market is a pair listed on an exchange. For example, pair btceur on exchange kraken is a market. 107 | /// 108 | public class Market 109 | { 110 | public string exchange { get; set; } 111 | public string pair { get; set; } 112 | public bool active { get; set; } 113 | public Routes routes { get; set; } 114 | } 115 | 116 | public class Markets1 117 | { 118 | [JsonProperty("base")] 119 | public Bases[] baseMarket { get; set; } 120 | [JsonProperty("quote")] 121 | public Quotes[] quoteMarket { get; set; } 122 | } 123 | 124 | public class Bases 125 | { 126 | public int id { get; set; } 127 | public string exchange { get; set; } 128 | public string pair { get; set; } 129 | public bool active { get; set; } 130 | public string route { get; set; } 131 | } 132 | 133 | public class Base 134 | { 135 | public int id { get; set; } 136 | public string route { get; set; } 137 | public string symbol { get; set; } 138 | public string name { get; set; } 139 | public bool fiat { get; set; } 140 | } 141 | 142 | public class Quotes 143 | { 144 | public int id { get; set; } 145 | public string exchange { get; set; } 146 | public string pair { get; set; } 147 | public bool active { get; set; } 148 | public string route { get; set; } 149 | } 150 | 151 | public class Quote 152 | { 153 | public int id { get; set; } 154 | public string route { get; set; } 155 | public string symbol { get; set; } 156 | public string name { get; set; } 157 | public bool fiat { get; set; } 158 | } 159 | 160 | public class Routes 161 | { 162 | public string price { get; set; } 163 | public string summary { get; set; } 164 | public string orderbook { get; set; } 165 | public string trades { get; set; } 166 | public string ohlc { get; set; } 167 | } 168 | 169 | public class Route 170 | { 171 | public string markets { get; set; } 172 | } 173 | 174 | public class Summary 175 | { 176 | public Price price { get; set; } 177 | public double volume { get; set; } 178 | } 179 | 180 | public class Price 181 | { 182 | public double last { get; set; } 183 | public double high { get; set; } 184 | public double low { get; set; } 185 | public Change change { get; set; } 186 | } 187 | 188 | public class Change 189 | { 190 | public double percentage { get; set; } 191 | public double absolute { get; set; } 192 | } 193 | 194 | public class Trade 195 | { 196 | public int id { get; set; } 197 | public long timestamp { get; set; } 198 | public double price { get; set; } 199 | public double amount { get; set; } 200 | 201 | public Trade(int id, long timestamp, double price, double amount) 202 | { 203 | this.id = id; 204 | this.timestamp = timestamp; 205 | this.price = price; 206 | this.amount = amount; 207 | } 208 | } 209 | 210 | public class OrderBook 211 | { 212 | public List bids { get; set; } 213 | public List asks { get; set; } 214 | 215 | public OrderBook() 216 | { 217 | bids = new List(); 218 | asks = new List(); 219 | } 220 | } 221 | 222 | public class Order 223 | { 224 | public double price; 225 | public double amount; 226 | 227 | public Order(double price, double amount) 228 | { 229 | this.price = price; 230 | this.amount = amount; 231 | } 232 | } 233 | 234 | public enum TimeFrame { min1 = 60, min3 = 180, min5 = 300, min15 = 900, min30 = 1800, h1 = 3600, h2 = 7200, h4 = 14400, h6 = 21600, h12 = 43200, d1 = 86400, d3 = 259200, w1 = 604800 } 235 | 236 | public class Candlestick 237 | { 238 | public long closeTime; 239 | public double openPrice; 240 | public double highPrice; 241 | public double lowPrice; 242 | public double closePrice; 243 | public double volume; 244 | 245 | public Candlestick(long closeTime, double openPrice, double highPrice, double lowPrice, double closePrice, double volume) 246 | { 247 | this.closeTime = closeTime; 248 | this.openPrice = openPrice; 249 | this.highPrice = highPrice; 250 | this.lowPrice = lowPrice; 251 | this.closePrice = closePrice; 252 | this.volume = volume; 253 | } 254 | } 255 | 256 | public class Allowance 257 | { 258 | public long cost { get; set; } 259 | public long remaining { get; set; } 260 | } 261 | } 262 | -------------------------------------------------------------------------------- /CryptowatchAPI.cs: -------------------------------------------------------------------------------- 1 | // Copyright(c) 2017 Stock84-dev 2 | // https://github.com/Stock84-dev/Cryptowatch-API 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Net; 8 | using System.IO; 9 | using Newtonsoft.Json; // install Newtonsoft.Json nuGet package 10 | using Newtonsoft.Json.Linq; 11 | 12 | namespace Cryptowatch 13 | { 14 | /// 15 | /// Documentation can be found here https://cryptowat.ch/docs/api 16 | /// 17 | public class CryptowatchAPI 18 | { 19 | /// 20 | /// Allowance is updated with every call. 21 | /// 22 | public static Allowance allowance = null; 23 | 24 | /// 25 | ///You can always request this to query your allowance without any extra result - this request costs very little. 26 | /// 27 | 28 | /// 29 | /// 30 | /// 31 | /// 32 | /// 33 | /// 34 | /// 35 | /// 36 | /// 37 | /// 38 | /// 39 | /// 40 | public static SiteInformation GetSiteInformation() 41 | { 42 | try 43 | { 44 | return Deserialize(GetJObject("https://api.cryptowat.ch")); 45 | } 46 | catch 47 | { 48 | throw; 49 | } 50 | } 51 | /// 52 | ///Returns all assets(in no particular order) 53 | /// 54 | /// 55 | /// 56 | /// 57 | /// 58 | /// 59 | /// 60 | /// 61 | /// 62 | /// 63 | /// 64 | /// 65 | /// 66 | public static List GetAssets() 67 | { 68 | try 69 | { 70 | return DeserializeToList(GetJObject("https://api.cryptowat.ch/assets")); 71 | } 72 | catch 73 | { 74 | throw; 75 | } 76 | 77 | } 78 | 79 | /// 80 | ///Returns a single asset. Lists all markets which have this asset as a base or quote. 81 | /// 82 | /// Asset specific url, e.g. https://api.cryptowat.ch/assets/btc 83 | /// 84 | /// 85 | /// 86 | /// 87 | /// 88 | /// 89 | /// 90 | /// 91 | /// 92 | /// 93 | /// 94 | /// 95 | public static Asset GetAsset(string route) 96 | { 97 | try 98 | { 99 | return Deserialize(GetJObject(route)); 100 | } 101 | catch 102 | { 103 | throw; 104 | } 105 | } 106 | 107 | /// 108 | /// Returns all pairs (in no particular order). 109 | /// 110 | /// 111 | /// 112 | /// 113 | /// 114 | /// 115 | /// 116 | /// 117 | /// 118 | /// 119 | /// 120 | /// 121 | /// 122 | public static List GetPairs() 123 | { 124 | try 125 | { 126 | return DeserializeToList(GetJObject("https://api.cryptowat.ch/pairs")); 127 | } 128 | catch 129 | { 130 | throw; 131 | } 132 | } 133 | 134 | /// 135 | /// Returns a single pair. Lists all markets for this pair. 136 | /// 137 | /// Pair specific url, e.g. https://api.cryptowat.ch/pairs/ethbtc 138 | /// 139 | /// 140 | /// 141 | /// 142 | /// 143 | /// 144 | /// 145 | /// 146 | /// 147 | /// 148 | /// 149 | /// 150 | public static Pair GetPair(string route) 151 | { 152 | try 153 | { 154 | return Deserialize(GetJObject(route)); 155 | } 156 | catch 157 | { 158 | throw; 159 | } 160 | } 161 | 162 | /// 163 | /// Returns a list of all supported exchanges. 164 | /// 165 | /// 166 | /// 167 | /// 168 | /// 169 | /// 170 | /// 171 | /// 172 | /// 173 | /// 174 | /// 175 | /// 176 | /// 177 | public static List GetExchanges() 178 | { 179 | try 180 | { 181 | return DeserializeToList(GetJObject("https://api.cryptowat.ch/exchanges")); 182 | } 183 | catch 184 | { 185 | throw; 186 | } 187 | } 188 | 189 | /// 190 | /// Returns a single exchange, with associated routes. 191 | /// 192 | /// Exchange specific url, e.g. https://api.cryptowat.ch/exchanges/kraken 193 | /// 194 | /// 195 | /// 196 | /// 197 | /// 198 | /// 199 | /// 200 | /// 201 | /// 202 | /// 203 | /// 204 | /// 205 | public static Exchange GetExchange(string route) 206 | { 207 | try 208 | { 209 | return Deserialize(GetJObject(route)); 210 | } 211 | catch 212 | { 213 | throw; 214 | } 215 | } 216 | 217 | /// 218 | /// Returns a list of all supported markets. 219 | /// 220 | /// You can also get the supported markets for only a specific exchange. e.g. https://api.cryptowat.ch/markets/kraken 221 | /// 222 | /// 223 | /// 224 | /// 225 | /// 226 | /// 227 | /// 228 | /// 229 | /// 230 | /// 231 | /// 232 | /// 233 | public static List GetMarkets(string route = "https://api.cryptowat.ch/markets") 234 | { 235 | try 236 | { 237 | return DeserializeToList(GetJObject(route)); 238 | } 239 | catch 240 | { 241 | throw; 242 | } 243 | } 244 | 245 | /// 246 | /// Returns a single market, with associated routes. 247 | /// 248 | /// Market specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd 249 | /// 250 | /// 251 | /// 252 | /// 253 | /// 254 | /// 255 | /// 256 | /// 257 | /// 258 | /// 259 | /// 260 | /// 261 | public static Market GetMarket(string route) 262 | { 263 | try 264 | { 265 | return Deserialize(GetJObject(route)); 266 | } 267 | catch 268 | { 269 | throw; 270 | } 271 | } 272 | 273 | /// 274 | /// Returns the current price for all supported markets. Some values may be out of date by a few seconds. 275 | /// 276 | /// key = exchangeName:pairName 277 | /// 278 | /// 279 | /// dictionsry 280 | /// 281 | /// 282 | /// 283 | /// 284 | /// 285 | /// 286 | /// 287 | /// 288 | /// 289 | /// 290 | /// 291 | /// 292 | public static Dictionary GetPrices() 293 | { 294 | try 295 | { 296 | return Deserialize>(GetJObject("https://api.cryptowat.ch/markets/prices")); 297 | } 298 | catch 299 | { 300 | throw; 301 | } 302 | } 303 | 304 | /// 305 | /// Returns a market’s last price. 306 | /// 307 | /// Price specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd/price 308 | /// 309 | /// 310 | /// 311 | /// 312 | /// 313 | /// 314 | /// 315 | /// 316 | /// 317 | /// 318 | /// 319 | /// 320 | public static double GetPrice(string route) 321 | { 322 | try 323 | { 324 | return Deserialize(GetJObject(route)).price; 325 | } 326 | catch 327 | { 328 | throw; 329 | } 330 | } 331 | 332 | /// 333 | /// Returns the market summary for all supported markets. Some values may be out of date by a few seconds. 334 | /// 335 | /// key = exchangeName:pairName 336 | /// 337 | /// 338 | /// dictionsry 339 | /// 340 | /// 341 | /// 342 | /// 343 | /// 344 | /// 345 | /// 346 | /// 347 | /// 348 | /// 349 | /// 350 | /// 351 | public static Dictionary GetSummaries() 352 | { 353 | try 354 | { 355 | return Deserialize>(GetJObject("https://api.cryptowat.ch/markets/summaries")); 356 | } 357 | catch 358 | { 359 | throw; 360 | } 361 | } 362 | 363 | /// 364 | /// Returns a market’s last price as well as other stats based on a 24-hour sliding window: High price, Low price, % change, Absolute change, Volume 365 | /// 366 | /// Summary specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd/summary 367 | /// 368 | /// 369 | /// 370 | /// 371 | /// 372 | /// 373 | /// 374 | /// 375 | /// 376 | /// 377 | /// 378 | /// 379 | public static Summary GetSummary(string route) 380 | { 381 | try 382 | { 383 | return Deserialize(GetJObject(route)); 384 | } 385 | catch 386 | { 387 | throw; 388 | } 389 | } 390 | 391 | /// 392 | /// Returns a market’s most recent trades, incrementing chronologically. Note some exchanges don’t provide IDs for public trades. 393 | /// 394 | /// Trade specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd/trades 395 | /// Limit amount of trades returned. If 0 returns all. 396 | /// Only return trades at or after this time. 397 | /// 398 | /// 399 | /// 400 | /// 401 | /// 402 | /// 403 | /// 404 | /// 405 | /// 406 | /// 407 | /// 408 | /// 409 | public static List GetTrades(string route, int limit = 50, long since = -1) 410 | { 411 | if (limit != 50 && since != -1) 412 | { 413 | route += "?limit=" + limit.ToString() + "&since=" + since.ToString(); 414 | } 415 | else if(since != -1) 416 | { 417 | route += "?since=" + since.ToString(); 418 | } 419 | else if(limit != 50) 420 | { 421 | route += "?limit=" + limit.ToString(); 422 | } 423 | try 424 | { 425 | List tradeList = DeserializeToList(GetJObject(route)); 426 | List trades = new List(); 427 | foreach (var t in tradeList) 428 | { 429 | trades.Add(new Trade((int)t[0], (long)t[1], t[2], t[3])); 430 | } 431 | return trades; 432 | } 433 | catch 434 | { 435 | throw; 436 | } 437 | } 438 | 439 | /// 440 | /// Returns a market’s order book. 441 | /// 442 | /// OrderNook specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd/orderbook 443 | /// 444 | /// 445 | /// 446 | /// 447 | /// 448 | /// 449 | /// 450 | /// 451 | /// 452 | /// 453 | /// 454 | /// 455 | public static OrderBook GetOrderBook(string route) 456 | { 457 | try 458 | { 459 | _OrderBook _orderBook = Deserialize<_OrderBook>(GetJObject(route)); 460 | OrderBook orderBook = new OrderBook(); 461 | foreach (var bid in _orderBook.bids) 462 | { 463 | orderBook.bids.Add(new Order(bid[0], bid[1])); 464 | } 465 | foreach (var ask in _orderBook.asks) 466 | { 467 | orderBook.asks.Add(new Order(ask[0], ask[1])); 468 | } 469 | return orderBook; 470 | } 471 | catch 472 | { 473 | throw; 474 | } 475 | } 476 | 477 | /// 478 | /// Returns a market’s OHLC candlestick data. 479 | /// 480 | /// Candlestick specific url, e.g. https://api.cryptowat.ch/markets/gdax/btcusd/ohlc 481 | /// Candlestick timeframe. 482 | /// Only return candles opening after this time. If set to -1 max limit is 6000, otherwise it's 500. 483 | /// Only return candles opening before this time. 484 | /// 485 | /// 486 | /// 487 | /// 488 | /// 489 | /// 490 | /// 491 | /// 492 | /// 493 | /// 494 | /// 495 | /// 496 | public static List GetCandlesticks(string route, TimeFrame timeFrame, long after = -2, long before = 0) 497 | { 498 | route += "?periods=" + ((int)timeFrame).ToString(); 499 | if (after != -2) 500 | { 501 | route += "&after=" + after.ToString(); 502 | } 503 | if (before != 0) 504 | { 505 | route += "&before=" + before.ToString(); 506 | } 507 | try 508 | { 509 | _Candlestick _candlestick = Deserialize<_Candlestick>(GetJObject(route)); 510 | List candles = new List(); 511 | foreach (var c in _candlestick.allCandlesticks) 512 | { 513 | candles.Add(new Candlestick((long)c[0], c[1], c[2], c[3], c[4], c[5])); 514 | } 515 | return candles; 516 | } 517 | catch 518 | { 519 | throw; 520 | } 521 | } 522 | 523 | /// 524 | /// 525 | /// 526 | /// 527 | /// 528 | /// 529 | /// 530 | /// 531 | /// 532 | private static Stream GetResponseStream(string url) 533 | { 534 | try 535 | { 536 | var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 537 | httpWebRequest.ContentType = "application/json"; 538 | httpWebRequest.Accept = "*/*"; 539 | httpWebRequest.Method = "GET"; 540 | //httpWebRequest.Headers.Add("Authorization", "Basic reallylongstring"); 541 | var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 542 | return httpResponse.GetResponseStream(); 543 | } 544 | catch 545 | { 546 | throw; 547 | } 548 | 549 | } 550 | 551 | 552 | /// 553 | /// 554 | /// 555 | /// 556 | /// 557 | /// 558 | /// 559 | /// 560 | /// 561 | /// 562 | /// 563 | /// 564 | private static JObject GetJObject(string url) 565 | { 566 | try 567 | { 568 | StreamReader sr = new StreamReader(GetResponseStream(url)); 569 | string response = sr.ReadToEnd(); 570 | JObject jObject = JObject.Parse(response); 571 | sr.Close(); 572 | return jObject; 573 | } 574 | catch 575 | { 576 | throw; 577 | } 578 | } 579 | 580 | 581 | /// 582 | /// 583 | /// 584 | /// 585 | /// 586 | /// 587 | /// 588 | /// 589 | /// 590 | /// 591 | /// 592 | /// 593 | /// 594 | private static List DeserializeToList(JObject jObject) 595 | { 596 | try 597 | { 598 | // if we get any other error from cryptowatch 599 | foreach (var responseType in jObject) 600 | { 601 | if (responseType.Key == "error") 602 | throw new Exception("Cryptowatch error: " + responseType.Value.ToObject()); 603 | } 604 | // get JSON result objects into a list 605 | List jTokens = jObject["result"].Children().ToList(); 606 | allowance = jObject["allowance"].ToObject(); 607 | 608 | // serialize JSON results into .NET objects 609 | List objects = new List(); 610 | foreach (JToken jToken in jTokens) 611 | { 612 | // JToken.ToObject is a helper method that uses JsonSerializer internally 613 | objects.Add(jToken.ToObject()); 614 | } 615 | return objects; 616 | } 617 | catch 618 | { 619 | throw; 620 | } 621 | 622 | } 623 | 624 | 625 | /// 626 | /// 627 | /// 628 | /// 629 | /// 630 | /// 631 | /// 632 | /// 633 | /// 634 | /// 635 | /// 636 | /// 637 | private static T Deserialize(JObject jObject) 638 | { 639 | try 640 | { 641 | // if we get any other error from cryptowatch 642 | foreach (var responseType in jObject) 643 | { 644 | if (responseType.Key == "error") 645 | throw new Exception("Cryptowatch error: " + responseType.Value.ToObject()); 646 | } 647 | allowance = jObject["allowance"].ToObject(); 648 | return jObject["result"].ToObject(); 649 | } 650 | catch 651 | { 652 | throw; 653 | } 654 | } 655 | 656 | private class _OrderBook 657 | { 658 | public double[][] asks { get; set; } 659 | public double[][] bids { get; set; } 660 | } 661 | 662 | private class _Candlestick 663 | { 664 | public double[][] allCandlesticks { get; set; } 665 | [JsonProperty("60")] 666 | private double[][] min { set { allCandlesticks = value; } } 667 | [JsonProperty("180")] 668 | private double[][] _180 { set { allCandlesticks = value; } } 669 | [JsonProperty("300")] 670 | private double[][] _300 { set { allCandlesticks = value; } } 671 | [JsonProperty("900")] 672 | private double[][] _900 { set { allCandlesticks = value; } } 673 | [JsonProperty("1800")] 674 | private double[][] _1800 { set { allCandlesticks = value; } } 675 | [JsonProperty("3600")] 676 | private double[][] _3600 { set { allCandlesticks = value; } } 677 | [JsonProperty("7200")] 678 | private double[][] _7200 { set { allCandlesticks = value; } } 679 | [JsonProperty("14400")] 680 | private double[][] _14400 { set { allCandlesticks = value; } } 681 | [JsonProperty("21600")] 682 | private double[][] _21600 { set { allCandlesticks = value; } } 683 | [JsonProperty("43200")] 684 | private double[][] _43200 { set { allCandlesticks = value; } } 685 | [JsonProperty("86400")] 686 | private double[][] _86400 { set { allCandlesticks = value; } } 687 | [JsonProperty("259200")] 688 | private double[][] _259200 { set { allCandlesticks = value; } } 689 | [JsonProperty("604800")] 690 | private double[][] _604800 { set { allCandlesticks = value; } } 691 | } 692 | 693 | private class Price 694 | { 695 | public double price { get; set; } 696 | } 697 | 698 | } 699 | } 700 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Stock84 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cryptowatch-API 2 | [Cryptowatch](https://cryptowat.ch/) is a cryptocurrency charting and trading platform owned by Kraken. 3 | Cryptowatch site API documentation can be found here: https://cryptowat.ch/docs/api 4 | 5 | Automatically deserializes json response to objects. 6 | Include those 2 files in your project and use namespace Cryptowatch. 7 | --------------------------------------------------------------------------------