Crypto Statto is an awesome platform that collects data from different cryptocurrency sources on a regular basis. Rather than focusing on point to point time series data (i.e. every single price), we pull regular snapshots of information. Our focus is more on taking information aggregating and summarising it to produce metrics to give a better picture on the crypto currency market.
This means you may need to check the accuracy and frequency of information being consumed but is infinitely better than going chart by chart, or currency by currency to get a feel for the market.
Behind Crypto Statto are a powerful set of services and technologies replicated for different data sources and report types. Our data engines run on a periodic basis calling data from external data sources such as APIs, pushing them to data reporting low before pulling it back to local data repository and finally pushing it to the web data platform whereby these new data items are detected and pulled into the website reporting architecture. We do this as agnostically as possible to focus more on the datasets and interpreting them for data visualisation.
We don't continually query databases but instead do regular pulls and pushes of information based upon events. The result is that we minimise database load which should main data processing is impacted less than conventional website reporting platforms. This is designed for scalability.
We have designed this architecture to run on very low cost hardware but to also allow for upscaling as the platform becomes more popular. The goal is to keep our fees low and focus more on managing requests.
Our expertise is in enriching data, adding metrics and presenting it at the right granularity for happy users.
We have only multiple data feeds at the moment on very low cost hardware and testing production of information. For this reason you may find that reports will be incomplete and developers should be mindful of this also.
Dashboard or Data Visualisation commonly falls under the umbrella of Business Intelligence. The basic principle of Business Intelligence (BI) is that data is modelled into reportable datasets and presented to BI software for presenting to end users. In our opinion, the mistake most BI software makes is to focus on building user tailored specific dashboards. Instead, we think that in many situations, having access to multiple datasets matching the same data content in a summarised form is quicker to develop and gives users more than enough information to draw insights from.
For this reason, we build many of our datasets to have the same field/column structure, add a few metadata columns where displays interpret the data and output this information more generically.
We don't imagine thousands of developers writing code for algorithmic trading against our platform. We do expect traders to use our platform for signal and trend based information not available on existing trading platforms in future.
We can optionally lock down our endpoints. Indeed - many of them are. We also tie charging to this, and monetisation. You can read more about making secure requests in this helpful short guide - Using our Secure API Key Endpoints for Billable Content
Here is a brief overview on how we have ended up using it to create example reports.
The reports produced from our reporting layer are matched to a report type if the fields match. We recognise that many data sets have common fields, we prefer to focus on metadata to help bring visualisations alive. We create more generic datasets with metadata within them to help give the user information about what that data is. This has allowed us to build rich interactive screens whereby users can choose from a type of report and see lots of information on page.
Some of these client report types may change but are likely to be minor, we will add more. Please do contact us if you are concerned that we may remove report types. A clue, we are unlikely to remove client report types when we have already built reports on them.
Alternatively you may wish to build on interactive dashboard purely on one report type or multiple report types.
You will notice that we produce what is known as a report VM. Not only does a Report VM contain metadata but also the unique values per column within the data set. These can be used to pass back to the application to filter data. Despite us providing this information and the mechanism to undertake filtering, we don't recommend this approach and indeed think it could be overused. Instead we suggest pulling down the data and providing filtering within the client. We keep these datasets low in size and already know that users prefer to interact with the data in an immersive experience as opposed to continually querying and filtering.
These are the main endpoints whereby you can discover the types of reports and the data returned. Start with the end point, use the results, and pass those back to the end point with some possible restructuring the json data. This makes our endpoints restful, and useful.
Note how we return a Display version and a named version. You may wish to tidy up your front-end code/calls
Get entities and their display names. To be used in subsequent calls.
https://www.cryptostatto.com/api/EntityReport
[{"entityDisplayName":"Assets","entityName":"Assets"},{"entityDisplayName":"Coin Category","entityName":"Coin-Category"},{"entityDisplayName":"CoinCategoryMovementMetrics","entityName":"Coin-Category-Movement-Metrics"},{"entityDisplayName":"CryptoCurrencyMovementsMonthly","entityName":"Crypto-Currency-Movements-Monthly"},{"entityDisplayName":"DataTimelinessData","entityName":"Data-Timeliness-Data"},{"entityDisplayName":"ExchangeRateMoves","entityName":"Exchange-Rate-Moves"},{"entityDisplayName":"FXExample","entityName":"F-X-Example"}]
Entity and its report View Models (ReportVMs).
We pass the correct Entity Name (not display name to the same end point as follows). We get back metadata about that report with a unique list of values per field.
https://www.cryptostatto.com/api/EntityReport/Assets
{"entityName":"Assets","reportVMs":[{"entityReportKey":"02781c93-347d-4a99-a56f-d90c4ee844f6","reportName":"Asset MetricsAsset Metrics MarketCapUsd","reportType":4,"reportOptions":[{"isDefault":false,"option":{"fieldName":"ReportingType","values":["MarketCapUsd"]}},{"isDefault":false,"option":{"fieldName":"YAxisCategory","values":["Asset"]}},{"isDefault":false,"option":{"fieldName":"YAxisKey","values":["1INCH","AAVE","ADA","AGIX","ALGO","ATOM","AVAX","AXS","BAL","BAT","BCH","BNB","BSV","BTC","BTCB","BUSD","CAKE","CFX","CHZ","COMP","CRO","CRV","CSPR","CVX","DAI","DASH","DOGE","DOT","DYDX","EGLD","ENJ","EOS","ETC","ETH","FEI","FIL","FLOW","FTM","FTT","FXS","GRT","GT","HBAR","HOT","HT","ICP","INJ","KAVA","KCS","KLAY","LDO","LEO","LINK","LRC","LTC","LUSD","MANA","MASK","MATIC","MINA","MIOTA","MKR","NEAR","NEO","NEXO","QNT","QTUM","RNDR","ROSE","RPL","RUNE","RVN","SAND","SHIB","SNX","SOL","STX","TFUEL","THETA","TRX","TUSD","TWT","UNI","USDC","USDP","USDT","VET","WBTC","WOO","XDC","XEC","XEM","XLM","XMR","XRP","XTZ","ZEC","ZIL"]}},{"isDefault":false,"option":{"fieldName":"YAxisName","values":["1inch Network","Aave","Cardano","SingularityNET","Algorand","Cosmos","Avalanche","Axie Infinity","Balancer","Basic Attention Token","Bitcoin Cash","BNB","Bitcoin SV","Bitcoin","Bitcoin BEP2","Binance USD","PancakeSwap","Conflux","Chiliz","Compound","Crypto.com Coin","Curve DAO Token","Casper","Convex Finance","Multi Collateral DAI","Dash","Dogecoin","Polkadot","dYdX","MultiversX","Enjin Coin","EOS","Ethereum Classic","Ethereum","Fei Protocol","Filecoin","Flow","Fantom","FTX Token","Frax Share","The Graph","GateToken","Hedera Hashgraph","Holo","Huobi Token","Internet Computer","Injective","Kava","KuCoin Token","Klaytn","Lido DAO","UNUS SED LEO","Chainlink","Loopring","Litecoin","Liquity USD","Decentraland","Mask Network","Polygon","Mina","IOTA","Maker","NEAR Protocol","Neo","Nexo","Quant","Qtum","Render Token","Oasis Network","Rocket Pool","THORChain","Ravencoin","The Sandbox","Shiba Inu","Synthetix","Solana","Stacks","Theta Fuel","THETA","TRON","TrueUSD","Trust Wallet Token","Uniswap","USD Coin","Pax Dollar","Tether","VeChain","Wrapped Bitcoin","WOO Network","XinFin Network","eCash","Stellar","Monero","XRP","Tezos","Zcash","Zilliqa"]}}]}]}
Construct a request for running a report and retrieving data.
https://www.cryptostatto.com/api/EntityReport
Note, the ReportRequestOptions can be null or match the expected type.
The result returned is the json report result. Note - the result is dynamic in that a json data object is returned.
{
"ReportKey": "10c5c140-0a1a-49e1-86ef-a662f6cb3f38"
,
"ReportRequestOptions" : null
, "EntityName" : "Assets"
}
With report request options
{
"ReportKey": "10c5c140-0a1a-49e1-86ef-a662f6cb3f38"
,
"ReportRequestOptions" : [{"parameterName" : "someFieldName", "selectedValues" : [{"key" : "someKey", "description" : "someDescription"},{"key" : "someOtherKey", "description" : "someOtherDescription"}]}]
, "EntityName" : "Assets"
}
Can be anything. This is why we have client report types.
[{"StartTimeSliceKey":1,"TimeSliceKey":600,"Hour":0,"Minute":10,"Second":0},{"StartTimeSliceKey":601,"TimeSliceKey":1200,"Hour":0,"Minute":20,"Second":0},{"StartTimeSliceKey":1201,"TimeSliceKey":1800,"Hour":0,"Minute":30,"Second":0},{"StartTimeSliceKey":1801,"TimeSliceKey":2400,"Hour":0,"Minute":40,"Second":0},{"StartTimeSliceKey":2401,"TimeSliceKey":3000,"Hour":0,"Minute":50,"Second":0},{"StartTimeSliceKey":3001,"TimeSliceKey":3600,"Hour":1,"Minute":0,"Second":0},{"StartTimeSliceKey":3601,"TimeSliceKey":4200,"Hour":1,"Minute":10,"Second":0},{"StartTimeSliceKey":4201,"TimeSliceKey":4800,"Hour":1,"Minute":20,"Second":0},{"StartTimeSliceKey":4801,"TimeSliceKey":5400,"Hour":1,"Minute":30,"Second":0},{"StartTimeSliceKey":5401,"TimeSliceKey":6000,"Hour":1,"Minute":40,"Second":0},{"StartTimeSliceKey":6001,"TimeSliceKey":6600,"Hour":1,"Minute":50,"Second":0},{"StartTimeSliceKey":6601,"TimeSliceKey":7200,"Hour":2,"Minute":0,"Second":0},{"StartTimeSliceKey":7201,"TimeSliceKey":7800,"Hour":2,"Minute":10,"Second":0},{"StartTimeSliceKey":7801,"TimeSliceKey":8400,"Hour":2,"Minute":20,"Second":0},{"StartTimeSliceKey":8401,"TimeSliceKey":9000,"Hour":2,"Minute":30,"Second":0},{"StartTimeSliceKey":9001,"TimeSliceKey":9600,"Hour":2,"Minute":40,"Second":0},{"StartTimeSliceKey":9601,"TimeSliceKey":10200,"Hour":2,"Minute":50,"Second":0},{"StartTimeSliceKey":10201,"TimeSliceKey":10800,"Hour":3,"Minute":0,"Second":0},{"StartTimeSliceKey":10801,"TimeSliceKey":11400,"Hour":3,"Minute":10,"Second":0},{"StartTimeSliceKey":11401,"TimeSliceKey":12000,"Hour":3,"Minute":20,"Second":0},{"StartTimeSliceKey":12001,"TimeSliceKey":12600,"Hour":3,"Minute":30,"Second":0},{"StartTimeSliceKey":12601,"TimeSliceKey":13200,"Hour":3,"Minute":40,"Second":0},{"StartTimeSliceKey":13201,"TimeSliceKey":13800,"Hour":3,"Minute":50,"Second":0},{"StartTimeSliceKey":13801,"TimeSliceKey":14400,"Hour":4,"Minute":0,"Second":0},{"StartTimeSliceKey":14401,"TimeSliceKey":15000,"Hour":4,"Minute":10,"Second":0},{"StartTimeSliceKey":15001,"TimeSliceKey":15600,"Hour":4,"Minute":20,"Second":0},{"StartTimeSliceKey":15601,"TimeSliceKey":16200,"Hour":4,"Minute":30,"Second":0},{"StartTimeSliceKey":16201,"TimeSliceKey":16800,"Hour":4,"Minute":40,"Second":0},{"StartTimeSliceKey":16801,"TimeSliceKey":17400,"Hour":4,"Minute":50,"Second":0}]
To avoid having to loop through each entity, retrieve their view models and filter by type - we added a method to pass in the client report type. This call will be less expensive than the iterative approach.
https://www.cryptostatto.com/api/EntityReport/AllEntities/someClientReportType
No parameters, how we tend to call this most of the time
https://www.cryptostatto.com/api/EntityClientReportType
Returns a list of currently configured Client Report Types. It does not mean there are current live reports matching this and you should handle the absence of data in your application. If we have created an entity client report type it is probable this won't alter much. However, please contact us if you have any questions about this.
[
{
"expectedFields": [
"Component",
"DateValue",
"WeekdayName",
"Down",
"Same",
"Up",
"LowRanking",
"MidRanking",
"HighRanking",
"NetPercentage",
"Points",
"Ranking",
"HexColorCode",
"Start",
"End"
],
"completeFieldsIntersect": true,
"reportType": "Component Aggregate Ranking Report"
},
{
"expectedFields": [
"Component",
"MeasureName",
"ItemCode",
"ItemName",
"Period",
"PeriodValue",
"Value",
"MeasureType",
"IsScaled"
],
"completeFieldsIntersect": true,
"reportType": "Periodic Value Pivotable Data"
},
{
"expectedFields": [
"ReportingType",
"YAxisCategory",
"YAxisKey",
"YAxisName",
"MinValue",
"MaxValue",
"ValueRange",
"AverageValue",
"WeekdayName",
"Date",
"Hour"
],
"completeFieldsIntersect": true,
"reportType": "Chartable Hourly Report"
},
{
"expectedFields": [
"Date",
"DateValue",
"PrevDateValue",
"MinutesDifference",
"Hour",
"StartMinute",
"EndMinute"
],
"completeFieldsIntersect": true,
"reportType": "Data Timeliness Report"
},
{
"expectedFields": [
"LowestRanking",
"HighestRanking",
"CurrentRanking",
"Component",
"ItemCode",
"ItemName",
"ParentPeriod",
"ParentName",
"ChildPeriod",
"ChildPeriodName"
],
"completeFieldsIntersect": true,
"reportType": "Ranking Period Breakdown"
}
]
Returns multiple datasets for a client by report type
https://www.cryptostatto.com/api/EntityClientReportType
It will return all reports for an entity matching this specific Report Type.
Please note, entity names needs to match precisely.
{"EntityName" : "Assets",
"ReportTypes" : ["Chartable Hourly Report"]}
Please note, we return a collection of datasets that all conform to the specific Report Type/Client Report Type. We won't detail an example.
We are moving away from using Entity Reports And View Models to just Simple Reports. Don't panic - you will only need a couple of small lines of code to use the new version. The reason for using Simple Reports this is because this site does not use filtering on the data and it is more resource intensive. This will be the new way that most reports are accessible on the platform in the future.
You will see entity reports with the same name as simple reports, as we use this as a hook for our Report Type Dashboard tool. Remember, when querying the endpoint it will be secured so don't forget to attach the APIKey in your request header.
http://www.cryptostatto.com/api/simplereport
[
{
"entityDisplayName": "Another",
"entityName": "Another"
},
{
"entityDisplayName": "AssetMetricsHourlyChangeComparedLastToValue",
"entityName": "Asset-Metrics-Hourly-Change-Compared-Last-To-Value"
},
{
"entityDisplayName": "AssetPercentageChangeRangePeriod",
"entityName": "Asset-Percentage-Change-Range-Period"
},
{
"entityDisplayName": "BigWhaleAnalysis",
"entityName": "Big-Whale-Analysis"
},
{
"entityDisplayName": "Cars",
"entityName": "Cars"
},
{
"entityDisplayName": "ExchangeRateMoves",
"entityName": "Exchange-Rate-Moves"
},
{
"entityDisplayName": "HelloData",
"entityName": "Hello-Data"
},
{
"entityDisplayName": "PeriodicStatsAndValueComparison",
"entityName": "Periodic-Stats-And-Value-Comparison"
},
{
"entityDisplayName": "PeriodValueIntraAndChildParentMetrics",
"entityName": "Period-Value-Intra-And-Child-Parent-Metrics"
}
]
This requires a Json parameter. Remember to include the request header.
The result
A collection of keyed Json strings are returned. You would need to deserialise this to a Json object using Json.Parse. Almost always, these are Json collections.
http://www.cryptostatto.com/api/simplereport
JSON Body to pass to the API enpoint
{
"EntityName" : "Periodic-Stats-And-Value-Comparison"
}
[
{\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":45,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.46279},{\"DimensionId\":45,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.46279},{\"DimensionId\":45,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.54536},{\"DimensionId\":45,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.54536},{\"DimensionId\":47,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.48229},{\"DimensionId\":47,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.0722},{\"DimensionId\":47,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.17045},{\"DimensionId\":47,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":48,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.61406},{\"DimensionId\":48,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.61406},{\"DimensionId\":48,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.28359},{\"DimensionId\":48,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.28359},{\"DimensionId\":50,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":1.02163},{\"DimensionId\":50,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":2.19608},{\"DimensionId\":50,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.30353},{\"DimensionId\":50,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":51,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":1.34952},{\"DimensionId\":51,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.34952},{\"DimensionId\":51,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.52734},{\"DimensionId\":51,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.52842},{\"DimensionId\":53,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.91335},{\"DimensionId\":53,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.2408},{\"DimensionId\":53,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.21667},{\"DimensionId\":53,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":54,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":1.058},{\"DimensionId\":54,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.058},{\"DimensionId\":54,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.03572},{\"DimensionId\":54,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.00018},{\"DimensionId\":56,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":1.36048},{\"DimensionId\":56,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":2.29859},{\"DimensionId\":56,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.65045},{\"DimensionId\":56,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":57,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.89473},{\"DimensionId\":57,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.89473},{\"DimensionId\":57,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.73078},{\"DimensionId\":57,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.75196},{\"DimensionId\":59,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.65631},{\"DimensionId\":59,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.66553},{\"DimensionId\":59,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.00041},{\"DimensionId\":59,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":60,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.25763},{\"DimensionId\":60,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.25763},{\"DimensionId\":60,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.4048},{\"DimensionId\":60,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.64643},{\"DimensionId\":62,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.48229},{\"DimensionId\":62,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.0722},{\"DimensionId\":62,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.17045},{\"DimensionId\":62,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":63,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.61406},{\"DimensionId\":63,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.61406},{\"DimensionId\":63,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.28359},{\"DimensionId\":63,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.28359},{\"DimensionId\":65,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.48229},{\"DimensionId\":65,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":1.0722},{\"DimensionId\":65,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":0.17045},{\"DimensionId\":65,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":0.0},{\"DimensionId\":66,\"FieldKey\":\"C62882F8-2279-499B-A1D5-E90497F56403\",\"Value\":0.61406},{\"DimensionId\":66,\"FieldKey\":\"ED606021-4E96-4054-8DCC-2D850B192B87\",\"Value\":0.61406},{\"DimensionId\":66,\"FieldKey\":\"62C3E089-8F21-4D12-AE62-ADB230996BA3\",\"Value\":-0.28359},{\"DimensionId\":66,\"FieldKey\":\"4DFAA8D7-3020-44FC-B151-7631EF81D8E5\",\"Value\":-0.28359}]"},{"filename":"Reporting Set.json","reportKey":"75b85ccc-248f-4ddf-8e1b-f74a24a81944","hash":"7f842c5d29865770f54efee9446dc20a","dateAdded":"2024-12-12T11:59:32.6293421+00:00","isCurrent":true,"reportData":"[{\"SetKey\":\"1DD02B71-AFC2-4D97-B62A-87DDDA9D60F2\",\"SetName\":\"Ranked Asset Percentage Gains in USD\",\"ReportingSource\":\"PeriodValueIntraAndChildParentMetrics\"},{\"SetKey\":\"CFD1CE40-5AC9-42D8-A51A-A6D4938EFF3F\",\"SetName\":\"Child vs Parent Gain Direction from Percentage Gains in USD\",\"ReportingSource\":\"PeriodValueIntraAndChildParentMetrics\"},{\"SetKey\":\"412A6958-89D1-4236-983E-D302EA8927FA\",\"SetName\":\"Same Period Gains Comparisons in USD\",\"ReportingSource\":\"PeriodValueIntraAndChildParentMetrics\"}]"}]
]
The Immediate API was devised to overcome a common issue found when accessing external APIs in remote website apps - API rate limits. The issue is a simple one. If our website domain hosts a JavaScript client app and we have 100 users trying to access an eternal API, that API will assume our website is spamming their API and block access. We therefore created middleware to make the request in-between our API users and our website and make that data available. This provides an additional benefit in that we can have more frequent data on our site as it avoids our data layer.
A note on the Immediate API. This has been tested, is covered with Integration Tests and works well, but we have not activated this feature yet. When we do, we will providing a list of endpoints, how often they are updated. We have not made this information available within our website yet. When we do, you will see a list of Report Keys in our documentation.
{"ReportKey" : "8f3ce634-d756-4a2a-9c6d-ccdaa4da0465"}
One function of the cryptocurrency platform is to publish data to a storage area and make it available for download via web calls. This makes sense when we have older data, or large data volumes not typically suited to an API. Content could be zipped, archived, as pdfs, documents, or different media types.
We offer the capability to group information by dates and windows of a day, i.e. every 15 minutes. Whilst it does not mean that window specifically matches it does mean we can be confident where data exists but it is a guide.
We put together a simple data screener here to show how this works - Cryptocurrency Data Screener (cryptostatto.com)
Over time, we see most larger datasets being returned via the server content viewer and additional endpoints.
Note how we return a Display version and a named version. You may wish to tidy up your front-end code/calls
View Data Content Contexts. To be used in subsequent calls. Note how some folders are broken into date hierarchies.
https://www.cryptostatto.com/api/DataContent/
[
{
"context": "Archived Prices",
"dayDates": [
"2023-04-18T00:00:00",
"2023-04-19T00:00:00",
"2023-04-20T00:00:00",
"2023-04-24T00:00:00",
"2023-04-25T00:00:00"
],
"dates": [
"2023-04-18T09:15:00",
"2023-04-19T09:45:00",
"2023-04-20T13:00:00",
"2023-04-24T23:00:00",
"2023-04-25T15:30:00",
"2023-04-25T16:15:00",
"2023-04-25T17:15:00",
"2023-04-25T09:45:00"
],
"accessibleFolderParts": [
"CryptoData",
"Prices",
"Archive",
"2023_4_18_9_15_0",
"2023_4_19_9_45_0",
"2023_4_20_13_0_0",
"2023_4_24_23_0_0",
"2023_4_25_15_30_0",
"2023_4_25_16_15_0",
"2023_4_25_17_15_0",
"2023_4_25_9_45_0",
"hello.zip",
"later"
]
}
]
Get Context relevant Client Context Search Options. To be used in subsequent calls.
https://www.cryptostatto.com/api/DataContent/Archived%20Prices
Note, the same data is returned as the first call but specific to the context without being a collection. In some respects you may not need to use this call, but may find it useful to avoid breaking apart the collection from the first call.
{
"context": "Archived Prices",
"dayDates": [
"2023-04-18T00:00:00",
"2023-04-19T00:00:00",
"2023-04-20T00:00:00",
"2023-04-24T00:00:00",
"2023-04-25T00:00:00"
],
"dates": [
"2023-04-18T09:15:00",
"2023-04-19T09:45:00",
"2023-04-20T13:00:00",
"2023-04-24T23:00:00",
"2023-04-25T15:30:00",
"2023-04-25T16:15:00",
"2023-04-25T17:15:00",
"2023-04-25T09:45:00"
],
"accessibleFolderParts": [
"CryptoData",
"Prices",
"Archive",
"2023_4_18_9_15_0",
"2023_4_19_9_45_0",
"2023_4_20_13_0_0",
"2023_4_24_23_0_0",
"2023_4_25_15_30_0",
"2023_4_25_16_15_0",
"2023_4_25_17_15_0",
"2023_4_25_9_45_0",
"hello.zip",
"later"
]
}
Returns multiple datasets for a client by report type
https://www.cryptostatto.com/api/EntityClientReportType
It will return all reports for an entity matching this specific Report Type.
Please note, entity names needs to match precisely.
{"Context":"Archived Prices","dateFilter":{"0":[2023],"3":[2,4]},"SearchParts":[]}
#### json parameter example 2
{"Context":"Archived Prices","dateFilter":{"0":[2023],"3":[2,4]},"SearchParts":["2023_4_25_17_15_0","2023_4_25_9_45_0"]}
[{"context":"Archived Prices","accessibleFolderParts":["CryptoData","Prices","Archive","2023_4_25_17_15_0"],"resources":[{"fileName":"DataSet_20230425_170038.zip","url":"/CryptoData/Prices/Archive/2023_4_25_17_15_0/DataSet_20230425_170038.zip"},{"fileName":"DataSet_20230425_171539.zip","url":"/CryptoData/Prices/Archive/2023_4_25_17_15_0/DataSet_20230425_171539.zip"}],"child":1,"level":1,"ordinal":8,"serverEndPoint":"/CryptoData/Prices/Archive/2023_4_25_17_15_0","splitPeriodDates":[{"period":0,"part":2023,"originalDate":"2023-04-25T17:15:00"},{"period":1,"part":4,"originalDate":"2023-04-25T17:15:00"},{"period":2,"part":17,"originalDate":"2023-04-25T17:15:00"},{"period":3,"part":2,"originalDate":"2023-04-25T17:15:00"},{"period":4,"part":25,"originalDate":"2023-04-25T17:15:00"},{"period":5,"part":17,"originalDate":"2023-04-25T17:15:00"},{"period":6,"part":15,"originalDate":"2023-04-25T17:15:00"},{"period":7,"part":0,"originalDate":"2023-04-25T17:15:00"}],"resourceDate":"2023-04-25T17:15:00"},{"context":"Archived Prices","accessibleFolderParts":["CryptoData","Prices","Archive","2023_4_25_9_45_0"],"resources":[{"fileName":"DataSet_20230424_230119.zip","url":"/CryptoData/Prices/Archive/2023_4_25_9_45_0/DataSet_20230424_230119.zip"},{"fileName":"DataSet_20230424_231620.zip","url":"/CryptoData/Prices/Archive/2023_4_25_9_45_0/DataSet_20230424_231620.zip"}],"child":1,"level":1,"ordinal":8,"serverEndPoint":"/CryptoData/Prices/Archive/2023_4_25_9_45_0","splitPeriodDates":[{"period":0,"part":2023,"originalDate":"2023-04-25T09:45:00"},{"period":1,"part":4,"originalDate":"2023-04-25T09:45:00"},{"period":2,"part":17,"originalDate":"2023-04-25T09:45:00"},{"period":3,"part":2,"originalDate":"2023-04-25T09:45:00"},{"period":4,"part":25,"originalDate":"2023-04-25T09:45:00"},{"period":5,"part":9,"originalDate":"2023-04-25T09:45:00"},{"period":6,"part":45,"originalDate":"2023-04-25T09:45:00"},{"period":7,"part":0,"originalDate":"2023-04-25T09:45:00"}],"resourceDate":"2023-04-25T09:45:00"}]
Please note, we return a collection of datasets that all conform to the specific Report Type/Client Report Type. We won't detail an example.
Having got to grips with our API, how do we build apps and host them on our website?
It is fairly simple to be honest. We already had plugin capability within our website and found we could develop rich applications to present data.
We build our applications within Visual Studio Code. We point our development environment to a local proxy of the live website using hosts lookup with IIS. The key observation is that we have to change the paths of some reference paths to include the apps folder. We can omit certain paths too with regards to jQuery and bootstrap when publishing live.
The one thing that can catch you out is that the manifest related files has a uniquely generated key every time the application is built.
Once we have completed our apps, we drop them on our apps folder and configure our website to present these in an appropriate view.
In terms of layout within our website, we use Bootstap 4 now and for the foreseeable future. We recommend looking at existing apps. The key consideration is to ensure you don't nest your rows and cols too much to avoid squashing.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See [https://developers.google.com/web/fundamentals/web-app-manifest/](https://developers.google.com/web/fundamentals/web-app-manifest/)
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="stylesheet" href="bootstrap.min.css" />
<link rel="stylesheet" href="chart.css" />
<script src="jquery-3.4.1.slim.min.js"></script>
<script src="popper.min.js"></script>
<script src="bootstrap.min.js"></script>
<link
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined"
rel="stylesheet"
/>
<link rel="stylesheet" href="simpleSpinner.css" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/apps/ServerContent/manifest.json"/><script src="/apps/ServerContent/jquery-3.4.1.slim.min.js"></script><script src="/apps/ServerContent/popper.min.js"></script><script src="/apps/ServerContent/bootstrap.min.js"></script><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet"/><title>React App</title><script defer="defer" src="/apps/ServerContent/static/js/main.b83802aa.js"></script><link href="/apps/ServerContent/static/css/main.da2c0a83.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
Please note - you do not have to supply the json. Certainly in the short term, basic content is sufficient.
[{
"Slug": "support-our-platform",
"Name": "support-our-platform-donate",
"After": false,
"IsCollapsible": false,
"Header": "Improve your platform - Crypto Statto",
"Paragraphs": [ "Consume a product or service or donate from a choice of a few QR Codes. Donate a few pounds or dollar equivalent."
,"If you enjoy our platform but don't want to register or pay, feel free to add a small contribution."
, "We appreciate it!"],
"ImageSrc": "/uploads/b0cf78c4-3e88-4557-a696-9a5a06743cf1-BuildingPEopleWalkingOutside.jpg",
"Link": null,
"CallsToAction": [ "ref-bitcoin-donation" , "ref-litecoin-donation", "ref-algorand-donation","ref-ethereum-classic-donation", "ref-pirate-chain-donation"]
}
, {
"Slug": "support-our-platform",
"Name": "support-our-platform-affiliates",
"After": false,
"IsCollapsible": false,
"Header": "Affiliations",
"Paragraphs": [ "Please help our platform grow by considering visting referrals we have signed up on."
,"Always do your own research before using any potential service provider or product supplier." ],
"ImageSrc": "/uploads/b9c93c86-9ac0-4698-84f9-4379224df028-cryptocurrency symbols on the balloons.png",
"Link": null,
"CallsToAction": [ "ref-coinledger" , "ref-haas", "ref-swapzone", "ref-ledger-hardware","ref-trading-view"]
}
]
[ {
"CallToActionName": "analytics-completeness",
"Title": "Platform Completeness",
"RawContent": "",
"Description": "",
"Icon": "fa fa-battery-2 fa-4x",
"Image": "",
"ExtraCSSHelper": "",
"ComponentToInclude": "",
"listItems": [
{
"icon": "fa-li fa fa-bug",
"Content": "Our platform is still in beta-mode"
}
,
{
"icon": "fa-li fa fa-binoculars",
"Content": "We focus on transparency and honesty on our platform"
}
,
{
"icon": "fa-li fa fa-plus-square",
"Content": "We will keep adding new datasets and reports"
}
,{
"icon": "fa-li fa fa-rocket",
"Content": "This platform will get better, and better, and better"
}
]
,"callToActionLinks": null
}
,
{
"CallToActionName": "IRContactList",
"Title": "Key ways to contact us",
"RawContent": "",
"Description": "Don't be afraid to send us multiple communications, ideas evolve.",
"Icon": "fa fa-envelope-square fa-4x",
"Image": "",
"ExtraCSSHelper": "",
"ComponentToInclude": "",
"listItems": null,
"callToActionLinks": [
{
"Url": "[mailto:info@cryptostatto.com](mailto:info@cryptostatto.com)",
"FriendlyName": "Email us",
"Target": "_self"
},
{
"Url": "[https://twitter.com/crypto_statto](https://twitter.com/crypto_statto)",
"FriendlyName": "Crypto Statto on Twitter",
"Target": "_blank"
}
,
{
"Url": "[https://t.me/cryptostatto](https://t.me/cryptostatto)",
"FriendlyName": "Find us on Telegram",
"Target": "_blank"
}
]
}
]
Within this section, each partner can have their own dedicated page.
[www.cryptostatto.com/analytics](http://www.cryptostatto.com/analytics)
[www.cryptostatto.com/partner-analytics/{your-company-name}](http://www.cryptostatto.com/partner-analytics/%7byour-company-name%7d)
Our web data platform allows us to;
The basic rules are;
We have added an entirely new process for processing and holding data on our platform. We now have what is known as a Packaged Reports Manager. Packaged Reports are effectively, an entity with one or more reports contained within them. Our Web Data Platform identifies the latest file from a group of Entity's Packaged Reports. The earlier versions are pulled off the data folder and the latest one loaded into the platform. Reports become available soon after through the API or web views.
We will be publishing details on how to provide data to Crypto Statto in the near future.
The main benefit to developing against our API is to showcase your ability to a wider audience. As Crypto Statto grows to where we want it to be, we will seek to add development partners to our platform.
We can accommodate this for free for initial pioneers on our platform. As the platform grows we are likely to limit this or charge for this capability. We would expect for a page to be added under http://www.cryptostatto.com/analytics/
. We are not looking at profit sharing but are open to discussion.
Please contact us if you feel this is an avenue you wish to pursue. Currently, we are preferring to build our Crypto Statto capabilities in-site at the moment.
We have no plans to open up our database but we are planning to make more information available through our server content viewer. We are looking at moving older data to a document store and making that available in future.
Not at the moment, we are exploring the possibility of a second server where trusted partners can upload apps and see them running against a secondary website.
We don't have a formalised process presently. Our thoughts are we maintain a public branch here - inforhino/CryptoStatto: Tools and utilities for traders and developers working with the Crypto Statto platform (github.com)
Perhaps you create a public repository on github or bitbucket and making that available to us. We can then take care of the build and deploy to Crypto Statto.
Reach out to us here www.cryptostatto.com/contact or email us support@cryptostatto.com
We haven't made major efforts to restrict access to Crypto Statto for CORS but this will definitely happen once we start handling payments through Crypto Statto. Our APIs are currently open but we will be securing certain endpoints in future.
Please read more here - Bespoke Software Development (cryptostatto.com)
Definitely get in touch with us if this is something you wish to do.
Reach out to us here www.cryptostatto.com/contact or email us support@cryptostatto.com
Not in the immediate future. Where we find we are moving more towards realtime information analytics, then this will definitely be on the cards.
Written with StackEdit.