🎉🎉 We have now served over 100,000,000 requests through our EOS API proxy 🎉🎉

API Node Proxy

The Problem: Knowing which EOS API nodes are best suited to handle your users' requests.
The Solution: A geo routing proxy that auto tunnels requests to the most relevant API node.

curl -si https://proxy.eosnode.tools/v1/chain/get_info

Use 1 API

Use a single API endpoint to gain access to the top 50 block producer API nodes. Requests to our API use the same nodeos API paths and parameters.

Reduce Latency

All requests are served by Geo-DNS contextual to the location of the user. The chosen producer details are returned in the response headers.

Client Side Integration

Use the proxy as a drop in replacement for the EOS API endpoint with all major client side libraries and it even works via cleos using the -u switch.

How Does It Work?

Based on real-time API performance data collected from our monitoring service, we always serve the best API contextual to the location of the user.

Performance

The proxy API is designed to handle thousands of requests a second. We hope our proxy API will become a fundamental building block for all dApps.

History APIs

We validate the producer nodes to determine if the history plugin is enabled. All proxy requests for history will be auto routed to matching APIs.

Getting Started

Simply append the desired path to the end of our proxy API: https://proxy.eosnode.tools/path/to/request

This is enabled for both GET and POST requests. You can check out the EOS Developers microsite for a full rundown of all available endpoints.

# Call the /v1/chain/get_info GET endpoint
curl -s https://proxy.eosnode.tools/v1/chain/get_info

{"server_version":"b8c1b2c2","chain_id":"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906","head_block_num":13814444,"last_irreversible_block_num":13814115,"last_irreversible_block_id":"00d2c963df921487118190b0b8f0bad7f27c1a5632d9f35f9735d6488e5f231d","head_block_id":"00d2caacdc56dd0f7014ee93eeeff81ad088ed5748483b1b3f711c5c12b4a93a","head_block_time":"2018-08-30T10:44:45.000","head_block_producer":"eoslaomaocom","virtual_block_cpu_limit":51535103,"virtual_block_net_limit":1048576000,"block_cpu_limit":199900,"block_net_limit":1048576}

# Fetch a block via POST endpoint
curl -sX POST -d '{"block_num_or_id":"888888"}' https://proxy.eosnode.tools/v1/chain/get_block

{"timestamp":"2018-06-15T14:32:09.000","producer":"eoshuobipool","confirmed":0,"previous":"000d903756de5c2ba16368d3a63f5367f26645029908088c71b6cc5840bab6a1","transaction_mroot":"09c2be1af51b544c4f5d0cf928f583b19712007453c43b12f0f7a6f8b4e398c3","action_mroot":"a38bae1fab5da942eb13cb2df1737f4aafb16d543c2158e4a6431e50154a49cd","schedule_version":7,"new_producers":null,"header_extensions":[],"producer_signature":"SIG_K1_K65pQY9NWCncwzwwCMJFkRnM1ZysBAzFZuoUyUdrF3PWJZdR4zEULEt8Na4VW5cPPNLNb6wCjGeXgbENd2dYbkuaNS7ZHJ","transactions":[{"status":"executed","cpu_usage_us":849,"net_usage_words":14,"trx":{"id":"6b4cbb22b3036bfbf40be47f3eee2442b1c5d3f8389608d2e3a8274a6db435e4","signatures":["SIG_K1_K9dDQULQVKG1dKF8WfkZpHZqnetumRYSLfz7dbarC9MxdWDE6CuuUFaRsfs2oeLAP99yLreQEeTXcsXzwxR2H1Si4tUBVG"],"compression":"none","packed_context_free_data":"","context_free_data":[],"packed_trx":"b4d5235bed8e99b9b1b10000000001a09861f648958566000000000080694a01a09864fa489abe6600000000a8ed3232100f41444120746f20746865206d6f6f6e00","transaction":{"expiration":"2018-06-15T15:05:24","ref_block_num":36589,"ref_block_prefix":2981214617,"max_net_usage_words":0,"max_cpu_usage_ms":0,"delay_sec":0,"context_free_actions":[],"actions":[{"account":"gu2tembqgage","name":"ddos","authorization":[{"actor":"guzdombugmge","permission":"active"}],"data":{"memo":"ADA to the moon"},"hex_data":"0f41444120746f20746865206d6f6f6e"}],"transaction_extensions":[]}}}],"block_extensions":[],"id":"000d9038417ac66f405e9065be34dc27d9f22b033be71541c07c4102f0d4f38a","block_num":888888,"ref_block_prefix":1703960128}
# Request an invalid path
curl -siX POST https://proxy.eosnode.tools/v1/history/get_actions -d '{"account_name":"eosbet"}'
HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache, private
Date: Mon, 17 Sep 2018 09:25:25 GMT

{"errors":{"producer":"The producer API returned a non standard error"}}

Handling Errors

It's important to handle errors to ensure a good user experience. We pass through all valid RPC API errors and abstract other errors into a json response with a description of the issue served with a relevant HTTP response code.

For our custom errors, this can occur if the chosen API was unable to serve the request, if your request URI is invalid or if there is an issue with our caches.

Rate Limiting

We are currently rate limiting the requests to 1,000 a minute, per IP. This is something that we will monitor closely and if there is a legitimate demand for higher rates then we will look to offer higher tiers of access.

The current count is returned in the response headers using two X-RateLimit keys.

# Excitedly call the info endpoint repeatedly
curl -si https://proxy.eosnode.tools/v1/chain/get_info

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 555
... snip headers ...
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 954
# Requesting some history info
curl -siX POST -d '{"id":"91c64386b29fe91dd7bfc612bf8d927be297e55d15da2bd8780b1b74588de39a"}' https://proxy.eosnode.tools/v1/history/get_transaction

... snip headers ...
Cache-Control: no-cache, private
X-Selected-Producer: eosswedenorg
X-Selected-Node: https://api.eossweden.se
X-Selected-Location: Frankfurt

Response Headers

As we are proxying the requests, we will pass through all response headers from the original API that served the request.

We decorate this response with some of our own custom headers, most notable are the actual producer and API endpoint that served the request and the geo location of our application node that served the request.

Geo-DNS Routing

It's imperative that a proxy service is as fast as possible. We have deployed application nodes around the globe and utilise Geo-DNS routing to reduce request latency for calls to the proxy.

MyEOSKit

Myeoskit.com is operated by the team at EOS Asia, they have implemented the node proxy to provide data into their block explorer and EOS toolkit.

Visit myeoskit.com

EOS Pixels

With this dApp you can draw pixels on the EOS blockchain and earn tokens from your investment! They use the node proxy to fetch real-time table data to fuel the front-end.

Visit pixelmaster.io

Get in touch with us

We have a dedicated telegram group for discussing the node proxy, we'd love to hear your thoughts and feedback.

EOS Proxy Telegram Group