diff --git a/content/blog/public-api-monero-remote-node-list/index.md b/content/blog/public-api-monero-remote-node-list/index.md index 6ae2ccd..1dd9789 100644 --- a/content/blog/public-api-monero-remote-node-list/index.md +++ b/content/blog/public-api-monero-remote-node-list/index.md @@ -35,6 +35,19 @@ Since the Monero remote nodes that I monitor are increasing and my page that dis ## Updates +### Update 2024-01-31 (Breaking Changes) + +- API endpoint moved from `https://www.ditatompel.com/api/monero/remote-node` to `https://api.ditatompel.com/monero/remote-node`. +- `x-ditatompel-rate-limit-*` headers removed, no rate limit for now. +- Indication "unchecked node statuses" in `data[].last_check_statuses[]` changed from `null` to `2`. +- Added into `json` field: + - `data[].ip`, `data[].date_entered`, `data[].latitude`, and `data[].longitude` +- Removed from `json` field: + - `success` + - `data[].postal` + +Because I [refactoring my backend]({{< ref "/blog/rewriting-ditatompel-site-to-svelte-tailwind-and-go/index.md" >}}), there will most likely be another breaking changes in the near future. + ### Update 2023-05-24 - I've add `cors` and `last_check_statuses` to nodes data record. @@ -47,7 +60,7 @@ Since the Monero remote nodes that I monitor are increasing and my page that dis ## Endpoint and Query Parameters | Method | Endpoint | | ------ | ------------------------------------------------- | -| GET | https://www.ditatompel.com/api/monero/remote-node | +| GET | `https://api.ditatompel.com/monero/remote-node` | The response will display all the Monero remote node sorted from the highest percentage of uptime. @@ -72,98 +85,90 @@ Optional query string parameters: For example, if you want to **list CORS enabled Monero nodes using https from United States sorted from recently checked node**: ```shell -curl -sL 'https://www.ditatompel.com/api/monero/remote-node?cors=true&protocol=https&country=us&orderby=lastcheck-desc' | jq +curl -sL 'https://api.ditatompel.com/monero/remote-node?cors=true&protocol=https&country=us&orderby=lastcheck-desc' | jq ``` ## Response Header The response header includes the **HTTP status code** and the `content-type`. Clients that receive a HTTP status code other than `200` and `content-type` other than `application/json` must back-off. -In addition, I added custom headers `x-ditatompel-rate-limit-*` to limit users from making excessive queries to the server. - -- `x-ditatompel-rate-limit-limit`: Your IP address initial quota for given period. -- `x-ditatompel-rate-limit-remaining`: Approximate number of requests left to use. -- `x-ditatompel-rate-limit-reset`: Approximate number of seconds to end of period. - -The ratelimits period is currently set to 1 hour and initial quota is 3600 requests. It means 1 request every second per IP (you won't get different result if you perform same API calls in short period of time anyway). - ## Response Body -The response body includes the information of the query result, query status, and error messages, if available, and metadata for debugging purpose. In the example below, the response body of: +The response body includes the information of the query result, query status, and response message. In the example below, the response body of: ```shell -curl -sL 'https://www.ditatompel.com/api/monero/remote-node?protocol=https&country=id' | jq +curl -sL 'https://api.ditatompel.com/monero/remote-node?country=de' | jq ``` ```json { - "success": 1, "status": "ok", - "message": "Query success", + "message": "Query Ok", "data": [ { - "hostname": "xmrnode1.ditatompel.com", - "port": 443, - "ip_address": "103.244.206.102", - "protocol": "https", + "hostname": "xmr-node.cakewallet.com", + "ip": "172.104.202.210", + "port": 18081, + "protocol": "http", "is_tor": false, - "status": "online", + "is_available": true, "nettype": "mainnet", - "last_height": 2892329, - "adjusted_time": 1684869115, - "database_size": 171798691840, - "difficulty": 282381487137, - "uptime": 99.49, + "last_height": 3074012, + "adjusted_time": 1706708935, + "database_size": 193273528320, + "difficulty": 255349054158, + "node_version": "", + "uptime": 99.95, "estimate_fee": 20000, - "asn": 131759, - "asn_name": "IDNIC-WDS-AS-ID", - "country": "ID", - "city": "Tangerang", - "postal": 0, - "last_checked": 1684869296, - "cors": true, + "asn": 63949, + "asn_name": "Akamai Connected Cloud", + "cc": "DE", + "country_name": "Germany", + "city": "Frankfurt am Main", + "latitude": 1.2868, + "longitude": 103.8503, + "date_entered": 1632724330, + "last_checked": 1706708889, "last_check_statuses": [ - null, 1, - 0, + 1, + 1, 1, 1 - ] + ], + "cors": false } - ], - "@meta": { - "cache": true, - "ttl": 32, - "response_time": 0.332 - } + ] } ``` - -- `success`: *unsigned int*, `1` means everything looks good. - `status`: *string*, `ok` means everything looks good. - `message`: *string*, Information related to your query, *success* or *error* message if any. - `data`: *array* of nodes structure as follows: - - `hostname`: *string*, The hostname / nodes IP address. + - `hostname`: *string*; The hostname / nodes IP address. + - `ip`: *string*; The IP address of node, empty string if hostname is not resolveable (Eg.: TOR nodes) - `port`: *unsigned int*; TCP port the nodes is using to listen to RPC calls. - - `protocol`: *string*, The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`. - - `is_tor`: *boolean*, whether the node is accessed through the Tor network. - - `status`: *string*, General Monero daemon RPC status. `online` means everything looks good and nodes is syncronized to the network, `offline` means node wasn't ready or my bots can't connect to nodes RPC daemon. + - `protocol`: *string*; The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`. + - `is_tor`: *boolean*; whether the node is accessed through the Tor network. + - `is_available`: *boolean*; whether the node is online or not. False may means node wasn't ready or my bots can't connect to nodes RPC daemon. - `nettype`: *string*; Network type (one of `mainnet`, `stagenet` or `testnet`). - `last_height`: *unsigned int*; Current length of longest chain known to daemon. - `adjusted_time`: *unsigned int*; Current time approximated from chain data, as Unix time. - `database_size`: *unsigned int*; The size of the blockchain database, in bytes. - `difficulty`: *unsigned int*; Least-significant 64 bits of the 128-bit network difficulty. - - `uptime`: *float*, Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 10 seconds). + - `node_version`: *string*; Vesion of remote monero node is running. + - `uptime`: *float*; Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 60 seconds). - `estimate_fee`: *unsigned int*; Amount of fees estimated per byte in atomic units. This just fee estimation, Malicious actors who running remote nodes [still can return high fee only when you about to create a transactions](monero-tx-fee-node.jpg). - - `asn`: *unsigned int*, The AS number that owns nodes IP address. - - `asn_name`: *string*, The AS name that owns nodes IP address - - `country`: *string*, two-letter ISO 3166-1 country code nodes location, empty string if no information available. - - `city`: *string*, City location based on nodes IP address, empty string if no information available. - - `postal`: *unsigned int*, Postal code based on nodes IP address, `0` if no information available. - - `last_checked`: *unsigned int*, The Unix time when my bots check the nodes status. - - `cors`: *boolean*, whether the node return with `Access-Control-Allow-Origin` header or not. - - `last_check_statuses`: *array* (size: 5) of last node status avaibility status. Possible values: - - `null` : not yet checked. + - `asn`: *unsigned int*; The AS number that owns nodes IP address, `0` if no information available. + - `asn_name`: *string*; The AS name that owns nodes IP addres. + - `country`: *string*; two-letter ISO 3166-1 country code nodes location, empty string if no information available. + - `city`: *string*; City location based on nodes IP address, empty string if no information available. + - `latitude`: *float*; Approx. latitude (geographic coordinate). + - `longitude`: *float*; Approx. longitude (geographic coordinate). + - `date_entered`: *unsigned int*, The Unix time when my bots start monitoring the node. + - `last_checked`: *unsigned int*, The Unix time when was the last time my bot checked into a monero node. + - `last_check_statuses`: *array* (size: `5`); last node avaibility status. Possible values: - `0`: Offline - `1`: Online + - `2`: not yet checked. + - `cors`: *boolean*, whether the node return with `Access-Control-Allow-Origin` header or not. - `@meta`: *object*, Additional information related to API calls for debuging purpose. > You will get `200` response code, `ok` status, and **empty array** of data even if your query return no data.