├── 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 |
--------------------------------------------------------------------------------