{"id":"/about/","title":"About","markdownUrl":"https://nodely.io/about.md","heading":"About","url":"https://nodely.io/about/","text":"ABOUT NODELY"}
{"id":"/about/","title":"About","markdownUrl":"https://nodely.io/about.md","heading":"Infrastructure expertise.  ","url":"https://nodely.io/about/","text":"An enterprise perspective.\n\nNodely is the team behind AlgoNode. We bring hands-on experience operating Algorand nodes, APIs, indexers, and data services to organizations building on blockchain.\n\nFrom public-network applications to private and hybrid deployments, we help teams align infrastructure with their requirements for access, governance, and day-to-day operations.\n\nOur approach combines open-source foundations, practical engineering, and a long-term view of security—including post-quantum readiness.\n\n[Talk to our team ↗](https://nodely.io/contact)\n\nOUR TEAM MEMBERS\n\nMeet our team\n\nOur team has been building reliable critical telco infrastructure since 2006. We know how to provide reliable, low latency services on bare metal. Nodely’s free endpoints run on cutting edge versions that are ahead of the main branch to further reduce delays. All this allows us to provide high reliability on commercials endpoint with configs and patches battle tested by community.\n\n![Service Image](https://nodely.io/_astro/member1.CSb2qwyW_ZCoq29.png)\n\nUrtho\n\nArchitect\n\nAPI, R&D\n\n[![](https://nodely.io/_astro/x.B93jVa7j_14iXDP.png)](https://twitter.com/Urthoo)[![](https://nodely.io/_astro/linkedin.DL1ZLUwv_Z1Dq7Jp.png)](https://linkedin.com/in/urtho)[![](https://nodely.io/_astro/github.D2ba_Vmz_18jMjN.png)](https://github.com/urtho)\n\n![Service Image](https://nodely.io/_astro/member2.DF8HwZ0p_Z1dsm8n.png)\n\nNull\n\nDevOps\n\nFullstack, Web3, UX\n\n[![](https://nodely.io/_astro/linkedin.DL1ZLUwv_Z1Dq7Jp.png)](https://www.linkedin.com/in/charles-thibault-a5551352/)\n\n![Service Image](https://nodely.io/_astro/member3.BkYi0GX-_ZaODJK.png)\n\nKrzysztof\n\nSRE\n\nbaremetal, SysOps, Networking, K8S\n\n[![](https://nodely.io/_astro/linkedin.DL1ZLUwv_Z1Dq7Jp.png)](https://www.linkedin.com/in/krzysztof-polecha%C5%84czuk-53994963/)\n\n![Service Image](https://nodely.io/_astro/member4.DDf_X83C_1VyzcY.png)\n\nSkan\n\nSRE\n\nHardware, Networking, OpSec\n\n[![](https://nodely.io/_astro/linkedin.DL1ZLUwv_Z1Dq7Jp.png)](https://www.linkedin.com/in/andrzej-pier%C5%9Bcionek-0376157b/)\n\nWould you like to get in touch with us? Feel free to contact us using our contacts above or drop us a line!\n\n[Contact us](https://nodely.io/contact)"}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Nodely for coding agents","url":"https://nodely.io/agents/","text":"Nodely, formerly AlgoNode, provides blockchain APIs, infrastructure and data services. Start with the task you want to complete, find the relevant documentation, then use its examples and endpoint restrictions."}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Start with your task","url":"https://nodely.io/agents/#start","text":"-   [Make your first Algorand API call](https://nodely.io/docs/get-started/)\n-   [Choose a network and endpoint](https://nodely.io/docs/free/endpoints/)\n-   [Authenticate a backend or browser application](https://nodely.io/docs/access/authentication/)\n-   [Handle quotas and rate limits](https://nodely.io/docs/access/limits/)\n-   [Compare current plans](https://nodely.io/pricing/)\n-   [Discover x402 pay-per-call APIs](https://nodely.io/docs/x402/discovery/)"}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Choose a format","url":"https://nodely.io/agents/#formats","text":"| Resource | Contents |\n| --- | --- |\n| [llms.txt](https://nodely.io/llms.txt) | A short map of the most useful documentation and discovery files. |\n| [content-index.json](https://nodely.io/content-index.json) | All exported pages, titles, descriptions, heading anchors and Markdown URLs. |\n| [content.jsonl](https://nodely.io/content.jsonl) | One searchable passage per line, with its title and source URL. Download and search locally. |\n| [search-index.json](https://nodely.io/search-index.json) | The complete search corpus grouped by document. |\n| [services.json](https://nodely.io/services.json) | Nodely service references, published endpoint tables and direct OpenAPI links. |\n\nEach content page links to a Markdown representation. For example, `/docs/access/authentication/` has [`/docs/access/authentication.md`](https://nodely.io/docs/access/authentication.md). Prices, limits and examples are generated from the same published content as the HTML page."}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Search without a browser","url":"https://nodely.io/agents/#search","text":"```bash\ncurl --fail --output content.jsonl https://nodely.io/content.jsonl\nrg -i 'token|authentication' content.jsonl\n\n# Read the authoritative page once you have found it:\ncurl --fail https://nodely.io/docs/access/authentication.md\n```\n\nFor ranked local search, download the index and the small search utility. It runs on Node.js 22 or later without installing packages.\n\n```bash\ncurl --fail --output search-index.json https://nodely.io/search-index.json\ncurl --fail --output agent-search.mjs https://nodely.io/agent-search.mjs\nnode agent-search.mjs ./search-index.json \"Which header authenticates the indexer?\"\n```\n\nResults include an excerpt, the matching heading, a source link and a Markdown URL. Fetch only the relevant pages. For interactive browsing, [search the site](https://nodely.io/search/)."}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"API specifications","url":"https://nodely.io/agents/#specifications","text":"-   [Algorand Algod OpenAPI YAML](https://nodely.io/swagger/api/4160/algod.oas3.yml)\n-   [Algorand Indexer OpenAPI YAML](https://nodely.io/swagger/api/4160/indexer.oas3.yml)\n-   [x402 OpenAPI JSON](https://x402.api.nodely.io/openapi.json)\n-   [x402 discovery](https://x402.api.nodely.io/.well-known/x402) and [x402 instructions](https://x402.api.nodely.io/llms.txt)\n\nThe Algod and Indexer schemas describe API operations. Use Nodely's [authentication guide](https://nodely.io/docs/access/authentication/) and [limits guide](https://nodely.io/docs/access/limits/) for provider-specific access rules."}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Sources and freshness","url":"https://nodely.io/agents/#sources","text":"Use the canonical HTML URL to cite a source. Download a fresh index when beginning a new integration: a local copy is a snapshot. Update dates are included when supported by article metadata or committed source history; a missing date does not mean the content is stale.\n\nJSON resources use a versioned Nodely format. They are public downloads and require no account. Search happens locally in your browser or coding environment."}
{"id":"/agents/","title":"Documentation for coding agents","markdownUrl":"https://nodely.io/agents.md","heading":"Optional repository guidance","url":"https://nodely.io/agents/#repository-guidance","text":"Add this to your project's `AGENTS.md` when you want a coding agent to consult Nodely documentation during integration work:\n\n```\nWhen implementing Nodely integrations, consult https://nodely.io/llms.txt and the linked Markdown documentation. Verify the network, endpoint, authentication and current limits before writing code. Cite the canonical documentation URL.\n```"}
{"id":"/algostreamer/","title":"Algostreamer","markdownUrl":"https://nodely.io/algostreamer.md","heading":"Algostreamer","url":"https://nodely.io/algostreamer/","text":"![Algostremer Hero Image](https://nodely.io/_astro/algostreamer.FZKlv7W__Z1BR57C.webp)"}
{"id":"/algostreamer/","title":"Algostreamer","markdownUrl":"https://nodely.io/algostreamer.md","heading":"Algostreamer","url":"https://nodely.io/algostreamer/","text":"Highly available realtime block and transaction stream/push\n\nNOTE\n\nwe do not provide IPFS pinning service but permanently cache all IPFS objects referenced in all new Algorand ASAs.\n\n![About Nodely](https://nodely.io/_astro/gear.BfthKn-8_1IBEtU.png)\n\nALGOSTREAMER\n\nStream new blocks to various services (redis/elasticsearch/...)\n\n[Documentation](https://nodely.io/docs)"}
{"id":"/algostreamer/","title":"Algostreamer","markdownUrl":"https://nodely.io/algostreamer.md","heading":"About Algostreamer","url":"https://nodely.io/algostreamer/","text":"Small utility to stream past and/or current Algorand node JSON blocks to Redis or stdout. Blocks and TXn can be filtered and transformed and redirected using REGO - an Open Policy Agent language."}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Ariadne: Algorand investigations and threat intel","url":"https://nodely.io/ariadne/","text":"ARIADNE BY NODELY"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"See what moves on Algorand.  ","url":"https://nodely.io/ariadne/","text":"Before it becomes a case.\n\nAriadne is Nodely's AI-assisted workspace for Algorand investigations, threat intel and the DeFi radar. It runs on the same infrastructure as our APIs and is available to Nodely commercial customers.\n\n[Talk to us about Ariadne ↗](https://nodely.io/contact?subject=Ariadne)\n\n[Watch the video (MP4)](https://media.algo.green/v/share/ariadne-one-alert-1920x1080.mp4)\n\nOne alert, in 30 seconds\n\n01 / WHAT IT DOES"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"One workspace.  ","url":"https://nodely.io/ariadne/","text":"Three ways to stay ahead.\n\nBuilt by the team that runs Algorand nodes, indexers and relays for the ecosystem.\n\nINVESTIGATIONS"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"AI-assisted Algorand investigations","url":"https://nodely.io/ariadne/","text":"Follow funds across accounts, assets and applications with an analyst that cites every on-chain fact it uses. Cases, notes and evidence stay with your team.\n\nTHREAT INTEL"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Threat intel for Algorand","url":"https://nodely.io/ariadne/","text":"Advisories, crypto hacks and infrastructure outages, matched to the Algorand stack, the dApps built on it and the wallet and login vendors they ship.\n\nDEFI RADAR"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"DeFi radar","url":"https://nodely.io/ariadne/","text":"On-chain detectors that page on drains and double payouts while they happen, with NoA's running commentary on what the public sources confirm.\n\n[Watch the video (MP4)](https://media.algo.green/v/share/ariadne-glance-r1-1920x1080.mp4)\n\nAriadne at a glance, in two minutes\n\n02 / LIVE"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Threat intel at a glance","url":"https://nodely.io/ariadne/#ariadne-glance","text":"Snapshot of 2026-11-10 19:05 UTC (43 min ago).\n\nALGORAND DAPPS\n\n18"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"dApps open to a remote attack","url":"https://nodely.io/ariadne/","text":"Algorand dApp sites the dApp radar flags right now with an exploitable advisory or exposure. Counted, never named.\n\nGLOBAL CRYPTO HACKS\n\n74"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"hacks in the last 30 days","url":"https://nodely.io/ariadne/","text":"$967M stated losses across all chains, from public reports, vendor pages and security researchers.\n\nINFRASTRUCTURE OUTAGES\n\n18"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"severe outages in the last 7 days","url":"https://nodely.io/ariadne/","text":"Cloud, hosting and wallet-vendor incidents that score 50+ for Algorand dApps and their users."}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"DeFi radar: last 5 incidents","url":"https://nodely.io/ariadne/#ariadne-radar","text":"Page-level findings of the radar on Algorand mainnet, grouped per incident: what was taken, from which application, and which detectors caught it.\n\n| Date | Application | Detected by | Taken | Actor |\n| --- | --- | --- | --- | --- |\n| 2026-11-07  \ncritical | Tinyman AMM V1.1  \n[app 552635992](https://allo.info/application/552635992) (dex) | Net value extraction  \nround 66,737,125 | $1.7K | [YA4JFX…LVXA](https://allo.info/account/YA4JFXLYXZV36LASPOGRNYAVJ4ZHTZMK7G5W5QV4JJHOVPPBR5ANS7LVXA) |\n| 2026-10-28  \ncritical | TokenReward payment escrow (app 2882966661)  \n[app 2882966661](https://allo.info/application/2882966661) (other) | Net value extraction  \nround 66,424,360 | $4.8K in 95 payouts | [OZQVIA…2R5A](https://allo.info/account/OZQVIA3BU3FVXSREOBKBV3JQBW5P6EOB7TG4WCZEGOKZXZQXXUUWYP2R5A) |\n| 2026-10-15  \ncritical | Yieldly proxy (opt-in / check router)  \n[app 233725848](https://allo.info/application/233725848) (staking) | Net value extraction  \nround 66,001,362 | $1.8K | [2MX44A…XMKA](https://allo.info/account/2MX44ABLHTAJ2KX6M57QIWGMAITJC7H35FJJA336KCZC5WROGJC2N5XMKA) |\n| 2026-10-09  \ncritical | Gora: VRF-proof round app (master 1140801821)  \n[app 1140802049](https://allo.info/application/1140802049) (oracle) | Net value extraction  \nround 65,816,630 | $1.7K in 2 payouts | [D6YXL3…QQF4](https://allo.info/account/D6YXL3NQO5OSN3LKEDLJW6XP4FHEBYIAPPTXHIOAE7F6OOLRVJM6KRQQF4) |\n| 2026-10-02  \ncritical | MessinaOne mALGO LST 1.0 lst app  \n[app 2713771029](https://allo.info/application/2713771029) (staking) | Net value extraction  \nround 65,589,279 | $352.8K | [TTDQGK…LAVI](https://allo.info/account/TTDQGKQMM35DEFXU6JZXVT6BQIVFDJFVG4IPSPMVUWV3Y5ZADEWFHVLAVI) |"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Latest crypto hacks","url":"https://nodely.io/ariadne/","text":"| Date | Project | Chains | Category | Loss | Sources |\n| --- | --- | --- | --- | --- | --- |\n| 2026-11-10 | Initia | Initia | chain | $615K | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-10 | Ethersphere | Ethereum | supply\\_chain | undisclosed | [x.com](https://x.com/SlowMist_Team/status/2119998212497125582) |\n| 2026-11-10 | NEAR AI |  | infra | undisclosed | [theblock.co](https://www.theblock.co/news/defi/2026-11-10-near-ai-security-breach-437002) |\n| 2026-11-09 | Binance | NEAR, THORChain, Chainflip | cex | undisclosed | [t.me](https://t.me/wublockchainenglish/26745) · [t.me](https://t.me/wublockchainenglish/26751) · [t.me](https://t.me/wublockchainenglish/26769) · [theblock.co](https://www.theblock.co/news/ecosystems/2026-11-09-binance-hack-launderers-mint-homemade-elon-musk-animal-memecoins-move-stolen-funds-elliptic-436440) · [x.com](https://x.com/HypernativeLabs/status/2119843278786842813) |\n| 2026-11-09 | Ankr Bridge | Ethereum, Optimism, Polygon | bridge | $305K | [defillama.com](https://defillama.com/hacks) · [x.com](https://x.com/PeckShieldAlert/status/2119730625695662322) · [x.com](https://x.com/SlowMist_Team/status/2119720284093890615) |\n| 2026-11-09 | Cracked TradingView Premium |  | infra | undisclosed | [x.com](https://x.com/SlowMist_Team/status/2119643046489051354) |\n| 2026-11-08 | Binance | BSC, Ethereum | cex | undisclosed | [cointelegraph.com](https://cointelegraph.com/opinion/285b-binance-hackers-lost-shows-why-uk-needs-stablecoin-freeze-rules?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |\n| 2026-11-08 | ACryptoS | Arbitrum, BSC, Polygon, Base, Optimism | defi | $665K | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-06 | Keplr Wallet (Web3Auth) |  | wallet | $5.6M | [defillama.com](https://defillama.com/hacks) · [theblock.co](https://www.theblock.co/news/defi/2026-11-08-web3auth-says-it-frontran-hackers-by-moving-5-6-million-out-of-exposed-keplr-wallets-436029) |\n| 2026-11-06 | U.S. Department of Justice |  | infra | $2.5M | [t.me](https://t.me/wublockchainenglish/26714) |\n| 2026-11-06 | Chainalysis |  | infra | undisclosed | [t.me](https://t.me/wublockchainenglish/26708) |\n| 2026-11-05 | Binance and Polymarket | Polygon | cex | $6.8M | [cointelegraph.com](https://cointelegraph.com/news/polygon-hard-fork-binance-polymarket-6-8m-hack-recovery?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/wublockchainenglish/26725) |\n| 2026-11-05 | Polymarket and Binance | Polygon | defi | $6.5M | [t.me](https://t.me/wublockchainenglish/26690) |\n| 2026-11-05 | CryptoBilis Ledger | Ethereum | defi | $2.1M | [t.me](https://t.me/lookonchainchannel/10920) |\n| 2026-11-05 | TENDRIL | BSC | defi | $550K | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-05 | SignalPlus |  | infra | $82K | [cointelegraph.com](https://cointelegraph.com/news/binance-deribit-revoke-signalplus-api-fake-teams-attack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |\n| 2026-11-05 | Loopscale Lending | Solana | defi | undisclosed | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-04 | Binance | Bitcoin, Ethereum, BSC, Solana, TRON, THORChain | cex | $124M | [cointelegraph.com](https://cointelegraph.com/interview/trm-labs-binance-hack-interview?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/markets/crypto-market-recovery-grayscale-binance-hack-temporary-setback?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/binance-hackers-move-81-stolen-solana-route-thorchain?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/lookonchainchannel/10903) · [t.me](https://t.me/wublockchainenglish/26644) |\n| 2026-11-04 | MercadoBitcoin |  | other | $18M | [t.me](https://t.me/lookonchainchannel/10908) |\n| 2026-11-03 | Crédit Mutuel Arkéa | Ethereum | cex | $133M | [cointelegraph.com](https://cointelegraph.com/news/credit-mutuel-arkea-resumes-operations-133m-crypto-theft?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/zachxbt-french-bank-credit-mutuel-arkea-133m-crypto-theft?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/investigations/375) · [t.me](https://t.me/wublockchainenglish/26672) · [t.me](https://t.me/wublockchainenglish/26689) |\n| 2026-11-03 | Large financial institution in Western Europe |  | infra | $133M | [t.me](https://t.me/investigations/374) |\n| 2026-11-03 | Unidentified EU financial institution | Ethereum, Monero, USDC | infra | $133M | [cointelegraph.com](https://cointelegraph.com/news/zachxbt-eu-crypto-theft-133m-alleged-cover-up?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |\n| 2026-11-03 | Solana | Solana | chain | $1.5M | [t.me](https://t.me/wublockchainenglish/26669) |\n| 2026-11-03 | Gnosis Pay |  | infra | undisclosed | [cointelegraph.com](https://cointelegraph.com/news/gnosis-pay-breach-exposes-card-details-personal-data-crypto-wallet-information?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/wublockchainenglish/26716) · [theblock.co](https://www.theblock.co/news/defi/2026-11-06-gnosis-pay-data-breach-legacy-debit-card-system-435934) |\n| 2026-11-02 | EU entity | Ethereum | cex | $106M | [t.me](https://t.me/lookonchainchannel/10878) · [t.me](https://t.me/wublockchainenglish/26655) |\n| 2026-11-02 | Mercado Bitcoin | Bitcoin, Ethereum, Solana, TRON, Polygon, Arbitrum, Avalanche, BSC, Stellar, XDC, Base, Optimism | cex | $40M | [cointelegraph.com](https://cointelegraph.com/news/mercado-bitcoin-hack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/mercado-bitcoin-reopening-withdrawals-hack-suspended?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/pix-withdrawals-resume-mercado-bitcoin-hack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [defillama.com](https://defillama.com/hacks) · [t.me](https://t.me/lookonchainchannel/10885) |\n| 2026-11-02 | BitMart | Base, Arbitrum, Optimism, Solana, Ethereum, TRON | cex | $391K | [cointelegraph.com](https://cointelegraph.com/news/bitmart-hack-security-staffing-crypto-exchange-restructuring?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [defillama.com](https://defillama.com/hacks) · [t.me](https://t.me/wublockchainenglish/26676) |\n| 2026-11-02 | GitBook |  | infra | undisclosed | [t.me](https://t.me/wublockchainenglish/26670) |\n| 2026-11-01 | Binance | TRON, Bitcoin, Ethereum, BSC, XRP Ledger, Solana, EVM | cex | undisclosed | [cointelegraph.com](https://cointelegraph.com/magazine/36b-flees-binance-on-reopen-thorchain-co-founder-opposes-coin-freeze-hodlers-digest?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/binance-63b-record-hack-sparks-pre-election-political-chatter?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/binance-net-outflows-surge-to-58b-as-withdrawals-resume-after-record-hack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/news/north-korea-denies-role-in-63b-binance-hack-points-finger-at-us?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/lookonchainchannel/10862) |\n| 2026-11-01 | European entity | Ethereum, Solana, Monero | cex | $106M | [cointelegraph.com](https://cointelegraph.com/news/zachxbt-flags-suspected-106m-crypto-theft-as-solana-bot-faces-possible-786k-drain?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |\n| 2026-11-01 | Relay Protocol |  | bridge | $38M | [t.me](https://t.me/wublockchainenglish/26638) |\n| 2026-11-01 | Sovryn Dex | Rootstock | defi | $539K | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-01 | PremiaLabs | Arbitrum, Ethereum | defi | $465K | [x.com](https://x.com/PeckShieldAlert/status/2116758393067340132) |\n| 2026-11-01 | Premia V3 | Arbitrum | defi | $437K | [defillama.com](https://defillama.com/hacks) |\n| 2026-11-01 | BTCPay Server | Bitcoin, Litecoin | wallet | undisclosed | [defillama.com](https://defillama.com/hacks) |\n| 2026-10-31 | Sovryn Lend | Rootstock | defi | $914K | [defillama.com](https://defillama.com/hacks) |\n| 2026-10-31 | Troves |  | defi | $667K | [defillama.com](https://defillama.com/hacks) |\n| 2026-10-31 | Name.com |  | infra | $138K | [theblock.co](https://www.theblock.co/news/defi/2026-10-31-hackers-hijack-a-dozen-defi-websites-all-registered-with-name-com-and-steal-about-138000-432251) |\n| 2026-10-31 | b14g | CORE | defi | undisclosed | [defillama.com](https://defillama.com/hacks) |\n| 2026-10-31 | Chainalysis |  | infra | undisclosed | [cointelegraph.com](https://cointelegraph.com/news/chainalysis-cyberattack-password-hashes-live-tokens-exposed?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [t.me](https://t.me/wublockchainenglish/26632) · [theblock.co](https://www.theblock.co/news/business/2026-10-31-chainalysis-says-hacker-using-offensive-agentic-techniques-accessed-its-customers-names-and-emails-432244) |\n| 2026-10-31 | Flap and Kintsu |  | defi | undisclosed | [t.me](https://t.me/wublockchainenglish/26628) |\n| 2026-10-31 | THORChain | Ethereum, THORChain | bridge | undisclosed | [t.me](https://t.me/wublockchainenglish/26635) |\n| 2026-10-30 | Pando Rings | Ethereum | defi | $17M | [t.me](https://t.me/lookonchainchannel/10843) · [t.me](https://t.me/lookonchainchannel/10876) |\n| 2026-10-30 | Minnesota family |  | wallet | $8.0M | [theblock.co](https://www.theblock.co/news/regulation/2026-10-30-texas-brothers-sentenced-15-years-8-million-crypto-robbery-minnesota-432221) |\n| 2026-10-30 | Arbitrum | Arbitrum | chain | undisclosed | [t.me](https://t.me/wublockchainenglish/26612) |\n| 2026-10-29 | Binance CEX | Ethereum, Bitcoin, TRON, Avalanche, Optimism, Arbitrum, Base, BSC, THORChain, 10 blockchains, Solana | cex | undisclosed | [cointelegraph.com](https://cointelegraph.com/magazine/binance-hackers-raced-to-move-billions-before-could-be-frozen?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/markets/analysts-no-contagion-effect-63b-binance-hack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/markets/binance-hack-rattles-crypto-markets-bnb-bitcoin-slide?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/markets/bitcoin-binance-hack-strive-ceo?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [cointelegraph.com](https://cointelegraph.com/markets/rune-token-surges-binance-hack?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |\n| 2026-10-29 | Aave | Ethereum | defi | $45M | [t.me](https://t.me/wublockchainenglish/26620) |\n| 2026-10-29 | Polymarket International | Polygon | other | $2.7M | [cointelegraph.com](https://cointelegraph.com/news/polymarket-suspends-trading-user-funds-compromised?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) · [defillama.com](https://defillama.com/hacks) · [web3isgoinggreat.com](https://web3isgoinggreat.com/single/polymarket-vendor-exploit-2) · [theblock.co](https://www.theblock.co/news/defi/2026-10-29-polymarket-exploit-2-5-million-cancel-only-mode-432158) |\n| 2026-10-28 | zkLink Nova | Ethereum, Linea | bridge | $783K | [defillama.com](https://defillama.com/hacks) · [x.com](https://x.com/SlowMist_Team/status/2116523371911692616) |\n| 2026-10-28 | Coinbase |  | cex | undisclosed | [cointelegraph.com](https://cointelegraph.com/news/coinbase-analytics-provider-customer-data?utm_source=rss_feed&utm_medium=rss_tag_hacks&utm_campaign=rss_partner_inbound) |"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Severe infrastructure outages, last 7 days","url":"https://nodely.io/ariadne/","text":"| Start | Provider | Affected | Region | Duration | Impact | Sources |\n| --- | --- | --- | --- | --- | --- | --- |\n| 2026-11-10 16:10 UTC | GitHub | Pull Requests, Actions |  | 104 min | critical | [stspg.io](https://stspg.io/16nsnk2th3rv) |\n| 2026-11-10 13:55 UTC | IODA | bgp | VE, country/VE | 4 h | minor | [ioda.inetintel.cc.gatech.edu](https://ioda.inetintel.cc.gatech.edu/country/VE?from=1794315300&until=1794338238) |\n| 2026-11-10 08:30 UTC | IODA | bgp | asn/63023 | ongoing | major | [ioda.inetintel.cc.gatech.edu](https://ioda.inetintel.cc.gatech.edu/asn/63023) |\n| 2026-11-09 18:08 UTC | Cloudflare Radar BGP | BGP hijack | US, CN, 45.74.21.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=171650) |\n| 2026-11-09 04:45 UTC | Cloudflare Radar | traffic anomaly, HTTP, NET, DNS | IQ, asn/48492 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/traffic/as48492) |\n| 2026-11-07 11:06 UTC | Cloudflare Radar BGP | BGP hijack | US, NL, 80.174.202.0/24, 80.174.205.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=171209) |\n| 2026-11-05 11:46 UTC | Cloudflare Radar BGP | BGP hijack | US, 165.140.92.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170917) |\n| 2026-11-05 11:45 UTC | Cloudflare Radar BGP | BGP hijack | US, 165.140.92.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170918) |\n| 2026-11-05 07:55 UTC | IODA | bgp | asn/23470 | ongoing | major | [ioda.inetintel.cc.gatech.edu](https://ioda.inetintel.cc.gatech.edu/asn/23470) |\n| 2026-11-05 02:53 UTC | Cloudflare Radar BGP | BGP hijack | FR, HK, US, 62.105.192.0/24, 62.105.195.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170854) |\n| 2026-11-04 20:30 UTC | IODA | gtr | CN, country/CN | 6 days | major | [ioda.inetintel.cc.gatech.edu](https://ioda.inetintel.cc.gatech.edu/country/CN?from=1793820600&until=1794338238) |\n| 2026-11-04 08:11 UTC | Cloudflare Radar BGP | BGP hijack | CZ, GB, 45.206.5.0/24, 154.83.246.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170735) |\n| 2026-11-03 11:01 UTC | Cloudflare Radar BGP | BGP hijack | GB, 103.17.203.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170583) |\n| 2026-11-03 05:59 UTC | Cloudflare Radar BGP | BGP hijack | IN, UA, GB, 45.196.208.0/24, 104.234.196.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170334) |\n| 2026-11-02 17:12 UTC | Cloudflare Radar BGP | BGP hijack | ID, US, 102.129.168.0/24 | ongoing | major | [radar.cloudflare.com](https://radar.cloudflare.com/routing/hijacks?event=170459) |\n| 2025-08-05 16:00 UTC | ISOC Pulse | Mobile Internet Services | PK, Balochistan | ongoing | major | [pulse.internetsociety.org](https://pulse.internetsociety.org/shutdowns) |\n| 2025-02-18 11:00 UTC | ISOC Pulse | regional | IQ, Kurdistan | ongoing | major | [pulse.internetsociety.org](https://pulse.internetsociety.org/shutdowns) |\n| 2024-11-15 00:00 UTC | ISOC Pulse | Mobile Internet Services | PK, Baluchistan | ongoing | major | [pulse.internetsociety.org](https://pulse.internetsociety.org/shutdowns) |\n\n03 / GET ARIADNE"}
{"id":"/ariadne/","title":"Ariadne: Algorand investigations and threat intel","markdownUrl":"https://nodely.io/ariadne.md","heading":"Available to Nodely commercial customers","url":"https://nodely.io/ariadne/#ariadne-tiers","text":"Tell us what you need to watch, and we will set Ariadne up for your team.\n\n[Contact us about Ariadne ↗](https://nodely.io/contact?subject=Ariadne)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"Blog — page 2","url":"https://nodely.io/blog/2/","text":"[All posts](https://nodely.io/blog)[Categories](https://nodely.io/categories)[Tags](https://nodely.io/tags)\n\n[\n\n![Algorand key registration guide](https://nodely.io/_astro/algotools.DPzxZ9gN_Z24OLOx.webp)\n\n](https://nodely.io/blog/algorand-key-reg/)\n\nDec 1, 2024[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[Algorand key registration guide](https://nodely.io/blog/algorand-key-reg/)","url":"https://nodely.io/blog/2/","text":"Step-by-step guide to submitting an Algorand participation key registration with algotools.org, and when to use it for staking with your own node.\n\n[\n\n![Algorand native staking F.A.Q.](https://nodely.io/_astro/nodefaq.Dl9_LANF_ZkrmV3.webp)\n\n](https://nodely.io/blog/algorand-node-running-faq/)\n\nDec 1, 2024[FAQ](https://nodely.io/categories/FAQ)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[Algorand native staking F.A.Q.](https://nodely.io/blog/algorand-node-running-faq/)","url":"https://nodely.io/blog/2/","text":"FAQ on native Algorand staking with your own node: who it suits, hardware, participation keys, rewards eligibility and common node runner questions.\n\n[\n\n![Algorand Incentives pre-Guide](https://nodely.io/_astro/incentives_1.DDL0se7a_ZIbLzT.webp)\n\n](https://nodely.io/blog/algorand-staking-guide/)\n\nMar 1, 2024[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[Algorand Incentives pre-Guide](https://nodely.io/blog/algorand-staking-guide/)","url":"https://nodely.io/blog/2/","text":"How Algorand staking and consensus participation work, and how node runners and stakers can prepare for incentivized participation in 2024.\n\n[\n\n![Algorand transaction performance](https://nodely.io/_astro/tps_1.D8kmy8FR_ZEL3bV.webp)\n\n](https://nodely.io/blog/algorand-transaction-performance/)\n\nDec 29, 2023[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[Algorand transaction performance](https://nodely.io/blog/algorand-transaction-performance/)","url":"https://nodely.io/blog/2/","text":"Algorand transaction throughput in theory and practice: the protocol constants that cap TPS, and how to calculate maximum transactions per second.\n\n[\n\n![To VRF or not to Vote?](https://nodely.io/_astro/vrf_1.DCY5UJcf_Vmq2E.webp)\n\n](https://nodely.io/blog/to-vrf-or-not-to-vote/)\n\nSep 25, 2023[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[To VRF or not to Vote?](https://nodely.io/blog/to-vrf-or-not-to-vote/)","url":"https://nodely.io/blog/2/","text":"How Algorand's VRF-based consensus decides when your node proposes blocks or votes on behalf of your account, and what affects selection.\n\n[\n\n![Calculating balances on Algorand](https://nodely.io/_astro/balances_1.uJ8poOfm_er4Jh.webp)\n\n](https://nodely.io/blog/calulating-algo-balances/)\n\nJul 28, 2022[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/2/","title":"Blog — page 2","markdownUrl":"https://nodely.io/blog/2.md","heading":"[Calculating balances on Algorand](https://nodely.io/blog/calulating-algo-balances/)","url":"https://nodely.io/blog/2/","text":"Using SQL and TX history to get a balance snapshot at any point in time."}
{"id":"/blog/3/","title":"Blog — page 3","markdownUrl":"https://nodely.io/blog/3.md","heading":"Blog — page 3","url":"https://nodely.io/blog/3/","text":"[All posts](https://nodely.io/blog)[Categories](https://nodely.io/categories)[Tags](https://nodely.io/tags)\n\n[\n\n![Data mining Algorand for participating accounts](https://nodely.io/_astro/data_1.VkBCmceM_wY3A5.webp)\n\n](https://nodely.io/blog/data-mining-4-participating-accounts/)\n\nJul 23, 2022[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/3/","title":"Blog — page 3","markdownUrl":"https://nodely.io/blog/3.md","heading":"[Data mining Algorand for participating accounts](https://nodely.io/blog/data-mining-4-participating-accounts/)","url":"https://nodely.io/blog/3/","text":"Using SQL over Algorand transaction history to count and plot online participating accounts and the stake that secures consensus over time.\n\n[\n\n![Token decentralization on Algorand](https://nodely.io/_astro/tokens_1.DNB_57Hx_Z1rL66o.webp)\n\n](https://nodely.io/blog/token-decentralization/)\n\nJul 23, 2022[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/3/","title":"Blog — page 3","markdownUrl":"https://nodely.io/blog/3.md","heading":"[Token decentralization on Algorand](https://nodely.io/blog/token-decentralization/)","url":"https://nodely.io/blog/3/","text":"Let’s have some fun and use state-of-the-art methods to measure the decentralization index of various tokens on Algorand."}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Time travel on our public Algorand API, powered by dt-algorand","url":"https://nodely.io/blog/algorand-api-time-travel/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Time travel on our public Algorand API, powered by dt-algorand](https://nodely.io/_astro/hero.Cxd6YLq2_Z19YfwX.webp)"}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Time travel on our public Algorand API, powered by dt-algorand","url":"https://nodely.io/blog/algorand-api-time-travel/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nNov 6, 2026\n\nUpdated Nov 10, 2026\n\n[services](https://nodely.io/categories/services)\n\n [Watch the video (MP4)](https://media.algo.green/v/share/community-firmware-r2-1280.mp4)\n\nOur [public Algorand API](https://nodely.io/docs/free/start) answers questions about the past. Add `?round=` to a read and you get the ledger as it stood at the end of that round. It works on MainNet and TestNet, with no key. It is free for now: from 1 January 2027, MainNet history needs a paid plan ([Boost, Unlimited or Enterprise](https://nodely.io/pricing)), and TestNet stays free.\n\nThe answers come from nodes running [dt-algorand](https://github.com/d13co/dt-algorand), D13’s community fork of go-algorand. Its README describes “a node that keeps the value of every account, asset, app and box at every round since genesis, and serves the REST API and transaction simulation at any past round”."}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"What you can do with it","url":"https://nodely.io/blog/algorand-api-time-travel/#what-you-can-do-with-it","text":"Each section below has commands you can paste. You need `curl` and `jq`, and `xxd` for the sixteen rounds. There is no key, and nothing here signs or sends a transaction. Every output is real, from 2026-11-06. Paste the blocks in order into one shell: later blocks reuse `$API` and `$CALL`."}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Read the chain at any past round","url":"https://nodely.io/blog/algorand-api-time-travel/#read-the-chain-at-any-past-round","text":"Ask for an asset, account, app or box as it stood at a given round. USDC was created at round 8,874,561, on 2020-09-04 at 20:49 UTC. One round earlier, the asset does not exist.\n\n```sh\nAPI=https://mainnet-api.4160.nodely.dev\n\ncurl -s -w 'HTTP %{http_code}\\n' \"$API/v2/assets/31566704?round=8874560\"\n# {\"message\":\"asset does not exist\"}\n# HTTP 404\n\ncurl -s -w 'HTTP %{http_code}\\n' \"$API/v2/assets/31566704?round=8874561\"\n# {\"index\":31566704,\"params\":{\"creator\":\"2UEQTE5QDNXPI7M3TU44G6SYKLFWLPQO7EBZM7K7MHMQQMFI4QJPLHQFHM\",\"decimals\":6,\"default-frozen\":false,\"freeze\":\"3ERES6JFBIJ7ZPNVQJNH2LETCBQWUPGTO4ROA6VFUR25WFSYKGX3WBO5GE\",\"manager\":\"37XL3M57AXBUJARWMT5R7M35OERXMH3Q22JMMEFLBYNDXXADGFN625HAL4\",\"name\":\"USDC\",\"name-b64\":\"VVNEQw==\",\"reserve\":\"2UEQTE5QDNXPI7M3TU44G6SYKLFWLPQO7EBZM7K7MHMQQMFI4QJPLHQFHM\",\"total\":18446744073709551615,\"unit-name\":\"USDC\",\"unit-name-b64\":\"VVNEQw==\",\"url\":\"https://www.centre.io/usdc\",\"url-b64\":\"aHR0cHM6Ly93d3cuY2VudHJlLmlvL3VzZGM=\"}}\n# HTTP 200\n\ncurl -s \"$API/v2/assets/31566704/versions\"\n# {\"round\":66706337,\"versions\":[{\"deleted\":false,\"round\":8874561,\"timestamp\":1599252577}]}\n```\n\nIn `/versions`, the outer `round` is the latest round when you ask. A stock node ignores `round` and answers as of the latest round, so dt-algorand marks its answers:\n\n```sh\ncurl -s -D - -o /dev/null \"$API/v2/assets/31566704?round=8874561\" | grep -i x-algod-tt-round\n# x-algod-tt-round: 8874561\n```"}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Dry-run a transaction in the past","url":"https://nodely.io/blog/algorand-api-time-travel/#dry-run-a-transaction-in-the-past","text":"`POST /v2/transactions/simulate` takes a `round`. Nothing is signed, sent or committed. For example, you can pay 1,000 ALGO into the Tinyman v2 ALGO/USDC pool at round 40,000,000 and call its swap, from a stand-in account. The answer is 134.710140 USDC out, run on 2026-11-06.\n\nA smaller example you can paste: whether the fee sink could opt in to USDC at the same two rounds, with no signature.\n\n```sh\nfor R in 8874560 8874561; do\n  curl -s \"$API/v2/transactions/simulate\" -H 'Content-Type: application/json' -d '{\n    \"round\": '$R',\n    \"allow-empty-signatures\": true,\n    \"txn-groups\": [{\"txns\": [{\"txn\": {\n      \"type\": \"axfer\", \"xaid\": 31566704, \"fee\": 1000, \"fv\": 8874000, \"lv\": 8874999,\n      \"snd\": \"Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA\",\n      \"arcv\": \"Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA\",\n      \"gen\": \"mainnet-v1.0\",\n      \"gh\": \"wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=\"\n    }}]}]\n  }' | jq -c '{round: .[\"last-round\"], failure: .[\"txn-groups\"][0][\"failure-message\"]}'\ndone\n# {\"round\":8874560,\"failure\":\"transaction 45TZNH7OSHMFCSASPJ5VATZLO5RBAKVKO6QUXQHF6UCTJHYXKCUQ: asset 31566704 does not exist or has been deleted\"}\n# {\"round\":8874561,\"failure\":null}\n```"}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Run one query across many rounds","url":"https://nodely.io/blog/algorand-api-time-travel/#run-one-query-across-many-rounds","text":"`POST /v2/query` runs one read-only program at many rounds in a single request. Sixteen is today’s limit for one request, as `GET /v2/capabilities` reports. This program works out what 1,000 ALGO would fetch at the same pool, every 2,500,000 rounds from 28.5 M to 66 M. Each figure is computed from the pool’s state at that round: no trade took place, and it is not a forecast.\n\nThe output is in microunits, with lines cut here for length.\n\n```sh\nCALL='{\"accounts\":[\"2PIFZW53RHCSFSYMCFUBW4XOCXOMB7XOYQSQ6KGT3KVGJTL4HM6COZRNMM\"],\"foreign-apps\":[1002541853]}'\nSWAPOUT=DDYcAYGdpobeA4AQYXNzZXRfMl9yZXNlcnZlc2NINQA2HAGBnaaG3gOAEGFzc2V0XzFfcmVzZXJ2ZXNjSDUBNhwBgZ2mht4DgA90b3RhbF9mZWVfc2hhcmVjSDUCgYCU69wDNAILgY9OCIGQTgo1A4GAlOvcAzQDCTUENAQ0AR00ADQECJcWsIEBQw==\nROUNDS=28500000,31000000,33500000,36000000,38500000,41000000,43500000,46000000,48500000,51000000,53500000,56000000,58500000,61000000,63500000,66000000\n\ncurl -s \"$API/v2/query\" -H 'Content-Type: application/json' \\\n  -d '{\"program\":\"'$SWAPOUT'\",\"calls\":['$CALL'],\"rounds\":['$ROUNDS']}' \\\n  | jq -r '.rounds[] | \"\\(.round) \\(.calls[0].logs[0])\"' \\\n  | while read R V; do echo \"$R $(( 0x$(echo $V | base64 -d | xxd -p) ))\"; done\n# 28500000 197796800\n# 31000000 106770062\n# ...\n# 63500000 81627916\n# 66000000 107496929\n```\n\nWe timed seven runs of each on 2026-11-06, from our workstation: the read at round 8,874,561 took 0.15 to 0.22 s, the sixteen-round query 0.15 to 0.20 s."}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Run new code against old state","url":"https://nodely.io/blog/algorand-api-time-travel/#run-new-code-against-old-state","text":"`POST /v2/query` can also run an old round under later rules, “as if an upgrade to it had taken effect right after that round”. At round 27,000,000 a 66-byte AVM 12 program is refused under `\"protocol\": \"round\"`, because that round only supports version 8. Under `\"protocol\": \"latest\"` it runs and logs the pool’s two reserves. The answer also lists what changed: 24 consensus parameters, `EnablePQSchemeFalcon1024` among them.\n\nThe two logs below are big-endian integers in microunits: 5,069,191.410026 ALGO and 1,279,872.455062 USDC.\n\n```sh\nRESERVES=DDYcAYGdpobeA4AQYXNzZXRfMl9yZXNlcnZlc2NIFrA2HAGBnaaG3gOAEGFzc2V0XzFfcmVzZXJ2ZXNjSBawgQFD\n\nfor P in round latest; do\n  curl -s \"$API/v2/query\" -H 'Content-Type: application/json' \\\n    -d '{\"program\":\"'$RESERVES'\",\"calls\":['$CALL'],\"rounds\":[27000000],\"protocol\":\"'$P'\"}' \\\n    | jq -c '.rounds[0].calls[0]'\ndone\n# {\"cost\":0,\"error\":\"check failed on ApprovalProgram: program version 12 greater than protocol supported version 8\",\"logs\":[]}\n# {\"cost\":16,\"logs\":[\"AAAEnENacWo=\",\"AAABKf5X0ZY=\"]}\n```"}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"What to know before you rely on it","url":"https://nodely.io/blog/algorand-api-time-travel/#what-to-know-before-you-rely-on-it","text":"dt-algorand is a community fork, not an official Algorand release. In the README’s words: “It changes no consensus rule, but it is not an official Algorand release: the node answers questions a standard node cannot, and some historical answers are approximations”.\n\n-   **Approximations.** One of the [limitations in the time travel README](https://github.com/d13co/dt-algorand/blob/dtalgorand/ledger/timetravel/README.md#limitations): “Simulating at an old round detects duplicate txids and leases only against transactions still in the txtail (about the last 1,000 rounds), and knocks offline only the absent or expired accounts the simulated transactions touch.”\n-   **No future.** A round not written yet is refused. The read answers 400 and simulate 500. The README says: “Block headers after R can’t be read, as on chain, where block R+1 isn’t there yet”.\n-   **Removed options.** dt-algorand v5.0.5-dt5, live on our API on 2026-11-06 at 08:11 UTC (09:11 CET), removed simulate’s `rounds`, `rewrite-validity-window` and `protocol`. They now answer 400 and point to `POST /v2/query`. Simulate at a single `round` still works.\n-   **Not for validators.** The repo’s main README says “the fork is not audited for running validators”, so on mainnet, testnet and betanet the node refuses participation keys unless its config says otherwise.\n-   **Not the Analytics DB.** Our [pricing page](https://nodely.io/pricing) lists “Time travel to any block height” under Analytics DB. That is a separate product."}
{"id":"/blog/algorand-api-time-travel/","title":"Time travel on our public Algorand API, powered by dt-algorand","markdownUrl":"https://nodely.io/blog/algorand-api-time-travel.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Who built it","url":"https://nodely.io/blog/algorand-api-time-travel/#who-built-it","text":"The fork is D13’s, and the credit is theirs. You may know D13 from the explorers Algo.Surf and Flow. On mainnet the history takes about 70 GB, and a node that keeps it can prune about 3.5 TB of old block bodies and certificates. The code is open source and anyone can run it. We run it for you on our public API.\n\n[#API](https://nodely.io/tags/API)[#Algorand](https://nodely.io/tags/Algorand)[#dt-algorand](https://nodely.io/tags/dt-algorand)[#time-travel](https://nodely.io/tags/time-travel)[#simulate](https://nodely.io/tags/simulate)"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand key registration guide","url":"https://nodely.io/blog/algorand-key-reg/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand key registration guide](https://nodely.io/_astro/algotools.DPzxZ9gN_Z24OLOx.webp)"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand key registration guide","url":"https://nodely.io/blog/algorand-key-reg/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nDec 1, 2024\n\n[guides](https://nodely.io/categories/guides)\n\n* * *"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand key registration","url":"https://nodely.io/blog/algorand-key-reg/#algorand-key-registration","text":"Using algotools.org to submit key-registration"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"When to use this guide?","url":"https://nodely.io/blog/algorand-key-reg/#when-to-use-this-guide","text":"This guide is for cases where your private keys are not stored (👍) on your node, but you can sign transactions using either Lute, Defly, or Pera wallets. Please have a Linux or Mac node synced up and running before following this guide. You will also need an Algorand wallet (account) with a few Algo in it. Any amount greater than 1 Algo will do.  \nIf your node is syncing for quite some time and there is no end to it in sight consider the [Fast Catchup](https://developer.algorand.org/docs/run-a-node/setup/install/#sync-node-network-using-fast-catchup) procedure that should take around 2hrs to sync your non-archival node.\n\n> This guide will be obsolete once the algorun-tui node interface is released along with QR code keyreg signing support in above wallets."}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Why is this needed?","url":"https://nodely.io/blog/algorand-key-reg/#why-is-this-needed","text":"Key registration is needed to make your account (wallet address) participate in Algorand block validation. Once you generate and install participation keys on your node, you need to register them and repeat the procedure before they expire. This way your node can vote on your behalf without having access to your private keys outside of the registration process.\n\nThis guide will use [https://algotools.org](https://algotools.org/) transaction creator to help with the process."}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Participation key preparation","url":"https://nodely.io/blog/algorand-key-reg/#participation-key-preparation","text":"Make sure your node is all synced up to the mainnet tip. Check the output for “Sync Time”. It needs to read 0.0s and “Time since last block” needs to be below a few seconds. Notice the “Last committed block” value needed for the next step.\n\n```bash\ngoal node status\n\n#Last committed block: 44702136\n#Time since last block: 0.7s\n#Sync Time: 0.0s\n#Genesis ID: mainnet-v1.0\n```\n\nNow generate a participation key. Skip this step if you already have it generated.\n\n```bash\ngoal account addpartkey \\\n-a YOUR0PUBLIC0WALLET0ADDRESS0WHERE0YOU0STORE0YOUR0ALGOZZZZZZ \\\n--roundFirstValid 999999999 \\\n--roundLastValid 000000000\n\n#Please stand by while generating keys. This might take a few minutes...\n#Participation key generation successful.\n#Participation ID: IGPSIN77LODAYCPWSR6OV6DLVQKIESEQ2CL34BGYESOVAKPRNV2A\n```\n\nProvide your account (wallet) public address as well as first and last round of the key validity period instead of 999999999/000000000:\n\n-   roundFirstValid is the “last committed block” value from the node status\n-   roundLastValid = roundFirstValid + 1000000\n\nAdding 1M will give you around a month before the key expires."}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Participation key registration","url":"https://nodely.io/blog/algorand-key-reg/#participation-key-registration","text":"Now you need all the information on the participation key\n\n```bash\n# goal account partkeyinfo\nDumping participation key info from /node/data...\n\nParticipation ID:          IGPSIN77LODAYCPWSR6OV6DLVQKIESEQ2CL34BGYESOVAKPRNV2A\nParent address:            YKTO4C2WAC2BSMJMYKM43YCGUYHU3XHAHAYG6UUSF3BLOF6VMGRXKYB7ZU\nFirst round:               44702137\nLast round:                45702137\nKey dilution:              1001\nSelection key:             1WTINWXR8i7KfPAn+/E6VUfiYR7dKvDS4QnWhf/scFU=\nVoting key:                73MByLYDxMuzMixfWi/s4vY8p8XuhW5ebzyYg2u1eNo=\nState proof key:           GMrATdBKHeV0utHDs11jt8yQgJS0JP8Yg4sn/o+1EiBevO6jyNRC7/LeyZVY1xYqy3Y4eBpgqc7N5N+SP+ldWw==\n```\n\nPick the one that you generated in the previous step and go to [https://algotools.org](https://algotools.org/) and connect your wallet.\n\n![](https://cdn-images-1.medium.com/max/800/1*yGPw9bjKnKD4ucwu5pkuWw.png)\n\nNow choose the “Compose Transaction” and pick “Key Registration” for the transaction type. Copy all the details of your Participation Key to the form.  \nData provided in the form is public in nature and will be stored openly on the chain. The AlgoTools site is just composing the transaction for you.\n\nYou can copy paste the all the fields at once like here:\n\n![](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Y45w-MfseNd4h1Ogd0vK6A.gif)\n\n> The whole process does not expose your private keys. Signed participation keys only have voting power and no spending rights.\n\n![](https://cdn-images-1.medium.com/max/800/1*PuSfmHnQHfc_v-tTmMNLjQ.png)\n\nAfter you press send and sign the transaction, go back to your node to check if it sees the registration.\n\n```bash\n# goal account listpartkeys\nRegistered  Account      ParticipationID   Last Used  First round  Last round\nyes         YKTO...B7ZU  IGPSIN77...             N/A     44702137    45702137\n```\n\nThe registered column should read “yes” 👏 👏 👏"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Fun fact","url":"https://nodely.io/blog/algorand-key-reg/#fun-fact","text":"Your participation key is actually a bundle of thousands of quantum-resistant Falcon keys. They provide Algorand with unique features:\n\n-   No future quantum computer can falsify Algorand history\n-   No amount of node runners can collude to roll back the chain\n\n* * *"}
{"id":"/blog/algorand-key-reg/","title":"Algorand key registration guide","markdownUrl":"https://nodely.io/blog/algorand-key-reg.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Next steps","url":"https://nodely.io/blog/algorand-key-reg/#next-steps","text":"-   Go and register for participation alerts at [Allo Alerts](https://alerts.allo.info/)\n\n[![](https://cdn-images-1.medium.com/max/800/1*lDElbaSV7_ShkBx5sFDIyA.png)](https://alerts.allo.info/)\n\nAllo Alerts participation monitoring\n\n-   Consider monitoring your node with free telemetry service from [Nodely](https://nodely.io/docs/telemetry/quickstart)  \n    Built into Algorand node, no port forwarding is needed.\n\n[![](https://cdn-images-1.medium.com/max/800/1*wN6EDMa4chJdnc_T5wGo_g.png)](https://nodely.io/docs/telemetry/quickstart)\n\nNode(ly) telemetry service\n\n-   [Go and read](https://medium.com/nodely/to-vrf-or-not-aabccbe3bd25) why your node will only start voting after 320 rounds into the registration.\n\n[#guide](https://nodely.io/tags/guide)[#node](https://nodely.io/tags/node)[#incentives](https://nodely.io/tags/incentives)[#Algorand](https://nodely.io/tags/Algorand)[#staking](https://nodely.io/tags/staking)"}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Algorand node counting","url":"https://nodely.io/blog/algorand-node-counting/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand node counting](https://nodely.io/_astro/birds.CJX7Jazq_Z2q00np.webp)"}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Algorand node counting","url":"https://nodely.io/blog/algorand-node-counting/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nMay 16, 2025\n\n[article](https://nodely.io/categories/article)\n\n* * *"}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Intro","url":"https://nodely.io/blog/algorand-node-counting/#intro","text":"One of the most challenging aspects of analyzing decentralized blockchain networks is accurately determining their size and distribution. Unlike centralized systems, where all participants are registered and known, blockchain networks consist of voluntary, pseudonymous nodes that can join or leave the network at any time. This creates significant challenges for researchers, network analysts, and the blockchain community who need reliable metrics about network composition.\n\nThis article explores a new approach to estimating the total number of full-time node equivalents in the Algorand blockchain by applying ecological sampling techniques — specifically, the Chao-1 estimator — using relay nodes as observation points. This methodology draws interesting parallels between biodiversity sampling in ecology and node discovery in distributed networks."}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Counting the nodes the old way","url":"https://nodely.io/blog/algorand-node-counting/#counting-the-nodes-the-old-way","text":"As of Q2’25, Algorand does not yet operate as a fully meshed P2P network and uses designated relays to propagate gossip messages. Each node maintains websocket connections to four relays at a time. The connection that has the highest cumulative buffering delay is designated to be replaced with a new, random one every four minutes.\n\nThe original node counting method assumed that all nodes have somewhat static IP addresses and connect to the network using the default behaviour. A simple, unique IP count over 24-hour period across a sample of relays (observers) proved to be a good node count estimator.\n\nWith the influx of home nodes with ephemeral IP addresses as well as short-lived liquidator bot connections, the unique node count exploded in 2024, and especially in 2025 after the incentives program went live."}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"The challenge","url":"https://nodely.io/blog/algorand-node-counting/#the-challenge","text":"The simplest solution would be to change the time 24-hour window and count unique nodes within shorter, 1-hour intervals. This approach, however, introduces new challenges:\n\n-   Short-lived bot connections account for a significant number of unique nodes and have high time-of-day variability.\n-   Nodes might not have enough time to randomly “hit” a designated set of observers, making the node counting highly dependent on the number of relays used for monitoring.\n\n![](https://cdn-images-1.medium.com/max/800/1*_Gty2gm4hKlI3L-d51is2w.png)\n\nA unique node count no longer provides a meaningful number in the context of a network load or environmental impact (power consumption)."}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"The new approach","url":"https://nodely.io/blog/algorand-node-counting/#the-new-approach","text":"Let’s adopt a new KPI that counts full-time node equivalents instead of just counting ephemeral nodes. Such an indicator would more closely represent the actual size of the network and its environmental impact.\n\nThis can be solved by using a 7-day moving average of the hourly samples.\n\nAccounting for a small or variable number of observers (relays) is a more complicated problem, similar to one that ecology researchers face when trying to estimate the total number of species in an environment without being able to count every individual. They’ve developed sophisticated statistical methods to estimate total population size based on limited samples. One such method is the Chao-1 estimator developed by Anne Chao and described in [Non-parametric estimation of the classes in a population](https://www.researchgate.net/publication/268975118_Non-parametric_estimation_of_the_classes_in_a_population) and [Estimating the Population Size for Capture-Recapture Data with Unequal Catchability](https://www.researchgate.net/publication/19729500_Estimating_the_Population_Size_for_Capture-Recapture_Data_with_Unequal_Catchability)\n\nThe Chao-1 estimator provides a way to estimate the total number of species in a community based on the number of rare species found in a sample. The formula that allows for the calculation of the lower bound of a population size is elegantly simple:\n\n![](https://cdn-images-1.medium.com/max/800/1*NXG-fyjSfWaGtJcUZPzP8g.png)\n\nWhere **S**obs is the number of species (unique nodes) in the Sample,  \n**F**1 is the number of singletons (unique nodes seen by a one relay only),  \n**F**2 is the number of dubletons (unique nodes seen by two relays only).\n\nThis approach allows for a good lower bound estimate that does not depend on the number of observers (relays)."}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Methodolgy","url":"https://nodely.io/blog/algorand-node-counting/#methodolgy","text":"Our approach adapts the Chao-1 estimator as well as sample filtering and averaging to the context of blockchain node counting:\n\n1.  **Observation Points**: We select a limited number of relay nodes to serve as our “observation stations.” These relays are geographically distributed to minimize regional bias.\n2.  **Data Collection**: Each relay node logs every IP address that connects to it over a one-hour period. This becomes our sampling interval. IP address information is stored as salted hashes for GDPR compliance.\n3.  **Data Filtering:** We ignore nodes that fail to maintain a gossip connection for over a minute to mitigate Sybil attacks.\n4.  **Frequency Analysis**: We analyze how many unique IP hashes were seen by exactly one relay, exactly two relays, and so on.\n5.  **Application of Chao-1**: We apply the Chao-1 formula to the intervals to account for the limited number of observers.\n6.  **Temporal Analysis**: We repeat this process for multiple one-hour windows to account for time-of-day variations in network activity. We apply a 7-day sliding average over the 1-hour node count estimates.\n\n![](https://cdn-images-1.medium.com/max/800/1*cg57wsRbD7rkiwk9hPxmFA.png)"}
{"id":"/blog/algorand-node-counting/","title":"Algorand node counting","markdownUrl":"https://nodely.io/blog/algorand-node-counting.md","updatedAt":"2025-05-16T00:00:00.000Z","heading":"Limitations and Considerations","url":"https://nodely.io/blog/algorand-node-counting/#limitations-and-considerations","text":"This methodology has several limitations that should be considered:\n\n1.  **IP Address ≠ Node**: An IP address is not necessarily a 1:1 mapping to a node. Some nodes may share IP addresses (if behind NAT or CGNAT).\n2.  **Dynamic IPs**: Some nodes may change their IP addresses more frequently than 1 hour, eg, due to link issues.\n3.  **Hidden Nodes**: Nodes configured to connect to private relays would be undercounted.\n4.  **Sybil Attacks**: The network may contain artificially created nodes that could skew the estimate.\n5.  **Relay Selection Bias**: The choice of relay nodes for observation may introduce bias if they are not representative of the overall network.\n\n[#article](https://nodely.io/tags/article)[#node](https://nodely.io/tags/node)[#network](https://nodely.io/tags/network)[#Algorand](https://nodely.io/tags/Algorand)[#statistics](https://nodely.io/tags/statistics)"}
{"id":"/blog/algorand-node-running-faq/","title":"Algorand native staking F.A.Q.","markdownUrl":"https://nodely.io/blog/algorand-node-running-faq.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand native staking F.A.Q.","url":"https://nodely.io/blog/algorand-node-running-faq/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand native staking F.A.Q.](https://nodely.io/_astro/nodefaq.Dl9_LANF_ZkrmV3.webp)"}
{"id":"/blog/algorand-node-running-faq/","title":"Algorand native staking F.A.Q.","markdownUrl":"https://nodely.io/blog/algorand-node-running-faq.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand native staking F.A.Q.","url":"https://nodely.io/blog/algorand-node-running-faq/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nDec 1, 2024\n\n[FAQ](https://nodely.io/categories/FAQ)"}
{"id":"/blog/algorand-node-running-faq/","title":"Algorand native staking F.A.Q.","markdownUrl":"https://nodely.io/blog/algorand-node-running-faq.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Algorand native staking F.A.Q.","url":"https://nodely.io/blog/algorand-node-running-faq/#algorand-native-staking-faq","text":"Staking with your own Algorand node."}
{"id":"/blog/algorand-node-running-faq/","title":"Algorand native staking F.A.Q.","markdownUrl":"https://nodely.io/blog/algorand-node-running-faq.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Is this article for me?","url":"https://nodely.io/blog/algorand-node-running-faq/#is-this-article-for-me","text":"This FAQ focuses on native staking with your computer. Keep in mind there are other options as well. Native staking provides the most benefits to protocol decentralization and the node runner but requires the highest level of time and technical involvement."}
{"id":"/blog/algorand-node-running-faq/","title":"Algorand native staking F.A.Q.","markdownUrl":"https://nodely.io/blog/algorand-node-running-faq.md","updatedAt":"2024-12-01T00:00:00.000Z","heading":"Node running F.A.Q.:","url":"https://nodely.io/blog/algorand-node-running-faq/#node-running-faq","text":"**Q: Do I need to keep my node running 24/7?**  \nYes, if you want to keep your eligibility at 100%.\n\n> Every hour, a small random portion of accounts is challenged. Their respective nodes must respond within 10 minutes with a heartbeat. Failure to report in that window results in the account’s eligibility being revoked. One must re-register with 2 Algo fee to become eligible again.  \n> Consider registering for [alerts](https://alerts.allo.info/) and enabling node telemetry with [Nodely](https://nodely.io/docs/telemetry/quickstart).\n\n* * *\n\n**Q: Is my Algo locked up on the node?**  \nThere is no lockup when you participate with your node. You move your Algo freely; you can even go below the 30K Algo threshold temporarily, and it will not revoke your eligibility.\n\n> You can send some or all of your Algo to participate via DeFi platforms but remember that your node earns rewards only while there is at least 30K Algo in your private account.\n\n* * *\n\n**Q: Are the rewards up yet?**  \nProtocol rewards will be up in Dec’24 / Jan’25. Any kind of rewards that one might get for holding Algo now are not related to the permissionless incentives that will be introduced in the next protocol upgrade.\n\n* * *\n\n**Q: What happens when I go below or above the eligibility threshold?**  \nGoing above or below just stops the rewards. No action is needed to restore rewards other than getting back within the range.\n\n> Algorand protocol rewards you only if your account has been registered or unsuspended with the special 2 Algo fee, is actively voting on some node and the amount in your account is between 30K and 70M Algo.\n\n* * *\n\n**Q: How do I register/connect my account /participation keys?**  \nConnecting your node with your account is escribed [in this guide](https://medium.com/nodely/algorand-key-registration-cf2952d63c76).\n\n> Upcoming wallet upgrades will make this process as simple as scanning a QR code shown on the node’s terminal.\n\n* * *\n\n**Q: Can I set up the node now and just wait for rewards?**  \nAction is required to become eligible. You will need to re-register your account with a special, one-time, 2 Algo transaction after the Algorand protocol upgrade in Dec’24 / Jan’25.\n\n> Best to wait with the node installation for the algorun-tui utility that automates installation, fast-catchup and the key registration.\n\n* * *\n\n**Q: Can I use my Windows or desktop machine for the node?**  \nAny computer meeting the hardware requirements will do, but not all operating system versions are designed for 100% uptime. Desktop or laptop PCs might be optimized for power saving and suspend/shutdown when idle. This may cause your eligibility to be revoked.\n\n> Consider running your node on a Linux server machine at home or in the cloud that is otherwise unoccupied. This will get you closer to 100% of your potential rewards.\n\n* * *\n\n**Q: What Internet connection do I need? Is 200Mbps enough?**  \n200Mbps downstream is enough to run an Algorand node with a participation key.\n\n> You might consider a faster, symmetrical up/down, link if you plan on running your node as P2P relay later in the future.\n\n* * *\n\n**Q: How long are the epochs ? When are the rewards transferred?**  \nAlgorand protocol rewards participation immediately —directly to your account on the same block your node proposed.\n\n> [Reti staking pools](https://reti.nodely.io/) have delayed rewards , paid out in epochs — as configured separately by each pool creator. You might consider using your node to host such a pool and get others to stake with your node.\n\n* * *\n\n**Q: What are the penalties? What does slashing look like?**  \nAlgorand has no deposit other than the initial 2 Algo registration fee. There are no other lockups, and no slashing if your node misbehaves.\n\n> You need to re-register you account with 2 Algo fee each time it got suspended for not voting on time.\n\n* * *\n\n**Q: How long is the initial node sync/catchup?**  \nBy default, your node will do a full catchup that needs to process almost 2TB of data downloaded from the network. It might take 2 weeks unless you choose to do a fast-catchup that takes only 2 hours.\n\n> Most users choose the [fast-catchup](https://developer.algorand.org/docs/run-a-node/setup/install/#sync-node-network-using-fast-catchup) method as trust issues have been resolved with the introduction of state proofs.\n\n* * *\n\n**Q: Can I store my Algo on a Ledger device?**  \nYes, your Algo can be in a hardware / cold wallet and still participate.\n\n> You only delegate voting rights to your node by signing participation keys using your wallet. Participation keys only allow your node to propose blocks and certify other blocks on behalf of your account but not spend any of your Algo.\n\n[#guide](https://nodely.io/tags/guide)[#FAQ](https://nodely.io/tags/FAQ)[#node](https://nodely.io/tags/node)[#incentives](https://nodely.io/tags/incentives)[#Algorand](https://nodely.io/tags/Algorand)[#staking](https://nodely.io/tags/staking)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Algorand Cloud Node installation","url":"https://nodely.io/blog/algorand-node-setup/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand Cloud Node installation](https://nodely.io/_astro/nodefaq.Dl9_LANF_ZkrmV3.webp)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Algorand Cloud Node installation","url":"https://nodely.io/blog/algorand-node-setup/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nDec 11, 2024\n\n[guides](https://nodely.io/categories/guides)\n\n* * *"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Cloud Algorand node","url":"https://nodely.io/blog/algorand-node-setup/#cloud-algorand-node","text":"Quick and dirty ;)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Who is this guide for?","url":"https://nodely.io/blog/algorand-node-setup/#who-is-this-guide-for","text":"Anyone who wants to set up an Algorand node in the cloud quickly.  \nThis guide focuses on ease of installation and will not make you an expert in Linux or Algorand node setup. Security best practices are addressed at the end of the guide **— do not skip them.**\n\n> You might want to go through [native staking F.A.Q. first](https://medium.com/nodely/algorand-native-staking-f-a-q-b0acd87a6e4f)."}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"What is the end result?","url":"https://nodely.io/blog/algorand-node-setup/#what-is-the-end-result","text":"By following this guide, you will end up with a cloud Ubuntu Linux under $30/mo at [SpeedyPage.com](https://my.speedypage.com/aff.php?aff=490) running a synchronized Algorand mainnet node that is :\n\n-   Self-updating\n-   Reporting telemetry to Nodely\n-   Ready for participation configuration (key registration)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Any extra steps after this?","url":"https://nodely.io/blog/algorand-node-setup/#any-extra-steps-after-this","text":"If your plan is to participate in incentivized decentralization, then there will be a few extra steps:\n\n-   [Registering your account online](https://medium.com/nodely/algorand-key-registration-cf2952d63c76) with a key-reg transaction.\n-   [Subscribing to alerts](https://alerts.allo.info/) to get notifications when your node misbehaves.\n-   [Reading up on how all this voting stuff works](https://medium.com/nodely/to-vrf-or-not-aabccbe3bd25)."}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 1: Getting the cloud VM","url":"https://nodely.io/blog/algorand-node-setup/#step-1-getting-the-cloud-vm","text":"Go and set up an account with [SpeedyPage.com](https://my.speedypage.com/aff.php?aff=490). They have a nice choice of locations and top-tier performance, and most importantly, they are Algorand staking-friendly. Once your account is ready proceed to “Order New Services” and choose the KVM-12G in the location of your choice. Note some regions might be more expensive.\n\n![](https://cdn-images-1.medium.com/max/800/1*V1nPstBYrk8b1krOr34wUQ.png)\n\nOnce subscribed, go to Client Area and click on the green “Active” button next to your service and then click the “Open control panel” button.\n\n![](https://cdn-images-1.medium.com/max/800/1*0EjaFg-_ZzaCXPtDEDlcLQ.png)\n\nThis will take you to VM management panel where you should click the “Manage” button next to your VM that is “awaiting setup” .\n\n![](https://cdn-images-1.medium.com/max/800/1*aZEBdrKabQPgK7mFD-evww.png)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 2: Setting up your VM","url":"https://nodely.io/blog/algorand-node-setup/#step-2-setting-up-your-vm","text":"Give your server a name and chose your time zone.  \nNext pick the Ubuntu 24.04 LTS (Noble Numbat) as the Operating System and leave the “No SSH Keys Selected” - this will be fixed later. Press “Install“ and observe how SpeedyPage installs Ubuntu in 5 seconds.\n\n![](https://cdn-images-1.medium.com/max/800/1*qspEosbm_kWtX95j-A84Rg.png)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 3: Installing the Algorand node","url":"https://nodely.io/blog/algorand-node-setup/#step-3-installing-the-algorand-node","text":"You should get an email with the root password in your inbox.\n\n![](https://cdn-images-1.medium.com/max/800/1*3OQbml4QnEdG6EFikUcskA.png)\n\nNow use your favorite SSH client to log into the VM.  \nCommand line SSH client (eg on Windows/Mac terminal app) can connect like this:\n\nssh -o PreferredAuthentications=password [root@your.node.address](mailto:root@your.node.address)\n\nProvide the root password from your email.\n\n![](https://cdn-images-1.medium.com/max/800/1*ZsVoQAiLhwDm0_IdLSDTCA.png)\n\nYou can now install the node. Copy paste the following into the terminal for a quick install:\n\n```bash\necho \"export ALGORAND_DATA=/var/lib/algorand\" >> ~/.bashrc\nsource ~/.bashrc\ncurl -so /etc/apt/trusted.gpg.d/algorand.asc https://releases.algorand.com/key.pub\nadd-apt-repository -y \"deb [arch=amd64] https://releases.algorand.com/deb/ stable main\"\napt-get install -y algorand\nsleep 20\ngoal node catchup --force\n```\n\nThis will install the latest official Algorand node release and set it up to auto-update. The last command requests a fast catchup that should synchronize your node in under 2 hours (or 40 minutes in the case of your Speedy node).\n\nYou can watch the progress with the command below. The synchronization is finished when “Sync Time” says “0.0s”. Press Ctrl-C to get out.\n\nwatch goal node status\n\n![](https://cdn-images-1.medium.com/max/800/1*J8PQIMDW4oQYni3EG6h5bQ.png)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 4: Enabling telemetry","url":"https://nodely.io/blog/algorand-node-setup/#step-4-enabling-telemetry","text":"Once your node is synchronized, you can tell it to send diagnostic information to a free [Nodely telemetry service.](https://g.nodely.io/d/telemetrymain) Follow the OG install section of the [telemetry setup guide](https://nodely.io/docs/telemetry/quickstart/) to enable it.\n\nRemember to restart your Algorand node service afterward with :\n\nsystemctl restart algorand\n\n![](https://cdn-images-1.medium.com/max/800/1*pKbcw2wyurzDdbC1GOFLMg.png)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 5: Securing your node","url":"https://nodely.io/blog/algorand-node-setup/#step-5-securing-your-node","text":"Now, it is high time to add a user account to your Linux server and switch to SSH public key login.\n\nSuggested next tsteps:\n\n-   Generate a new SSH private key\n-   Add a dedicated Linux user and enable SSH key-based login\n-   Disable remote SSH root access\n-   Backup your private SSH key\n-   Enable Firewall\n-   Enable multifactor authentication on the SpeedyPage portal\n\nFollow the [Windows guide here](https://medium.com/nodely/ssh-public-key-authentication-51507b7080a1) to generate a public SSH key and lock down your node. Linux and Mac users might also use the guide but probably with a few tweaks.\n\nOnce done, make sure to backup you key file (eg to Google Drive or OneDrive). Key is encrypted with your password so it is safe to store in the Cloud.\n\nIf you happen to lose your key, You can always get to your Cloud VM by going to SpeedyPage control panel, enabling remote VNC access, launching a browser VNC client, and using a password from the original email. It might also be a good idea to enable multifactor authentication on SpeedyPage panel.\n\nPlease log in as your new user and execute the following commands to make sure your node utils know what folder your node keeps its data in:\n\n```bash\necho \"export ALGORAND_DATA=/var/lib/algorand\" >> ~/.bashrc\nsource ~/.bashrc\n```\n\nFrom now on, most commands will require a sudo prefix so you can launch them with admin rights.\n\nAs the last step, let’s set up the firewall on your node. Execute the following commands to enable access only to SSH service.\n\n```bash\nsudo ufw allow ssh\nsudo ufw enable\n```\n\nConfirm yes when asked about possible SSH disconnection.\n\nConnections to other services will now be rejected. This does not interfere with normal node operations as a validator but might need tweaking if you want your node to become a P2P relay in 2025. There will be a dedicated guide for that once this is possible.\n\nReview and check all the steps outlined at the top of this step."}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 6: Registering your stake","url":"https://nodely.io/blog/algorand-node-setup/#step-6-registering-your-stake","text":"You now need to register your account for voting. Key registration information is public and safe to paste into wallets, helper tools.\n\nYou can register your account with any amount of Algo. You can start with just 1 Algo and transfer more to your registered account later on.  \nHere are the next steps:\n\n-   [Registering your account online](https://medium.com/nodely/algorand-key-registration-cf2952d63c76) with a key-reg transaction.\n-   [Subscribing to alerts](https://alerts.allo.info/) to get notifications when your node misbehaves.\n-   [Reading up on how all this voting stuff works](https://medium.com/nodely/to-vrf-or-not-aabccbe3bd25).\n\nThis guide is also available on [Medium](https://medium.com/nodely/cloud-algorand-node-8bbc24b60a90)"}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 7: Upgrading your node","url":"https://nodely.io/blog/algorand-node-setup/#step-7-upgrading-your-node","text":"Your node is already set up to periodically update the Operating System as well as Algorand node itself. You can check what is the latest available version of the node and if it is installed with this command:\n\n```bash\nsudo apt update && apt list algorand\n\n#algorand/stable,now 3.27.0 amd64 [installed]\n```\n\nYou can force the update now, without waiting for the daily upgrade window by :\n\n```bash\nsudo apt update && sudo apt install -y algorand\n```\n\nThe node should restart itself if upgraded."}
{"id":"/blog/algorand-node-setup/","title":"Algorand Cloud Node installation","markdownUrl":"https://nodely.io/blog/algorand-node-setup.md","updatedAt":"2024-12-11T00:00:00.000Z","heading":"Step 8: Maintaining your node","url":"https://nodely.io/blog/algorand-node-setup/#step-8-maintaining-your-node","text":"Here are some helpful commands:\n\n```bash\n#check the version of your node\ngoal -v\n\n#restart your node\nsystemctl restart algorand\n\n#stop your node\nsystemctl stop algorand\n\n#start your node\nsystemctl start algorand\n\n#status of your node\ngoal node status\n\n#your participation key info\ngoal account partkeyinfo\n```\n\n[#guide](https://nodely.io/tags/guide)[#node](https://nodely.io/tags/node)[#incentives](https://nodely.io/tags/incentives)[#Algorand](https://nodely.io/tags/Algorand)[#staking](https://nodely.io/tags/staking)"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Algorand Incentives pre-Guide","url":"https://nodely.io/blog/algorand-staking-guide/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand Incentives pre-Guide](https://nodely.io/_astro/incentives_1.DDL0se7a_ZIbLzT.webp)"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Algorand Incentives pre-Guide","url":"https://nodely.io/blog/algorand-staking-guide/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nMar 1, 2024\n\n[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Algorand staking before Q2’24","url":"https://nodely.io/blog/algorand-staking-guide/#algorand-staking-beforeq224","text":"Algorand belongs to the Proof Of Stake family of blockchains and is secured by a decentralized stake and thousands of nodes run by independent operators.\n\n-   Neither node runners nor staking accounts are rewarded for securing the network.\n-   Each node may vote on behalf of one or multiple accounts.\n-   Accounts generate and sign secure participation keys that are limited only to voting activity and cannot be used for spending.\n-   Individual account vote power and proposal frequency are proportional to the amount of Algo tokens in the account.\n-   The stake is not locked and the proposal probability is recalculated in real-time (with 320 round lag).\n-   There is no stake floor or ceiling - even accounts with less than one Algo can propose blocks.\n-   DeFi & Bridge smart contracts allow for liquid staking. Users can lock their stake and receive equivalent tokens that allow them to participate in DeFi activities. The same locked stake can be registered to participate (vote & propose) on a user’s node."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Algorand 2024 incentives","url":"https://nodely.io/blog/algorand-staking-guide/#algorand-2024-incentives","text":"2024 introduces a fundamental change to the model with protocol-level proposal rewards. The transaction fee-powered rewards are going to be boosted by Algorand Foundation incentives for the first 3 years after launch. Two protocol-level features are going to be the base of this new program:\n\n-   **Incentivization:** Registered accounts with stake within specific bounds will be rewarded for each block proposal won.\n-   **Absenteeism:** Accounts that fail to propose regularly (e.g. due to node or network failure) will be removed from the staking until they re-register by paying an extra fee.\n\n> There will be no change to the participation floor or ceiling. Both small accounts with less than 1 Algo and whales with 600 Million Algo will be able to register online for voting and proposals. New bounds will only make an account eligible for block proposal rewards."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Stake eligibility for rewards","url":"https://nodely.io/blog/algorand-staking-guide/#stake-eligibility-forrewards","text":"The specific floor and ceiling that make the account eligible for rewards is yet to be decided but is expected to be\n\n-   30k Algo for the minimum stake (as per Gov #10)\n-   67MM to 135MM Algo for the maximum stake\n\nBoth minimum and maximum eligible stake values have important technical implications for network performance & security and should be carefully chosen."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Minimum eligible stake","url":"https://nodely.io/blog/algorand-staking-guide/#minimum-eligiblestake","text":"Consider some facts about the minimum/floor eligibility stake value:\n\n-   A low value increases the number of eligible accounts.\n-   Tracking account eligibility is a memory-intensive task for each participating node.\n-   Should not be increased in future releases as it might require the redeployment of pool smart contracts to maintain fair reward distribution.\n\nTechnically Algorand should opt for a higher floor as it makes the chain more green by lowering the minimal node hardware requirements.\n\nWhile this appears to make the process less inclusive, a decentralized staking pool smart contract could allow smaller accounts to participate in block rewards. Small stake accounts might also consider DeFi liquid staking."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Decentralized staking pools","url":"https://nodely.io/blog/algorand-staking-guide/#decentralized-stakingpools","text":"![pools](https://nodely.io/_astro/incentives_2.Dy_Mt7k-_Z10BGJV.webp)\n\nMultiple teams are in the process of creating smart contract-based solutions to allow accounts below the minimum threshold to receive staking rewards.\n\nStaking pools are going to introduce a lot of innovation and encourage daily engagement in the process compared to passive staking on private nodes."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Running a private/pool validator node","url":"https://nodely.io/blog/algorand-staking-guide/#running-a-privatepool-validator-node","text":"The following facts about participation might help you decide what hardware to use and where to run it.\n\n-   For each block, approximately 20 nodes propose blocks but only one of them wins.\n-   Only the winning proposal is rewarded.\n-   The block time is constantly adjusted for observed proposal arrival times, so unusually slow proposals may be ignored by the network.\n-   Upcoming upgrades to the minimum block time might cause your proposal to be too late if your network or node is slow.\n-   Hosting more than 4 accounts’ participation keys on a single node might delay proposals by 500ms or more.\n-   Opting only for the upcoming peer-to-peer gossip (survival) mode without any fast relay network connections might delay the propagation of the proposal.\n-   Hosting the same account on more than one node will lead to “equivocation” events and account proposal being ignored for the whole round. Never do this!\n-   Network transaction rate around or above 6k TPS might require more than 100Mbps of downstream Internet connection to the node.\n-   The protocol detects offline nodes and removes their stake making sure the risk of a stall is not growing."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Private node","url":"https://nodely.io/blog/algorand-staking-guide/#private-node","text":"Algorand network allows validators to participate with low-powered machines and does not require an ultra-fast Internet connection.\n\nHosting only your account that has less than 0.005% of the total online stake can be safely done on a home PC. The risks of power or network outages are mitigated by the network. A low frequency of proposals means a low probability of hitting a perfect storm that causes the proposal to be missed by the network.\n\nWhile there is no risk to your stake from leaked participation keys they should be unregistered ASAP so that bad actors cannot vote on your behalf.\n\nRunning a high-stake account on the other hand should be done on a cloud machine. Prices for such a service start from $35 monthly, but do read through T&C to make sure staking is allowed."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Pool’s validator node","url":"https://nodely.io/blog/algorand-staking-guide/#pools-validator-node","text":"It is anticipated that most pools are going to be based on permissionless contracts. In this scenario, the popularity of a pool (and the validator fees) is going to depend on the quality of the node that proposes on behalf of the whole pool.\n\nMonitoring solutions will clearly show if pools meet the expected rewards and users will migrate to validators with higher quality.\n\nHigh-stake pools are going to propose more frequently and node runners might need to invest in more expensive nodes or host only one pool per node to keep the best score.\n\nNever run the same pool account on multiple nodes as it will lead to “equivocation” events and lost block proposal rewards."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"External resources","url":"https://nodely.io/blog/algorand-staking-guide/#external-resources","text":"This article will be updated with a list of tools and projects that can be used to streamline and monitor the decentralized Algo staking activity."}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Discussion / more info","url":"https://nodely.io/blog/algorand-staking-guide/#discussion--moreinfo","text":"-   [Node-runners](https://medium.com/r/?url=https%3A%2F%2Fdiscord.com%2Fchannels%2F491256308461207573%2F807825288666939482) channel on #Algorand official Discord server"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Consensus monitoring","url":"https://nodely.io/blog/algorand-staking-guide/#consensus-monitoring","text":"-   [Allo Alerts](https://alerts.allo.info/) : get notifications for consensus events or low-performance\n-   [Nodely.io Dashboards](https://g.nodely.io/d/consensus) : consensus metrics dashboards\n-   [Consensus sheet](https://docs.google.com/spreadsheets/d/1m5WWd_hX6nDZYhmqbqGJDQzDt98Eyhu68TeXQm7lvp8/edit#gid=0) : Proposal/Voting calculator"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Open Source Pools","url":"https://nodely.io/blog/algorand-staking-guide/#open-sourcepools","text":"@2024–03–14 TXN Labs announced plans to develop Réti   \n\\- an open source solution for a smart contract based pools"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Pool monitoring","url":"https://nodely.io/blog/algorand-staking-guide/#pool-monitoring","text":"…"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Node management","url":"https://nodely.io/blog/algorand-staking-guide/#node-management","text":"…"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Node monitoring","url":"https://nodely.io/blog/algorand-staking-guide/#node-monitoring","text":"…"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"DeFi liquid staking","url":"https://nodely.io/blog/algorand-staking-guide/#defi-liquidstaking","text":"…"}
{"id":"/blog/algorand-staking-guide/","title":"Algorand Incentives pre-Guide","markdownUrl":"https://nodely.io/blog/algorand-staking-guide.md","updatedAt":"2024-03-01T00:00:00.000Z","heading":"Updates","url":"https://nodely.io/blog/algorand-staking-guide/#updates","text":"@2024–03–15\n\n-   added 30k minimum for reward eligibility\n-   added Réti Open Pooling (TXNLabs) info\n-   added link to node-runners channel\n\n[#guide](https://nodely.io/tags/guide)[#incentives](https://nodely.io/tags/incentives)[#Algorand](https://nodely.io/tags/Algorand)[#staking](https://nodely.io/tags/staking)"}
{"id":"/blog/algorand-transaction-performance/","title":"Algorand transaction performance","markdownUrl":"https://nodely.io/blog/algorand-transaction-performance.md","updatedAt":"2023-12-29T00:00:00.000Z","heading":"Algorand transaction performance","url":"https://nodely.io/blog/algorand-transaction-performance/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Algorand transaction performance](https://nodely.io/_astro/tps_1.D8kmy8FR_ZEL3bV.webp)"}
{"id":"/blog/algorand-transaction-performance/","title":"Algorand transaction performance","markdownUrl":"https://nodely.io/blog/algorand-transaction-performance.md","updatedAt":"2023-12-29T00:00:00.000Z","heading":"Algorand transaction performance","url":"https://nodely.io/blog/algorand-transaction-performance/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nDec 29, 2023\n\n[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/algorand-transaction-performance/","title":"Algorand transaction performance","markdownUrl":"https://nodely.io/blog/algorand-transaction-performance.md","updatedAt":"2023-12-29T00:00:00.000Z","heading":"Theoretical performance","url":"https://nodely.io/blog/algorand-transaction-performance/#theoretical-performance","text":"Algorand transaction performance is limited by protocol constants.  \nThe protocol is updated quarterly so it is important to reference a particular version and its settings when calculating maximum throughput.\n\nAs of Q4’2023 the limits are:\n\n-   block size: 5MB\n-   target block time average: 3.3 sec\n\nTo calculate maximum throughput we have to assume some average transaction data length. Algorand is used in many real-world scenarios where transactions contain an additional note, like air sensor data. This causes the average transaction length to be around 350 bytes.  \nOn the other hand, blocks filled with DeFi transactions (application calls) have a shorter average length of 120 bytes.\n\nWith the average TX size of 120 to 350 bytes and block time of 3.3 seconds we calculate the maximum transaction throughput to be anywhere between 4500 to 13000 TPS depending on the mix of transaction types.\n\nIt is worth noting that mainnet block #25836244 with ≤4 sec block time contained 58888 transactions — this translates to **14500+ TPS**."}
{"id":"/blog/algorand-transaction-performance/","title":"Algorand transaction performance","markdownUrl":"https://nodely.io/blog/algorand-transaction-performance.md","updatedAt":"2023-12-29T00:00:00.000Z","heading":"Transaction types","url":"https://nodely.io/blog/algorand-transaction-performance/#transaction-types","text":"DeFi transactions often spawn additional transactions that are the result of a smart contract execution. Such transactions are called **inner transactions** (or **inners**) and as an optimization do not have a full transaction ID assigned but only an offset within a block. This saves precious space in the block but does not demote the transaction in any way. Such transactions can be addressed individually with a block number and transaction offset."}
{"id":"/blog/algorand-transaction-performance/","title":"Algorand transaction performance","markdownUrl":"https://nodely.io/blog/algorand-transaction-performance.md","updatedAt":"2023-12-29T00:00:00.000Z","heading":"Calculating historical throughput","url":"https://nodely.io/blog/algorand-transaction-performance/#calculating-historical-throughput","text":"Instead of downloading and parsing a block, it is enough to parse headers of two consecutive blocks to arrive at the transaction count per block as each block header contains both block timestamp as well as a monotonically increasing transaction count.\n\nThis protocol transaction counter includes **all transaction types**.\n\nAlgorand nodes are not required to have synchronized clocks and the block timestamps are rounded to 1 full second it is therefore best to calculate the throughput on 10 or 100-block intervals.\n\nBlock headers can be fetched using indexer API :\n\n[https://mainnet-idx.algonode.cloud/v2/blocks/34801047?header-only=true](https://mainnet-idx.algonode.cloud/v2/blocks/34801047?header-only=true)  \n[https://mainnet-idx.algonode.cloud/v2/blocks/34801147?header-only=true](https://mainnet-idx.algonode.cloud/v2/blocks/34801147?header-only=true)\n\nWith headers from two blocks 34801047 and 34801147 one can infer that\n\n-   the transaction counter difference is **1170701**\n-   timestamp difference is **362** seconds.\n\nThis translates to an average throughput of 3234 TPS over 100 blocks.\n\nInner transactions in this block range constituted 0.2% of all transactions.\n\n[#guide](https://nodely.io/tags/guide)[#tps](https://nodely.io/tags/tps)[#Algorand](https://nodely.io/tags/Algorand)[#performance](https://nodely.io/tags/performance)"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Ariadne: investigation and monitoring for Algorand","url":"https://nodely.io/blog/ariadne-investigation-workspace/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Ariadne: investigation and monitoring for Algorand](https://nodely.io/_astro/hero.CZO0Ma_b_29uhjt.webp)"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Ariadne: investigation and monitoring for Algorand","url":"https://nodely.io/blog/ariadne-investigation-workspace/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nNov 5, 2026\n\n[services](https://nodely.io/categories/services)\n\n [Watch the video (MP4)](https://media.algo.green/v/share/ariadne-one-alert-1920x1080.mp4)\n\n_The company shown here, Acme Labs, is made up and has no link to any real company of that name. All of its data is made up too. The voice is AI-generated._\n\nAriadne is Nodely’s investigation and monitoring workspace for Algorand. You work in cases. You ask an agent questions in plain language, and its answers cite their sources. Memory, to-dos, sources, files and a live summary stay with the case. Labels are shared across the organization."}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Who it is for","url":"https://nodely.io/blog/ariadne-investigation-workspace/#who-it-is-for","text":"All the features described here are for Nodely enterprise customers, by invitation. Planned as basic features on other plans, with cheaper plans on the way: security dashboards, dApp vulnerability monitoring and QTScan audits included. Details may change. Talk to us: [sales@nodely.io](mailto:sales@nodely.io).\n\nNot available yet: the scratch pad, the cheaper plans, the basic features on other plans and the customer views of threat intelligence, dApp radar and markets. Plans and features may change. The first three screens below are not available yet in this form: dApp radar and threat intelligence are among those customer views, and QTScan audits on other plans are among the basic features still planned."}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"What it does","url":"https://nodely.io/blog/ariadne-investigation-workspace/#what-it-does","text":"Every screenshot here shows a made-up company with made-up data, stamped DEMO. The accounts, amounts, dates, people, labels, answers, case summary and Grounded badges are invented. The first three screens are the Nodely portal’s security panels. The other four are Ariadne itself."}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"dApp radar","url":"https://nodely.io/blog/ariadne-investigation-workspace/#dapp-radar","text":"The radar panel lists the sites on domains an organization has proven are its own, with requests, submitted transactions, busiest apps and findings. Here one site has a high finding: transaction submit errors at 6.1% for 3 hours. A clean scan proves nothing.\n\n![dApp radar panel for Acme Labs: two sites, app and swap on acmelabs.example, with requests, transactions submitted and busiest apps, and a red high finding for transaction submit errors](https://nodely.io/_astro/radar.D1avKJgZ_2af668.webp)\n\n_dApp radar in the portal: the red pill is the high finding._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Threat intelligence tied to your own stack","url":"https://nodely.io/blog/ariadne-investigation-workspace/#threat-intelligence-tied-to-your-own-stack","text":"The panel has two views: outages and crypto hacks, and your own dApps. The second lists only findings tied to the organization’s registry. Here that means an expiring TLS certificate, a database port open to the internet, an outdated dependency and a missing Content-Security-Policy header.\n\n![Threat intel panel, Your dApps view, last 90 days: four made-up findings on Acme Labs sites, from a high-severity open database port to a low-severity missing Content-Security-Policy header](https://nodely.io/_astro/threat.BtqSnCsg_2785RL.webp)\n\n_Threat intel in the portal, Your dApps view._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"QTScan contract audits","url":"https://nodely.io/blog/ariadne-investigation-workspace/#qtscan-contract-audits","text":"QTScan audits are planned to come on request, within a monthly allowance. On this panel you enter app ids or contracts, and the status moves from queued to in progress to report ready or rejected. QTScan reads the contract as deployed, not as it looks in a repository, and checks it against a list hardened by real Algorand exploits. Findings are leads to review. A clean report is no guarantee.\n\n![QTScan panel: a Request an audit form with app ids and a network selector, and a Your audits table with one audit in progress and one report ready to download as PDF](https://nodely.io/_astro/qtscan.ByQ9ohUr_1EcaQl.webp)\n\n_QTScan in the portal. The requests, usage and findings on screen are made up._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Follow the money, hop by hop","url":"https://nodely.io/blog/ariadne-investigation-workspace/#follow-the-money-hop-by-hop","text":"When money moves, ask the agent where it went. In this made-up example, a 0-amount token opt-in also rekeyed the Acme treasury account, moving its signing power to a new key. Two days later 412,800 ALGO left in two hops and reached an exchange-labelled wallet in 19 minutes. The answer on screen, written for this demo, lays that out as a hop table and says where the trace stops.\n\n![Ariadne chat screen showing an answer written for this demo, marked Grounded, with a two-row hop table: 412,800 ALGO from the made-up treasury account to a new account, then on to a wallet labelled as an exchange](https://nodely.io/_astro/hop.wMdJ1VKQ_Znpg9s.webp)\n\n_An answer written for this demo and its hop table, beside the case summary._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Flow lab","url":"https://nodely.io/blog/ariadne-investigation-workspace/#flow-lab","text":"Flow lab takes a set of accounts and a time window, and finds how they connect over 1 to 4 hops: the paths, connecting accounts and value flows between them. You can export CSV files, PNG or SVG images, and a bundle whose manifest records a sha256 hash of each CSV. By default, exchange hot wallets, AMM pools and fee sinks are stops, not intermediates, and you can untick each one for a run. Accounts it did not expand are listed, and “not expanded” does not mean “not connected”.\n\n![Flow lab page: entity set Treasury drain with 3 accounts, max hops 2, and a graph of three nodes, one labelled as an exchange, with 412.8k ALGO on the edges and download buttons for CSV files and bundle.zip](https://nodely.io/_astro/flow-lab.W04rbkQf_wmak6.webp)\n\n_Flow lab on three made-up accounts: parameters, graph and exports._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Every answer cites its sources","url":"https://nodely.io/blog/ariadne-investigation-workspace/#every-answer-cites-its-sources","text":"Answers end with a sources list, and numbered chips in the text link to it. The Grounded badge means every factual sentence cites a source the agent retrieved. Not every answer earns it, and it does not mean the sentence is true. A person checks that. If an answer names an id, round or amount found in no tool result, case note or message, a note under the answer lists it as unverified.\n\n![Chat answer written for this demo, marked Grounded, to the question of which transaction rekeyed the made-up treasury account, with citation chips S1 and S2 and a Sources list](https://nodely.io/_astro/sources.D_ETRi5O_Z18Afj3.webp)\n\n_An answer written for this demo, with a Grounded badge, citation chips and a sources list._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Every label confirmed by a person","url":"https://nodely.io/blog/ariadne-investigation-workspace/#every-label-confirmed-by-a-person","text":"The agent can only propose labels and tags. Until a person reviews them, proposed labels carry an “Inferred by agent” badge and rank below analyst labels. Each one waits in the review queue for one of four choices: confirm, mark suspected, discard the proposal or reject the label. Proposed tags can be confirmed, discarded or rejected. Exports mark unreviewed agent labels as “\\[agent-inferred, unreviewed\\]”.\n\n![Dialog titled Agent proposals awaiting review: made-up labels such as Acme treasury and Single-use sweeper, each with Confirm, Mark suspected, Discard proposal and Reject label buttons](https://nodely.io/_astro/review.BShC159c_Z1Oj54G.webp)\n\n_The review queue: proposed labels wait here for a person._"}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"Watches and analyses","url":"https://nodely.io/blog/ariadne-investigation-workspace/#watches-and-analyses","text":"Watches check a case’s accounts, assets and apps for new on-chain activity about every 2 to 5 minutes. Alerts arrive in the app, by e-mail or in Slack. The agent can propose a watch, but only a person can activate it.\n\nAnalyses keep the agent’s traces and clustering runs in the case: taint traces, rekey clusters, wash rings, similar accounts. A lead, not a proof."}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"What it does not do","url":"https://nodely.io/blog/ariadne-investigation-workspace/#what-it-does-not-do","text":"Findings are research aids, not conclusions. Chain records show keys and accounts, not people. Ariadne traces funds; it recovers nothing."}
{"id":"/blog/ariadne-investigation-workspace/","title":"Ariadne: investigation and monitoring for Algorand","markdownUrl":"https://nodely.io/blog/ariadne-investigation-workspace.md","updatedAt":"2026-11-05T09:31:00.000Z","heading":"See Ariadne at a glance","url":"https://nodely.io/blog/ariadne-investigation-workspace/#see-ariadne-at-a-glance","text":"[Watch the video (MP4)](https://media.algo.green/v/share/ariadne-glance-r1-1920x1080.mp4)\n\nIn two minutes, NoA, the Nodely agent, goes through threat intel, dApp radar, DeFi radar, 1.6 million labeled entities, the map of every note on mainnet, Network monitor and alerts, and ends on one case built from a real wallet drain.\n\nUnlike the screenshots above, this video shows the real workspace with real data. The case is real, with transactions from public Algorand records. The DeFi radar findings are past exploits replayed through the detectors, and the Slack message is redrawn from the notification’s own text. Some site and account names are blurred. The voice is AI-generated.\n\nTo talk to us about Ariadne, write to [sales@nodely.io](mailto:sales@nodely.io).\n\n[#Ariadne](https://nodely.io/tags/Ariadne)[#QTScan](https://nodely.io/tags/QTScan)[#security](https://nodely.io/tags/security)[#investigation](https://nodely.io/tags/investigation)[#Algorand](https://nodely.io/tags/Algorand)"}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"AVAIL: a virtual validator for Algorand","url":"https://nodely.io/blog/avail-virtual-validator/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![AVAIL: a virtual validator for Algorand](https://nodely.io/_astro/hero.CIXXG1hA_Z109OCm.webp)"}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"AVAIL: a virtual validator for Algorand","url":"https://nodely.io/blog/avail-virtual-validator/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nNov 6, 2026\n\n[services](https://nodely.io/categories/services)\n\n [Watch the video (MP4)](https://media.algo.green/v/share/avail-nothing-happens-1920x1080.mp4)\n\nAVAIL (Algorand Validator Adaptive Infrastructure Layer) is our virtual validator. We run and rotate your Algorand mainnet participation keys in highly available, load balanced compute slots. Your account and your ALGO stay yours. If a node fails, your key moves to another one, with less than 60 seconds of voting downtime."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"What you get","url":"https://nodely.io/blog/avail-virtual-validator/#what-you-get","text":"-   **Node failures don’t stop your vote for long.** Less than 60 seconds of voting downtime on hardware failure.\n-   **Upgrades are our job.** No voting downtime during node upgrades.\n-   **Key handling is automated.** Rotation and monitoring are automated. Key bundles are pruned continuously, so stolen material would not include keys used in the past, and any leaked keys are invalidated with an automatic key registration.\n-   **You pick the region.** North America, Europe, Singapore or Australia, and you can change it at any time.\n-   **You choose on rewards.** Choose to be eligible for protocol rewards or not. Eligibility depends on the key registration method and the account balance."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"Your funds stay with you","url":"https://nodely.io/blog/avail-virtual-validator/#your-funds-stay-with-you","text":"AVAIL is not a staking pool. Each participation key is linked to the customer’s single, non-custodial account, and our docs state: “Nodely has no technical means to spend or manage customer’s funds.”\n\nKey registration is either a periodic email, for a Pera QR code or Ledger, or fully automated through an external API call or a smart contract call. The Reti node manager is not compatible with AVAIL key management, so a Reti pool cannot run on it."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"Voting on consensus upgrades","url":"https://nodely.io/blog/avail-virtual-validator/#voting-on-consensus-upgrades","text":"A consensus upgrade needs 9,000 yes votes in a window of 10,000 blocks. Nine blocks in ten.\n\nalgod v5.0.4, which introduced consensus version v43, was published on 2026-10-20 at 15:41 UTC. Thirty windows of the v43 vote fell short. The 31st closed with 9,301 yes votes on 2026-10-30 at 12:06 UTC, 9.9 days after the release. Measured the same way, release to approval took 2.0 days for algod v4.3.0 in September 2025 and 3.5 days for algod v5.0.0 in August 2026. The chart at the top of this post shows those windows, from public block headers.\n\nOn the v43 vote, AVAIL’s online accounts voted yes 5.6 to 5.7 hours after the v5.0.4 release. Ten of 52 large accounts were earlier.\n\nOn day five, sampling every 17th round, 32% of the blocks from the top ten accounts voted yes. Ranks 11 to 50 were at 53%, ranks 51 and up at 64%. The ranks use stake on 2026-11-06, the day we measured, not stake during the vote. This split covers this one upgrade.\n\nNobody did anything wrong. We never measured why the count sat where it did, so we offer no cause. Moving your node to AVAIL makes one less account to wait for, and that is the whole claim. The cooldown after approval stays whoever runs the node."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"SLA","url":"https://nodely.io/blog/avail-virtual-validator/#sla","text":"The service is under an SLA: less than 60 seconds of unavailability a month, with proportional reimbursement of the service fee. The docs state this as a guarantee with a remedy. It is not a claim of zero downtime. Our [terms of service](https://nodely.io/legal/terms-of-service) cap liability at the fee and exclude lost profits."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"Price","url":"https://nodely.io/blog/avail-virtual-validator/#price","text":"Pricing depends on the number of active participation keys, not on stake.\n\n-   $64/mo per active key, with no choice of primary provider tier\n-   $256/mo for 8 active keys ($32/mo per key), with a choice of provider tiers\n\nAll prices are for business entities, paid annually upfront."}
{"id":"/blog/avail-virtual-validator/","title":"AVAIL: a virtual validator for Algorand","markdownUrl":"https://nodely.io/blog/avail-virtual-validator.md","updatedAt":"2026-11-06T14:54:00.000Z","heading":"Get started","url":"https://nodely.io/blog/avail-virtual-validator/#get-started","text":"Details and the FAQ are on the [AVAIL docs page](https://nodely.io/docs/solutions/validator/). To talk to us, write to [sales@nodely.io](mailto:sales@nodely.io).\n\n[#AVAIL](https://nodely.io/tags/AVAIL)[#validator](https://nodely.io/tags/validator)[#Algorand](https://nodely.io/tags/Algorand)[#consensus](https://nodely.io/tags/consensus)[#participation keys](https://nodely.io/tags/participation-keys)"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Calculating balances on Algorand","url":"https://nodely.io/blog/calulating-algo-balances/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Calculating balances on Algorand](https://nodely.io/_astro/balances_1.uJ8poOfm_er4Jh.webp)"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Calculating balances on Algorand","url":"https://nodely.io/blog/calulating-algo-balances/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nJul 28, 2022\n\n[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Account balance on Algorand","url":"https://nodely.io/blog/calulating-algo-balances/#account-balance-on-algorand","text":"Algorand blockchain keeps both transaction (block) history as well as the current account state for all non-zero balance addresses.\n\nGetting the balance of tokens on an account is just a single call/lookup on the Algorand Indexer SQL schema or native node API. But what if we are interested in historical data?\n\nHow quickly can we get data that shows\n\n-   balance history for an account\n-   token distribution amongst holders at some round/block\n-   a snapshot of account balance at some point in the past\n\nWe get there by going through all transactions on the accounts up to the specified point in time and adding all token inflows and outflows.\n\nLimited “time-travel” functionality is provided by Algorand Indexer API but does not work for accounts with any kind of smart contract activity on them."}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Accounting events that affect balance","url":"https://nodely.io/blog/calulating-algo-balances/#accounting-events-that-affect-balance","text":"Let’s find out what inflows and outflows are possible on Algorand\n\nOutflows:\n\n-   native payment or ASA token transfer\n-   transaction fee (if covered by the account)\n-   account close (native or ASA)\n-   token clawback\n-   token destroy (creator account only)\n\nInflows:\n\n-   native payment or ASA token transfer\n-   receiving end of account close operation (native or ASA)\n-   rewards (native token only)\n-   token clawback\n-   token mint\n\nNotice that the transaction fee might be covered by another entity (eg smart contract) when the transaction is part of a group.\n\nRewards are no longer live on Algorand and as optimization are stored separately from TX history in Allo DW schema.\n\nThis article will focus on native tokens only. Queries that work with ASA are left as an exercise for the reader. :)"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Finding an interesting account","url":"https://nodely.io/blog/calulating-algo-balances/#finding-an-interesting-account","text":"We are interested in an account that had all types of transactions (except being closed out) over a long period of time.\n\n```sql\nWITH tx AS (\n-- OUTFLOWS\nSELECT snd_addr_id addr_id, round, 1 outflow ,0 inflow, 0 closeto\n  FROM mainnet.txn where type_ext in ('acc_payment','acc_payment_create')\nUNION ALL\n-- INFLOWS\nSELECT rcv_addr_id addr_id, round, 0, 1, 0\n  FROM mainnet.txn where type_ext in ('acc_payment','acc_payment_create')\nUNION ALL\n-- close_to\nSELECT close_to_addr_id addr_id, round, 0, 0, 1\n  FROM mainnet.txn where type_ext in ('acc_close')\n) SELECT\n    addr_id                        -- address id\n    , min(round) r1                -- first round\n    , max(round) r2                -- last round\n    , sum(outflow) outflows        -- number of outflows TX\n    , sum(inflow) inflows          -- number of inflows TX\n    , sum(closeto) closeto         -- number of close to TX\n  FROM tx\n  GROUP BY addr_id\n  HAVING\n    r2 - r1 > 10000000             -- spanning >10M round\n    AND outflows > 1000000         -- at least 1M outflows\n    AND inflows > 1000000          -- at least 1M inflows\n    AND closeto > 1                -- at least 1 closeto\n  ORDER BY count() DESC limit 1\n```\n\nThis will pick the top account by the number of transactions that has at least 1M inbound and 1M outbound payment transactions spanning at least 10M rounds.\n\nNote that Allo DW transaction type annotation differentiates between a payment transaction (‘acc\\_payment’) to an account that already existed and ‘acc\\_payment\\_create’ transaction that initially funded an account.\n\nAllo DW schema stores accounts as UInt64 IDs with a separate map between IDs and full Algorand 58 character address encoding.  \nThe one chosen is AACCDJ…LTEN4A with ID: 1740798472"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Getting Algo balance history for an account","url":"https://nodely.io/blog/calulating-algo-balances/#getting-algo-balance-history-for-an-account","text":"To calculate daily Algo holdings for an account we construct a union query that aggregates all daily deltas from rewards, inflows, outflows and calculate a running sum over the output.\n\nNote that we calculate using Int128 to prevent overflow while keeping full precision in micro Algos. The result is finally shifted by 6 decimals to arrive at the Algo value.\n\n```sql\nwith inoutalgoagg as (\n   with deltas as (\n\n    -- Add all sender rewards\n    select toDate(realtime) ts, sum(rs::Int128) dAlgo\n    from mainnet.txn_rewards\n    where sid = 1740798472 and rs > 0 group by ts\n\n    union all\n\n    -- Add all receiver rewards\n    select toDate(realtime) ts, sum(rr::Int128) dAlgo\n    from mainnet.txn_rewards\n    where rid = 1740798472 and rr > 0 group by ts\n\n    union all\n\n  -- Add all close_to rewards\n    select toDate(realtime) ts, sum(rc::Int128) dAlgo\n    from mainnet.txn_rewards\n    where cid = 1740798472 and rc > 0 group by ts\n\n    union all\n\n    -- All fees :: outflows (minus)\n    select toDate(realtime) ts, -sum(fee::Int128) dAlgo from mainnet.txn\n    where snd_addr_id = 1740798472 and fee > 0 group by ts\n\n    -- PAYments from the account :: outflows (minus)\n    -- lets not forget about the outflow in case of account close\n    union all\n    select toDate(realtime) ts, -sum(amount::Int128 + close_amount::Int128) dAlgo\n    from mainnet.txn\n    where snd_addr_id = 1740798472 and typeenum = 1 group by ts\n\n    -- PAYments to the account :: inflows (in plus)\n    union all\n    select toDate(realtime) ts, sum(amount::Int128 ) dAlgo from mainnet.txn\n    where rcv_addr_id = 1740798472 and typeenum = 1 group by ts\n\n    -- PAYmets to the account that are part of close :: inflows (in plus)\n    union all\n    select toDate(realtime) ts, sum(close_amount::Int128) dAlgo from mainnet.txn\n    where close_to_addr_id = 1740798472 and typeenum = 1 group by ts\n\n   ) select ts, sum(dAlgo) da, sumState(dAlgo) ra from deltas group by ts order by ts\n) select ts, da, runningAccumulate(ra)/1000000 balance from inoutalgoagg\n```\n\n![](https://cdn-images-1.medium.com/max/800/1*jpPu8ILZdPaj2sTP7mGq-Q.png)\n\nThis method ignores the initial balance of genesis accounts. One needs to add genesis data stored separately in Allo DW to get the correct results for this particular set of accounts."}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Finding an interesting account … take 2","url":"https://nodely.io/blog/calulating-algo-balances/#finding-an-interesting-account--take-2","text":"This time let’s find an account with the highest daily delta variance and over a minimum of 100-day time span.\n\n```sql\nWITH deltas AS\n    (\n        SELECT\n            snd_addr_id AS addr,\n            toDate(realtime) AS ts,\n            -sum(CAST(amount, 'Int128') + CAST(close_amount, 'Int128')) AS dAlgo\n        FROM mainnet.txn\n        WHERE typeenum = 1\n        GROUP BY\n            1,\n            ts\n        UNION ALL\n        SELECT\n            rcv_addr_id,\n            toDate(realtime) AS ts,\n            sum(CAST(amount, 'Int128')) AS dAlgo\n        FROM mainnet.txn\n        WHERE typeenum = 1\n        GROUP BY\n            1,\n            ts\n    )\nSELECT\n    addr,\n    varPop(intDiv(dAlgo,10000000)) AS varPop\nFROM deltas\nGROUP BY addr\nHAVING count() > 100\nORDER BY 2 DESC\nLIMIT 5\n```\n\nCrunching quick daily balance deltas across 1.1 billion transactions takes less than 10 seconds with the following results:\n\n![](https://cdn-images-1.medium.com/max/800/1*-oyLdz_qq8YWPlFW43EEjA.png)\n\nLet’s graph the balance of V3ZJHY…3P5IIA :\n\n![](https://cdn-images-1.medium.com/max/800/1*lPyxBa2c9oVS44iIGyw1nA.png)"}
{"id":"/blog/calulating-algo-balances/","title":"Calculating balances on Algorand","markdownUrl":"https://nodely.io/blog/calulating-algo-balances.md","updatedAt":"2022-07-28T00:00:00.000Z","heading":"Take 3","url":"https://nodely.io/blog/calulating-algo-balances/#take-3","text":"This time let’s find the most popular account where the popularity metric is going to be defined as a product of unique inflow addresses and unique outflow addresses.\n\n```sql\nWITH unique_senders_receivers as (\n  SELECT\n    snd_addr_id addr_id\n    , uniq(rcv_addr_id) ur\n    , 0 us\n  FROM mainnet.txn WHERE typeenum = 1 GROUP BY 1 HAVING ur > 1000\nUNION ALL\n  SELECT\n    rcv_addr_id addr_id\n    , 0 ur\n    , uniq(snd_addr_id) us\n  FROM mainnet.txn WHERE typeenum = 1 GROUP BY 1 having us > 1000\n) SELECT addr_id, sum(us)*sum(ur) popularity\n  FROM unique_senders_receivers GROUP BY 1 ORDER BY 2 DESC limit 5\n```\n\nThe popularity contest winner is … BINANCE with account id 3907164  \naddress SP745J…MDCZVM\n\n![](https://cdn-images-1.medium.com/max/800/1*pp9o-3yK16SQhb12MOZv4Q.png)\n\nThe same principle can be applied to calculate ASA token or online stake distribution at specific block but we’ll explore this idea in another article.\n\nA single pass (no unions) query is possible using ClickHouse dynamic arrays but would be harder to deconstruct in the article. Also the union version already executes in under 15 seconds over all accounts across over a billion of transactions.\n\n* * *\n\n_All examples use commercial Allo.info Algorand Self Service BI offering.  \nPlease contact [sales@allo.info](mailto:sales@allo.info) for a custom quote._\n\n🔬_Note that researchers get free access to the platform._ 🔬\n\n[#guide](https://nodely.io/tags/guide)[#Algorand](https://nodely.io/tags/Algorand)[#sql](https://nodely.io/tags/sql)[#balances](https://nodely.io/tags/balances)[#self-service BI](https://nodely.io/tags/self-service-BI)"}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Data mining Algorand for participating accounts","url":"https://nodely.io/blog/data-mining-4-participating-accounts/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Data mining Algorand for participating accounts](https://nodely.io/_astro/data_1.VkBCmceM_wY3A5.webp)"}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Data mining Algorand for participating accounts","url":"https://nodely.io/blog/data-mining-4-participating-accounts/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nJul 23, 2022\n\n[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Blockchain validation on Algorand","url":"https://nodely.io/blog/data-mining-4-participating-accounts/#blockchain-validation-on-algorand","text":"Algorand utilizes unique validation solution that allows for unlimited scaling while maintaining sub 4 second block finality without sacrificing security.\n\nValidators on Algorand network are not rewarded (2023) for consensus participation but at the same time the cost of running a validators node is below $20 monthly and the minimum required stake is just a non-zero balance on the account (less than $1).\n\nParticipation is also very safe as compromised nodes do not leak any private keys, allowing more users to participate either on their own computers or by trusting their friends to host their participation bundle\\* for them.\n\n> Check out [POP’](https://pop.allo.info/) initiative that incentivises Validators with nice (and live) NFTs.\n\n**To start participation one just:**\n\n-   makes sure to fund an account with some native Algo token.\n-   installs Algorand participation node — eg using [Algorun](https://github.com/algorandfoundation/algorun).\n-   generates participation bundle\n-   signs and sends participation bundle registration transaction  \n    — eg using [Allo’CTRL](https://github.com/AlgoNode/alloctrl)\n\n\\*Participation bundle (participation keys) is a collection of ephemeral, quantum-resistant Falcon keys valid for a certain block (date) range — up to 5 months. It is the bundle, not Validator’s private keys, that is used to authenticate votes and block proposals."}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Algorand participation state machine","url":"https://nodely.io/blog/data-mining-4-participating-accounts/#algorand-participation-state-machine","text":"Committing a valid participation bundle registration transaction changes the state of the Validator’s account to **online.** All participating nodes expect votes and proposals to be submitted by Validator’s node during the validity period of the bundle. The **online** state of the account switches to **offline** when one of the following events takes place:\n\n-   the account is closed out (amount of Algo falls to 0)\n-   Validator commits unregister transaction\n-   participation bundle validity expires  \n    and any transaction that modifies Validator’s account state takes place\n\nAbove shows that online status might be misleading as accounts are still marked as online after they stop voting due to bundle expiration. This is intended behaviour as the ledger cannot be updated without someone paying a transaction fee.\n\n[_Algonode.io_](https://algonode.io/) _developed an off-chain solution that scans for expired participations and sends 1 µAlgo transaction with a special note to both help label the account offline and notify the Validator of the expiry event._\n\nTo properly calculate the current number of participating accounts one has to use the online flag and check if the bundle is not expired.\n\n```sql\nSELECT\n  COUNT() onlineAccounts\n  intDiv(sum(microalgos),1000000) onlineVotingAlgo\n  ,intDiv(max(microalgos),1000000) largestAStake\n  ,intDiv(avg(microalgos),1000000) averageAStake\n  ,intDiv(quantileExact(0.15)(microalgos),1000000) q15\n  ,intDiv(quantileExact(0.25)(microalgos),1000000) q25\n  ,intDiv(quantileExact(0.50)(microalgos),1000000) q50\n  ,intDiv(quantileExact(0.75)(microalgos),1000000) q75\n  ,intDiv(quantileExact(0.95)(microalgos),1000000) q95\nFROM\n  mainnet.account final\nWHERE\n  is_online\n  and vote_last > (select MAX(round) FROM mainnet.txn)\n```\n\nAbove SQL query can be used to calculate current number of non expired online accounts as well as total, largest and average voting stakes in Algos along with quantiles.\n\n![](https://cdn-images-1.medium.com/max/800/1*NSb2Eh9O4VIjN4RvECnP9A.png)"}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Getting accurate historical participation data","url":"https://nodely.io/blog/data-mining-4-participating-accounts/#getting-accurate-historical-participation-data","text":"Algorand ledger datasets available publicly or commercially contain only current account state and transaction history, no precomputed or sampled participation data.\n\nLet’s try to calculate historical data using only transaction information.\n\n> Calculations are ignoring Genesis accounts with initial online state.  \n> Genesis keys had validity up to block 3 million so after that block our calculations are 100% correct.\n\nBefore we calculate the number of concurrently registered keys we have to find out all **true¹** start and stop events block numbers (rounds).\n\nLet’s take the round (R1) of a key registration transaction that has\n\n-   the first valid round for the participation bundle less than R1\n-   the last valid round for the bundle greater than R1.\n\nThis will be our start event.\n\nA stop event round number (R2) will be the lowest of the:\n\n-   end of the validity period for the participation bundle\n-   next registration TX\n-   account close TX\n-   next key unregistration / offline TX\n\nTo calculate this event using ClickHouse SQL dialect we use a special LEFT ASOF JOIN that searches for the first matching row on the right side.  \nNotice that we are replacing 0 (missing) values with INTMAX as ClickHouse hates NULLs by default. We also use extended Algorand transaction annotations available for us in this analytics solution.\n\n```sql\nCREATE VIEW allregevents AS\nSELECT\n  realtime\n  ,toUInt64(t.snd_addr_id) snd_addr_id    -- account ID\n  ,toUInt64(t.round + 1) r1               -- reg. start round\n  ,toUInt64(                              -- calculated reg. end round\n    min2(\n      JSONExtractUInt(t.txn_extra ,'votelst'),\n      if(t2.round = 0,9223372036854775800, t2.round)\n    )) r2\nFROM\n  mainnet.txn t left asof join mainnet.txn t2\n    on (\n      t.snd_addr_id = t2.snd_addr_id\n      and t2.type_ext in ('key_reg','key_unreg','acc_close')\n      and t2.round > t.round\n    )\nWHERE\n  t.type_ext = 'key_reg'\n  and JSONExtractUInt(t.txn_extra ,'votelst') > t.round\n```\n\nWith this view, we can now split start and end events into separate rows and calculate cumulative sum to get concurrent active participations.  \nWe also filter out future (key expiry) events.\n\n```sql\nWITH events as (\n  SELECT\n    r1 rnd, 1 v   -- Add 1 for start of validity\n  FROM\n    allregevents\nUNION ALL\n  SELECT\n    r2 rnd, -1 v  -- Substract 1 for end of validity\n  FROM\n    allregevents\n) SELECT\n    rnd\n    ,sum(v) OVER (ORDER BY rnd ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) vs\n  FROM\n    events\n  WHERE\n    rnd < (select max(round) from mainnet.txn t )\n  ORDER BY rnd;\n```\n\nIt takes ~10 seconds to calculate all concurrent active online accounts over the 1B transaction mainnet history. One can verify that the last entry matches the value of online accounts as calculated from the current account state.\n\nThis query returns full granularity with round numbers instead of dates.  \nTo create a nice graph with the number of active online accounts at the end of each day we can use “sampling” over the _allregevents_ view.\n\nUnfortunately, ClickHouse does not support correlated subqueries so we have to go full cartesian in this case. Fortunately, this query takes only 15s to complete.\n\n```sql\nWITH rng AS (  -- Get last round for each day\n  SELECT\n   DATE(realtime) realtime\n   ,max(round) round\n  FROM mainnet.block_stats\n  GROUP BY 1\n) SELECT       -- Get number of active registrations for each round/day\n  realtime day\n  , count() online\n  , round\n FROM rng CROSS JOIN allregevents\n WHERE r1 < rng.round AND r2 > rng.round\n GROUP BY realtime, round\n ORDER BY 1;\n```\n\n![](https://cdn-images-1.medium.com/max/800/1*DLArtdkHZPWvYfiMxWKRuQ.png)\n\nOnline account with nonexpired participation keys\n\nWatch out for upcoming articles on calculating historical balance and historical stake.\n\n* * *\n\n**\\[1\\]** There is an additional 320 block delay (~15 minutes) between register /unregister events and stake change being considered by nodes. This is to prevent any quick gains due to stake manipulation."}
{"id":"/blog/data-mining-4-participating-accounts/","title":"Data mining Algorand for participating accounts","markdownUrl":"https://nodely.io/blog/data-mining-4-participating-accounts.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Resources:","url":"https://nodely.io/blog/data-mining-4-participating-accounts/#resources","text":"_Queries and charts in this article have been executed on a commercial Allo.info analytics platform that is based on a distributed ClickHouse Algorand dataset and Apache SuperSet self-service BI frontend._\n\nSee also:\n\n-   [Algorand consensus protocol](https://developer.algorand.org/docs/get-details/algorand_consensus/)\n-   [Metrika Algorand Participation Dashboard](https://app.metrika.co/algorand/dashboard/consensus-participation?tr=1d)\n-   [Algorand Metrics Dashboard](https://metrics.algorand.org/)\n-   [Running participation node](https://github.com/algorandfoundation/algorun)\n\n[#guide](https://nodely.io/tags/guide)[#Algorand](https://nodely.io/tags/Algorand)[#sql](https://nodely.io/tags/sql)[#consensus](https://nodely.io/tags/consensus)"}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"New limits for the free Algorand API from 1 January 2027","url":"https://nodely.io/blog/free-tier-2027/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![New limits for the free Algorand API from 1 January 2027](https://nodely.io/_astro/hero.DOCnKBAK_Z2rMW9K.webp)"}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"New limits for the free Algorand API from 1 January 2027","url":"https://nodely.io/blog/free-tier-2027/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nNov 10, 2026\n\n[services](https://nodely.io/categories/services)\n\nOur [free Algorand API](https://nodely.io/docs/free/start) stays free, with no key and no sign-up. From **1 January 2027, 00:00 UTC**, its limits change. Until then nothing changes."}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"What changes","url":"https://nodely.io/blog/free-tier-2027/#what-changes","text":"|  | Until 31 December 2026 | From 1 January 2027 |\n| --- | --- | --- |\n| Daily quota, per IP and per site | 200k requests or 5 GB | 128k requests or 2 GB |\n| Requests per second, per IP | 60 | 30 |\n| Bot traffic (no browser `Referer` or `Origin`), per IP | no separate limit | 5 requests per second |\n| Concurrent calls, per IP | 10 | 10 |\n| Added latency, backend and bot requests | 50 ms | 50 ms or more |\n\nThe quota still resets at 00:00 UTC, and the free tier still answers `403` as an IP or a site nears it. Details: [fair usage policy](https://nodely.io/docs/free/policy/) and [quotas and rate limits](https://nodely.io/docs/access/limits/)."}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"Why","url":"https://nodely.io/blog/free-tier-2027/#why","text":"The free tier is shared by thousands of apps and the people using them. Most of its load now comes from backends and bots that poll the same data around the clock, not from browsers: over the last 30 days, 95 % of the free API’s 39 million requests a day had no browser behind them (no `Referer` and no browser user agent). The new limits keep the free tier fast for the apps it was built for: browser dApps, prototypes and light backends. A separate, lower rate for bot traffic stops one script from crowding out everyone on the same edge."}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"What stays the same","url":"https://nodely.io/blog/free-tier-2027/#what-stays-the-same","text":"-   No key and no sign-up on the public `nodely.dev` hosts.\n-   MainNet, TestNet, BetaNet, FNet and Voi.\n-   Time travel on TestNet. MainNet [history](https://nodely.io/docs/access/time-travel/), free since November, moves to the paid plans on 1 January 2027.\n-   The IPFS gateway: a free account can now authorize one site in the [Nodely portal](https://portal.nodely.io/).\n-   The [public usage dashboard](https://g.nodely.io/d/nodelyapi/), so you can see where your app stands."}
{"id":"/blog/free-tier-2027/","title":"New limits for the free Algorand API from 1 January 2027","markdownUrl":"https://nodely.io/blog/free-tier-2027.md","updatedAt":"2026-11-10T15:00:00.000Z","heading":"If your app needs more","url":"https://nodely.io/blog/free-tier-2027/#if-your-app-needs-more","text":"-   **Boost** opens in December 2026: $32 a month for your own endpoint with an API token, 256k requests and 4 GB a day that no one else shares, 120 requests per second, 7-day analytics and time travel on MainNet. Need more on a busy day? Add up to 7 blocks of 256k requests and 4 GB for $32 a month each.\n-   **Unlimited** ($256 a month, or $212 a month paid annually) has no daily quota, no added latency, the commercial `nodely.io` hosts, a 99.99 % SLO on Algorand and full time travel.\n\nEverything each plan includes is on the [pricing page](https://nodely.io/pricing). Open-source projects without a token can still [apply for free Unlimited access](https://nodely.io/docs/unlimited/public-goods-projects/).\n\nQuestions about your app’s traffic? Write to [support@nodely.io](mailto:support@nodely.io) or ask in our [community channel](https://discord.gg/AnH2s9dMkN).\n\n[#API](https://nodely.io/tags/API)[#Algorand](https://nodely.io/tags/Algorand)[#free tier](https://nodely.io/tags/free-tier)[#pricing](https://nodely.io/tags/pricing)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"Blog","url":"https://nodely.io/blog/","text":"[All posts](https://nodely.io/blog)[Categories](https://nodely.io/categories)[Tags](https://nodely.io/tags)\n\n[\n\n![New limits for the free Algorand API from 1 January 2027](https://nodely.io/_astro/hero.DOCnKBAK_Z2rMW9K.webp)\n\n](https://nodely.io/blog/free-tier-2027/)\n\nNov 10, 2026[services](https://nodely.io/categories/services)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[New limits for the free Algorand API from 1 January 2027](https://nodely.io/blog/free-tier-2027/)","url":"https://nodely.io/blog/","text":"From 1 January 2027 the free Algorand API allows 128k requests or 2 GB a day, 30 req/s and 5 req/s for bots. Boost opens in December 2026.\n\n[\n\n![Time travel on our public Algorand API, powered by dt-algorand](https://nodely.io/_astro/hero.Cxd6YLq2_Z19YfwX.webp)\n\n](https://nodely.io/blog/algorand-api-time-travel/)\n\nNov 6, 2026[services](https://nodely.io/categories/services)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[Time travel on our public Algorand API, powered by dt-algorand](https://nodely.io/blog/algorand-api-time-travel/)","url":"https://nodely.io/blog/","text":"Read any account, asset, app or box at any past round and dry-run transactions there. Free for now on our public Algorand API.\n\n[\n\n![AVAIL: a virtual validator for Algorand](https://nodely.io/_astro/hero.CIXXG1hA_Z109OCm.webp)\n\n](https://nodely.io/blog/avail-virtual-validator/)\n\nNov 6, 2026[services](https://nodely.io/categories/services)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[AVAIL: a virtual validator for Algorand](https://nodely.io/blog/avail-virtual-validator/)","url":"https://nodely.io/blog/","text":"We run and rotate your Algorand participation keys. You keep custody of your ALGO and pay per key, not per stake.\n\n[\n\n![Ariadne: investigation and monitoring for Algorand](https://nodely.io/_astro/hero.CZO0Ma_b_29uhjt.webp)\n\n](https://nodely.io/blog/ariadne-investigation-workspace/)\n\nNov 5, 2026[services](https://nodely.io/categories/services)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[Ariadne: investigation and monitoring for Algorand](https://nodely.io/blog/ariadne-investigation-workspace/)","url":"https://nodely.io/blog/","text":"Watch your dApps, follow funds hop by hop and confirm every label. For Nodely enterprise customers, by invitation.\n\n[\n\n![Algorand node counting](https://nodely.io/_astro/birds.CJX7Jazq_Z2q00np.webp)\n\n](https://nodely.io/blog/algorand-node-counting/)\n\nMay 16, 2025[article](https://nodely.io/categories/article)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[Algorand node counting](https://nodely.io/blog/algorand-node-counting/)","url":"https://nodely.io/blog/","text":"Estimating the size of the Algorand network with ecological sampling techniques such as capture-recapture, applied to pseudonymous blockchain nodes.\n\n[\n\n![Algorand Cloud Node installation](https://nodely.io/_astro/nodefaq.Dl9_LANF_ZkrmV3.webp)\n\n](https://nodely.io/blog/algorand-node-setup/)\n\nDec 11, 2024[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/","title":"Blog","markdownUrl":"https://nodely.io/blog.md","heading":"[Algorand Cloud Node installation](https://nodely.io/blog/algorand-node-setup/)","url":"https://nodely.io/blog/","text":"Quick guide to running an Algorand node on a rented cloud VM: choosing a server, installing the node and getting ready to stake and vote."}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"To VRF or not to Vote?","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![To VRF or not to Vote?](https://nodely.io/_astro/vrf_1.DCY5UJcf_Vmq2E.webp)"}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"To VRF or not to Vote?","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nSep 25, 2023\n\n[guides](https://nodely.io/categories/guides)"}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"VRF voting on Algorand","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#vrf-voting-on-algorand","text":"Algorand uses [VRF](https://developer.algorand.org/docs/get-details/algorand_consensus/) as the base for fast and decentralized consensus.  \nOn each round, only selected nodes know it is their time to propose or vote while all other nodes can confirm and quickly verify such proposals and votes. Each proposal fights with around 20 other proposals each round and the winning one with the lowest hash is chosen in two rounds of voting.\n\nAlgorand accounts take part in consensus by registering online on a dedicated participating node. While the [process of onlining an account](https://developer.algorand.org/docs/run-a-node/participate/) is fairly straightforward, some things remain unclear:\n\n-   What is the frequency of my votes?\n-   When exactly does my node start and stop voting?\n-   When is it safe to shut my node down?\n-   Can I stop my participation by draining my account?\n-   Can I confirm the number of my soft/cert votes?\n\nLet’s do some tests and answer all of them."}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Proposal frequency","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#proposal-frequency","text":"The proposal frequency is directly proportional to the fraction of the account stake vs. the total online stake. Over longer periods of time, an account with an average of 0.01% of the total online stake can expect to be the winning proposer for 0.01% of rounds.\n\n![](https://cdn-images-1.medium.com/max/800/1*jhwvOiNHof9-mvSk0VkjfA.png)\n\nA large-scale observation of mainnet proposal frequency across Q2’2023 shows 1:1 correlation for accounts that had no technical issues with their nodes.\n\n**Example:** With 1.8B Algo online the rate of proposals for an account with 10,000 Algo is going to be around 4 per month.\n\nAll of the winning proposals are written down to the ledger and can be accessed using explorers, or node API."}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Voting frequency","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#voting-frequency","text":"Account voting power is proportional to the stake fraction but the frequency of voting has a non-linear correlation because of the underlying cryptographic sortition algorithm.\n\nSoft and cert voting steps have different “voting frequency curves” that depend on both stake fraction and required voting committee size. Accounts with over 0.15% stake have per round soft-vote freq close to 1. This means that they vote almost every round — just with an assigned weight that is proportional to the stake fraction.\n\n![](https://cdn-images-1.medium.com/max/800/1*UKYlIVgKrZSJexI91uraxQ.png)\n\nsoft voting per round frequency\n\n![](https://cdn-images-1.medium.com/max/800/1*dCbjTQtUB67wSkgVmxFB3w.png)\n\ncert voting per round frequency\n\n![](https://cdn-images-1.medium.com/max/800/1*jpk6kuvpGVAW1ggK01EWaw.png)\n\nAs the voting process is probabilistic the observed frequency matches the expected frequency only over sufficiently many samples (number of rounds)\n\n![](https://cdn-images-1.medium.com/max/800/1*2Vget3D7q97kT3f6p1nSQQ.png)\n\nA one-week mainnet soft voting performance observation\n\n**Example:** With 1.8B Algo online the rate of soft voting for an account with 10,000 Algo is going to be around 1 per 60 rounds. An account with over 1M Algo is going to soft vote every round but with more and more weight — relative to its stake fraction."}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Vote frequency is lagging …","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#vote-frequency-is-lagging-","text":"When you online an account or increase your stake the network is only going to “notice” this after 320 rounds. Sames goes for decreasing the stake, marking your account offline, and **closing out the account.**\n\nThe ground rule is : your voting frequency/power always changes 320 rounds after the transaction that introduced the change gets committed to the ledger.\n\nParticipation also stops when your registration key expires — but this time exactly at the lastVotingRound from your registration transaction.\n\n**Fun fact:** the account’s online flag does not clear itself once your key expires. It clears as soon as there is any transaction activity on your account. There is an off-chain bot maintained by Algonode that detects expired keys and sends a 0.000001 Algo transaction with a note to both clear the online flag and notify the user that his account no longer participates.\n\nThis simple set of rules has the following non-obvious effects:\n\n-   Your node continues to vote for 320 rounds (~17 minutes) after you offline your account\n-   You have to renew your registration earlier than 320 rounds before it expires to make sure it votes without interruptions.\n-   You have to check both the online flag and the last registration key’s expiration round to make sure that an account is really participating\n-   You can have accounts, nowhere to be seen in the ledger, casting votes for up to 17 minutes after their deletion\n-   Registering a new participation key invalidates the previous one — there is no support for overlapping keys"}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Where are my votes?","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#where-are-my-votes","text":"Soft votes are propagated by relays irrelevant of their timing but do not get recorded into the blockchain. Only off-chain solutions can capture and report soft voting performance using node logs or telemetry. The tools section has links to existing projects that do exactly that.\n\nEach node, due to network propagation delays, receives the cert votes in a different order but once the sum of verified vote weights gets above the 75% threshold the round is concluded and written down in the ledger. Each node decides for itself and does not synchronize the decision with others. This makes Algorand fast but also makes it impossible to tell whose votes certified which block as nodes have different sets of recorded votes.\n\nThis might create a statistical bias in the vote certification record if proposing stake is concentrated in one geographical area. Users with slower nodes, congested network, or just far away from most proposers are going to have a lower number of cert votes recorded across nodes. It is therefore normal to see a big discrepancy between the number of casted and recorded certification votes."}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Tools worth checking out","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#tools-worth-checking-out","text":"-   [AlloCtrl](https://github.com/AlgoNode/alloctrl): Simple GUI to manage your node/account online status\n-   [Proofs of Participation (PoP)](https://pop.allo.info/): Participation NFTs and vote counters\n-   [Allo Alerts](https://alerts.allo.info/): Soft Voting performance monitoring and alerting\n\n* * *"}
{"id":"/blog/to-vrf-or-not-to-vote/","title":"To VRF or not to Vote?","markdownUrl":"https://nodely.io/blog/to-vrf-or-not-to-vote.md","updatedAt":"2023-09-25T00:00:00.000Z","heading":"Acknowledgments","url":"https://nodely.io/blog/to-vrf-or-not-to-vote/#acknowledgments","text":"I would like to thank the [Voi chain](https://x.com/Voi_Net?s=20), an Algorand-based app chain, for allowing me to be a 🐋 long enough to collect timing data for this article.\n\n[#guide](https://nodely.io/tags/guide)[#tps](https://nodely.io/tags/tps)[#Algorand](https://nodely.io/tags/Algorand)[#performance](https://nodely.io/tags/performance)"}
{"id":"/blog/token-decentralization/","title":"Token decentralization on Algorand","markdownUrl":"https://nodely.io/blog/token-decentralization.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Token decentralization on Algorand","url":"https://nodely.io/blog/token-decentralization/","text":"[\n\nBack to all posts\n\n](https://nodely.io/blog)\n\n![Token decentralization on Algorand](https://nodely.io/_astro/tokens_1.DNB_57Hx_Z1rL66o.webp)"}
{"id":"/blog/token-decentralization/","title":"Token decentralization on Algorand","markdownUrl":"https://nodely.io/blog/token-decentralization.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Token decentralization on Algorand","url":"https://nodely.io/blog/token-decentralization/","text":"![Urtho](https://nodely.io/_astro/gndx-astro-avatar_Z1MHJeJ.webp)\n\nUrtho\n\nJul 23, 2022\n\n[guides](https://nodely.io/categories/guides)\n\nLet’s have some fun and use state-of-the-art methods to measure the decentralization index of various tokens on Algorand."}
{"id":"/blog/token-decentralization/","title":"Token decentralization on Algorand","markdownUrl":"https://nodely.io/blog/token-decentralization.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Decentralization Index","url":"https://nodely.io/blog/token-decentralization/#decentralization-index","text":"Blockchain decentralization metrics are a relatively unresearched area with very few published papers.\n\nOne of the recent ones called “SoK: Blockchain Decentralization”¹ introduces an index based on the amount of “randomness ”in transaction value. This index can be calculated using formula (1) where P(vi) denotes the transaction weight concerning the total transaction value.\n\n![](https://cdn-images-1.medium.com/max/800/1*V4YgGcZITaHarTV9st45UQ.png)\n\n(1)\n\nLooks scary but is just a sum of 2 to the power of Shannon’s entropy of all transaction values within a chosen time range.\n\n![](https://cdn-images-1.medium.com/max/800/1*KYYNrFohz2G-_8oVAaT64Q.png)"}
{"id":"/blog/token-decentralization/","title":"Token decentralization on Algorand","markdownUrl":"https://nodely.io/blog/token-decentralization.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Calculating the index using SQL","url":"https://nodely.io/blog/token-decentralization/#calculating-the-index-using-sql","text":"With access to Allo.info SelfService BI calculating entropy and the Decentralization Index for native Algo token is as simple as:\n\n```sql\nSELECT\n date(realtime) day                  -- daily bins\n , pow(2,entropy(amount_dec)) H      -- Decentralizaction Index value\n , sum(amount_dec) algos             -- total Algos transacted\n , count() cnt                       -- total transactions of interest\nFROM\n  mainnet.txn\nWHERE\n  `type` = 'pay'                     -- only native token transactions\n  and amount_dec > 0                 -- only with non zero value transacted\n  and realtime >= '2023-01-01'       -- only year 2023\nGROUP BY 1                           -- group into daily bins\nORDER BY 1                           -- sort nicely\n```\n\n2 seconds and 160M transactions later we get a chart like below.  \nThe chart has applied 30-day moving average to be in line with the methodology used in the paper.\n\n![](https://cdn-images-1.medium.com/max/800/1*lnf63yX3A_6ljLb5eYC78A.png)\n\nAlgorand native token decentralization index in 2023\n\n![](https://cdn-images-1.medium.com/max/800/1*Zzia2yOCZu0Fd_UHf4olRA.gif)\n\nA quick real-time behind-the-scenes chart creation"}
{"id":"/blog/token-decentralization/","title":"Token decentralization on Algorand","markdownUrl":"https://nodely.io/blog/token-decentralization.md","updatedAt":"2022-07-23T00:00:00.000Z","heading":"Decentralization of the native token vs…","url":"https://nodely.io/blog/token-decentralization/#decentralization-of-the-native-token-vs","text":"Let’s proceed to the comparison of Algo to the established cross-chain reference token — the [**$COOP token**](https://algonaut.space/coop-coin/).  \nIs the “most decentralized” token more decentralized than Algo when comparing using state of art methodology?\n\nTo get $COOP decentralization index we tweak the SQL a bit:\n\n```sql\nSELECT\n date(realtime) day                  -- daily bins\n , pow(2,entropy(amount_dec)) H      -- Decentralizaction Index value\n , sum(amount_dec) COOP              -- total $COOP transacted\n , count() cnt                       -- total transactions of interest\nFROM\n  mainnet.txn\nWHERE\n  asset_id = 796425061               -- filter only $COOP TX\n  and `type_ext` = 'asa_transfer'    -- only token transfer TX\n  and amount_dec > 0                 -- only with non zero value transacted\nGROUP BY 1                           -- group into daily bins\nORDER BY 1                           -- sort nicely\n```\n\nLet’s get them both on the same chart and see.\n\n![](https://cdn-images-1.medium.com/max/800/1*_8-NMeyPkwlKmG-Og3npOg.png)\n\nThis proves that $COOP is more decentralized than Algo using the latest available research in the field.\n\nComparing the index of other tokens is left as an exercise for the reader.  \nAlso, we don’t want to dethrone $COOP by being too rigorous😉\n\n* * *\n\n\\[1\\]: [Zhang, Luyao, Xinshi Ma, and Yulin Liu. “SoK: Blockchain Decentralization.” _arXiv preprint arXiv:2205.04256_ (2022).](https://arxiv.org/abs/2205.04256)\n\n[#guide](https://nodely.io/tags/guide)[#Algorand](https://nodely.io/tags/Algorand)[#sql](https://nodely.io/tags/sql)[#tokens](https://nodely.io/tags/tokens)[#decentralization](https://nodely.io/tags/decentralization)"}
{"id":"/categories/","title":"Categories","markdownUrl":"https://nodely.io/categories.md","heading":"Categories","url":"https://nodely.io/categories/","text":"[All posts](https://nodely.io/blog)[Categories](https://nodely.io/categories)[Tags](https://nodely.io/tags)\n\n-   [services](https://nodely.io/categories/services \"View posts with the tag: services\")\n-   [guides](https://nodely.io/categories/guides \"View posts with the tag: guides\")\n-   [article](https://nodely.io/categories/article \"View posts with the tag: article\")\n-   [FAQ](https://nodely.io/categories/FAQ \"View posts with the tag: FAQ\")"}
{"id":"/contact/","title":"Discuss Your Enterprise Deployment","markdownUrl":"https://nodely.io/contact.md","heading":"Let’s discuss your deployment","url":"https://nodely.io/contact/","text":"Private or hybrid networks, dedicated infrastructure, or post-quantum planning.  \nTell us what you’re building.\n\nName\n\nWork email\n\nWhat would you like to discuss?\n\nProject requirements\n\n![/\\_astro/phone.ClYZZTe0.svg](https://nodely.io/_astro/phone.ClYZZTe0_t0lC4.svg)\n\nPhone+48 690 145 547\n\n![/\\_astro/email.BUjWEhu4.svg](https://nodely.io/_astro/email.BUjWEhu4_t0lC4.svg)\n\nEmailsales@nodely.io\n\n![/\\_astro/map.DJYNFIQR.svg](https://nodely.io/_astro/map.DJYNFIQR_t0lC4.svg)\n\nAddress\n\n1.  Żwanowiecka 53, 04-849\n2.  Warsaw, Poland\n\nConnect with our engineers and the Algorand ecosystem"}
{"id":"/contact/","title":"Discuss Your Enterprise Deployment","markdownUrl":"https://nodely.io/contact.md","heading":"Join the community","url":"https://nodely.io/contact/","text":"[![](https://nodely.io/_astro/linkedin.DL1ZLUwv_1W2840.png)](https://www.linkedin.com/company/nodely)[![](https://nodely.io/_astro/telegram.DyYwLvsa_1PX4ST.png)](https://t.me/AlgoNode)[![](https://nodely.io/_astro/discord.Ct3uCngN_rzira.png)](https://discord.gg/AnH2s9dMkN)[![](https://nodely.io/_astro/github.D2ba_Vmz_ZEzeXy.png)](https://github.com/algonode)[![](https://nodely.io/_astro/x.B93jVa7j_13R6bY.png)](https://twitter.com/AlgoNode_io)[![](https://nodely.io/_astro/mail.DhDHUxfK_AlxCb.png)](mailto:sales@nodely.io)"}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"AI models","url":"https://nodely.io/docs/access/ai-models/","text":"Unlimited and Enterprise include Nodely-hosted AI models: text embeddings, image and text embeddings, and a 125B-parameter chat model with built-in web search and page reading. The API is OpenAI-compatible, so the official OpenAI SDKs and most AI frameworks work by changing the base URL and the key. There is **no token quota**: each endpoint has an hourly budget, a per-minute burst limit and an in-flight limit per model instead.\n\n| Plan | AI models |\n| --- | --- |\n| Free | Not included |\n| Boost | Add-on: AI 125B-A6B, no quota $16 / month, the Unlimited limits with 32k chat context |\n| Unlimited | Included: embeddings and a 125B-parameter chat model with web search, 256k context. Hourly budgets, no token quota |\n| Enterprise | The same as Unlimited |\n\n| Add-on | Plans | Price, excl. VAT | What it adds |\n| --- | --- | --- | --- |\n| AI 125B-A6B, no quota | Boost | $16 / month | Every model at the Unlimited plan's hourly limits: text embeddings, image and text embeddings and the 125B-parameter chat model with built-in web search and page reading (fair use), with a 32k chat context (Unlimited: 256k). |\n| AI Throughput ×2 | Unlimited, Enterprise | $16 / month | Twice the hourly budgets and per-minute burst of the embedding models. Chat, in-flight and per-request limits stay the same. Limited availability. |\n\nAn organization admin can upgrade or add an AI add-on on the [Billing page](https://portal.nodely.io/billing)."}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"Base URL and key","url":"https://nodely.io/docs/access/ai-models/#base-url-and-key","text":"-   Base URL: `https://ai.api.nodely.io/v1`\n-   Key: any active token of one of your endpoints, the same token you use for the Algorand APIs, as `Authorization: Bearer <token>` (what the OpenAI SDKs send) or `X-API-Key: <token>`. Whitelisted sites and IPs do not grant AI access: a token is always required.\n-   Limits and usage are per endpoint and shared by its tokens. Keep tokens server-side."}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"Models","url":"https://nodely.io/docs/access/ai-models/#models","text":"| `model` | Model | Per request |\n| --- | --- | --- |\n| `qwen3-embedding-4b` | Qwen3-Embedding-4B: Text embeddings, 2560 dimensions (request fewer with the dimensions parameter), 32k context. | up to 64 inputs per request; up to 8,192 estimated tokens (about 24 KB of text) per input; up to 32,768 estimated tokens (about 96 KB) per request |\n| `qwen3-vl-embedding-2b` | Qwen3-VL-Embedding-2B: Images and text in one 2048-dimension space: search images with text, or images with images. | 1 image per request, sent as a data: URL; request body up to 8 MiB |\n| `nodely-chat` | Nodely fast chat: A 125B-parameter chat model with built-in web search and page reading (OpenAI chat completions, streaming). | context (prompt + max\\_tokens) up to 262,144 tokens on Unlimited and Enterprise, 32,768 on Boost with the AI add-on: a prompt that does not fit is refused with context\\_length\\_exceeded; output capped at 8,192 tokens: a larger or missing max\\_tokens / max\\_completion\\_tokens is set to 8,192 (not refused); reasoning tokens count, and a cut-off answer ends with finish\\_reason \"length\"; one completion per request (n = 1) |"}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"Limits","url":"https://nodely.io/docs/access/ai-models/#limits","text":"Limits are per endpoint and per model: every token of an endpoint shares them, and each model has its own.\n\n| `model` | Plan | Requests / hour | Burst / minute | In flight | Tokens / hour | Context |\n| --- | --- | --- | --- | --- | --- | --- |\n| `qwen3-embedding-4b` | Unlimited, Enterprise, Boost + AI 125B-A6B, no quota | 10,000 | 600 | 4 | 3,000,000 input | – |\n| `qwen3-embedding-4b` | … with AI Throughput ×2 | 20,000 | 1,200 | 4 | 6,000,000 input | – |\n| `qwen3-vl-embedding-2b` | Unlimited, Enterprise, Boost + AI 125B-A6B, no quota | 2,000 | 120 | 2 | – | – |\n| `qwen3-vl-embedding-2b` | … with AI Throughput ×2 | 4,000 | 240 | 2 | – | – |\n| `nodely-chat` | Unlimited, Enterprise | 300 | 30 | 2 | 1,500,000 input, 300,000 output | 256k |\n| `nodely-chat` | Boost + AI 125B-A6B, no quota | 300 | 30 | 2 | 1,500,000 input, 300,000 output | 32k |\n\n-   Hourly budgets refill continuously: a budget you used up comes back a little every second (a full hour refills all of it), not all at once at the top of the hour. Burst / minute caps how fast the budget can be spent; in flight counts requests until their response ends, streams and web search rounds included.\n-   Tokens / hour: estimated input tokens for embeddings (checked before the request); input and output tokens for chat (counted from each response’s `usage`, web search and page reading included; a request is accepted while some budget is left).\n-   Context: prompt plus reply of one chat request. A reply is capped at 8,192 tokens, reasoning included.\n-   Token limits use the gateway's estimate, not a tokenizer's count: about UTF-8 bytes / 3 for ordinary text, so 8,192 estimated tokens are about 24 KB of text. The usage in each response is the model's exact count.\n-   Over a limit (hourly budget, burst, in flight) the API answers **HTTP 429** with an OpenAI-style error and `Retry-After` in seconds, so the OpenAI SDKs retry on their own.\n-   A request over a per-request cap is refused and not retried by the SDKs: **HTTP 400** (`too_many_inputs`, `input_too_long`, `request_too_long`, `too_many_images`, `context_length_exceeded`) or **HTTP 413** (`request_too_large`, body size). Split or shorten it.\n-   The output cap is applied, not checked: a larger or missing `max_tokens` is set to the cap, and an answer that reaches it ends with `finish_reason: \"length\"`.\n-   **HTTP 503** `server_busy` means the model is at capacity for all customers right now: retry in a few seconds.\n-   Web search and page reading are built into the chat model and covered by fair use. An endpoint that searches or reads far more than usual may find them unavailable for a while; the request still gets an answer.\n-   Error codes and usage analytics per endpoint and model: the portal’s [AI models docs](https://portal.nodely.io/docs/ai-models) (after sign-in)."}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"Examples","url":"https://nodely.io/docs/access/ai-models/#examples","text":"Text embeddings\n\n```bash\ncurl https://ai.api.nodely.io/v1/embeddings \\\n  -H \"Authorization: Bearer $NODELY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"qwen3-embedding-4b\", \"input\": [\"Algorand state proofs\"], \"dimensions\": 1024}'\n```\n\nImage and text embeddings share one vector space, so a text query finds matching images. The request uses the chat form, not `input`: `messages` with `add_generation_prompt: true`, images only as `data:` URLs (the gateway does not fetch image URLs).\n\nImage and text embeddings\n\n```bash\ncurl https://ai.api.nodely.io/v1/embeddings \\\n  -H \"Authorization: Bearer $NODELY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"qwen3-vl-embedding-2b\", \"add_generation_prompt\": true,\n       \"messages\": [{\"role\": \"user\", \"content\": [\n         {\"type\": \"image_url\", \"image_url\": {\"url\": \"data:image/png;base64,iVBORw0...\"}},\n         {\"type\": \"text\", \"text\": \"a red bicycle\"}]}]}'\n```\n\nThe chat model can search the web and read pages to ground its answer, without a search key of your own: add `\"nodely_tools\": [\"web_search\", \"web_fetch\"]` (either or both) to a `/chat/completions` request. Web search and page reading are included with the chat model and covered by fair use. Pages are condensed to their main text before the model reads them, so this is for grounding answers, not for downloading pages: for bulk search or scraping use the [x402 search and scrape APIs](https://nodely.io/docs/x402/).\n\nChat with web search (openai SDK)\n\n```ts\nimport OpenAI from \"openai\";\n\nconst ai = new OpenAI({ baseURL: \"https://ai.api.nodely.io/v1\", apiKey: process.env.NODELY_TOKEN });\n\nconst res = await ai.chat.completions.create({\n  model: \"nodely-chat\",\n  messages: [{ role: \"user\", content: \"What changed in the latest Algorand release?\" }],\n  // Nodely extension: the gateway searches the web and reads pages for the model\n  nodely_tools: [\"web_search\", \"web_fetch\"],\n});\n```"}
{"id":"/docs/access/ai-models/","title":"AI models","markdownUrl":"https://nodely.io/docs/access/ai-models.md","heading":"Fair use","url":"https://nodely.io/docs/access/ai-models/#fair-use","text":"-   There is no token quota: each endpoint has per-model hourly budgets, a burst limit and an in-flight limit instead.\n-   Use the models for your own products and workloads. Reselling raw model access, bulk dataset generation (for example to train other models) and abuse are not allowed.\n-   Built-in web search and page reading are fair use and are for answering requests, not for crawling sites or collecting data in bulk: pages are condensed to their main text and robots.txt is respected. For bulk search or scraping use the x402 search and scrape APIs.\n-   The models run on shared GPUs. Nodely may throttle endpoints whose traffic is far above other customers'; we contact you first when we can.\n-   The gateway logs each request's endpoint, model, status, timing and token counts, not its prompts or outputs.\n-   Models, their versions and the limits may change; the model names stay stable."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"Authentication","url":"https://nodely.io/docs/access/authentication/","text":"On a paid plan the edge ties each request to one of your endpoints in one of three ways, checked in this order:\n\n1.  **API token** in a request header: for backends, scripts and bots.\n2.  **Whitelisted site**: the request’s `Referer` header is on a domain you verified. For browser apps.\n3.  **Whitelisted IP**: the request comes from an address listed on the endpoint. For servers with fixed IPs. Unlimited and Enterprise only: Boost has no IP whitelisting.\n\nA request that matches none of them is anonymous and is not counted under your plan. You manage tokens, sites and IPs per endpoint in the [Nodely portal](https://portal.nodely.io/).\n\nThe examples below use the commercial `nodely.io` hosts of Unlimited and Enterprise. On Boost, send the same headers to the public `nodely.dev` hosts instead, for example `https://mainnet-api.4160.nodely.dev`."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"API tokens","url":"https://nodely.io/docs/access/authentication/#api-tokens","text":"Each endpoint can have up to 2 tokens on Boost and 3 on Unlimited. Send the token in **one** of these headers. Each of them works on both the node and the indexer hosts.\n\n| Header | Sent by |\n| --- | --- |\n| `X-Algo-API-Token` | Algod clients of the Algorand SDKs (`algosdk.Algodv2`, py-algorand-sdk `AlgodClient`, …) |\n| `X-Indexer-API-Token` | Indexer clients of the SDKs (`algosdk.Indexer`, `IndexerClient`, …) |\n| `X-API-Key` | Anything else: curl, plain HTTP clients, reverse proxies |\n\n**curl**\n\n```bash\n# Token from the portal, kept in an environment variable\ncurl -H \"X-API-Key: $NODELY_TOKEN\" https://mainnet-api.4160.nodely.io/v2/status\n\ncurl -H \"X-Indexer-API-Token: $NODELY_TOKEN\" \\\n  \"https://mainnet-idx.4160.nodely.io/v2/transactions?limit=1\"\n```\n\n**JavaScript**\n\n```js\n// npm install algosdk\nimport algosdk from \"algosdk\";\n\nconst token = process.env.NODELY_TOKEN;\n\n// The SDK sends a string token as X-Algo-API-Token (algod) or X-Indexer-API-Token (indexer).\nconst algod = new algosdk.Algodv2(token, \"https://mainnet-api.4160.nodely.io\", 443);\nconst indexer = new algosdk.Indexer(token, \"https://mainnet-idx.4160.nodely.io\", 443);\n\n// Or choose the header yourself.\nconst algodWithKey = new algosdk.Algodv2({ \"X-API-Key\": token }, \"https://mainnet-api.4160.nodely.io\", 443);\n\nconsole.log(await algod.status().do());\n```\n\n**Python**\n\n```python\n# pip install py-algorand-sdk\nimport os\nfrom algosdk.v2client import algod, indexer\n\ntoken = os.environ[\"NODELY_TOKEN\"]\n\n# Sent as X-Algo-API-Token and X-Indexer-API-Token.\nalgod_client = algod.AlgodClient(token, \"https://mainnet-api.4160.nodely.io\")\nindexer_client = indexer.IndexerClient(token, \"https://mainnet-idx.4160.nodely.io\")\n\nprint(algod_client.status())\n```\n\nKeep tokens out of browsers and git\n\nAnything in a web page, a browser extension or a mobile app bundle can be read by its users. Use a [whitelisted site](https://nodely.io/docs/access/authentication/#browser-apps-whitelisted-sites) for browser apps, and keep tokens in environment variables or a secret store.\n\nTo rotate a token, add a new one to the endpoint, deploy it, then delete the old one. A deleted token stops working on the edges within a few minutes."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"Browser apps: whitelisted sites","url":"https://nodely.io/docs/access/authentication/#browser-apps-whitelisted-sites","text":"Add your domain to the endpoint in the portal and prove you own it in one of two ways:\n\n-   **DNS**: publish the TXT record the portal shows (`_nodely-verify.<domain>`).\n-   **File**: serve the token the portal shows at `https://<domain>/.well-known/nodely-verify.txt`, over HTTPS and without redirects to another host.\n\nOnce the site is verified, browser requests whose `Referer` is on that domain, or on any of its subdomains, count under your endpoint. There is no token in your frontend code.\n\n-   Whitelisting `example.com` covers `https://example.com/` and `https://app.example.com/`, over http or https and on any port.\n-   You need control of the domain’s DNS or of its web server, so use your own domain. Local development hosts such as `localhost` cannot be verified: develop against the free hosts, or call the API through a small backend that holds a token.\n-   Sites are counted per organization, over all its endpoints: Boost 1 (+ extra sites at $2 / month each), public goods 1, Unlimited 5, Enterprise 5. One list feeds both the API (Referer) whitelist and the IPFS gateway. An organization above its cap keeps the sites it verified first whitelisted; nothing is deleted, and the portal warns. A domain can be claimed by one organization only. On Boost, 1 verified site is included and each extra site is $2 / month; every verified site is whitelisted for both the API (Referer) and the IPFS gateway. See \\[IPFS gateway\\](#ipfs-gateway)."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"The Referer header must be sent","url":"https://nodely.io/docs/access/authentication/#the-referer-header-must-be-sent","text":"The edge recognises your site only from the `Referer` request header. Browsers send it by default: with the default `strict-origin-when-cross-origin` policy, a call to a Nodely host carries your origin, for example `Referer: https://app.example.com/`. That is all the edge needs.\n\nThe header is missing, and the request is anonymous, when:\n\n-   the page sets `Referrer-Policy: no-referrer`, as an HTTP header or as `<meta name=\"referrer\" content=\"no-referrer\">`;\n-   the request itself sets `referrerPolicy: \"no-referrer\"`;\n-   a privacy extension strips it.\n\nKeep the default policy, or use `origin` or `strict-origin`. To check, open the browser’s developer tools, select an API call on the Network tab and look for `Referer` under the request headers.\n\n```js\n// Works: the default policy sends https://app.example.com/ as the Referer.\nawait fetch(\"https://mainnet-api.4160.nodely.io/v2/status\");\n\n// Anonymous: no Referer, so the request is not counted under your plan.\nawait fetch(\"https://mainnet-api.4160.nodely.io/v2/status\", { referrerPolicy: \"no-referrer\" });\n```\n\nBackends should not set a `Referer` header to borrow a site whitelist: use a token or a whitelisted IP."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"Servers with fixed IPs: whitelisted IPs","url":"https://nodely.io/docs/access/authentication/#servers-with-fixed-ips-whitelisted-ips","text":"Add the public egress address of your servers, IPv4 or IPv6, to the endpoint. Requests from that address count under your endpoint without any header. Each endpoint can have up to 3 IPs on Unlimited; Boost has no IP whitelisting (use a token or a whitelisted site). An IP address can be whitelisted by one organization only.\n\nIP whitelisting suits servers behind a static IP or a NAT gateway. Serverless functions and other workloads with changing addresses should send a token."}
{"id":"/docs/access/authentication/","title":"Authentication","markdownUrl":"https://nodely.io/docs/access/authentication.md","heading":"IPFS gateway","url":"https://nodely.io/docs/access/authentication/#ipfs-gateway","text":"The public IPFS gateway at `https://ipfs.algonode.xyz` (backup `https://ipfs.algonode.dev`) serves whitelisted sites only. It also recognises sites from the `Referer` header, so the rules above apply to `<img>` and `fetch` loads alike.\n\n| Plan | Gateway access |\n| --- | --- |\n| Free | 1 verified site authorized in the portal, within the free daily quota |\n| Boost | 1 verified site whitelisted automatically; extra sites $2 / month each. IPFS gateway traffic of Boost sites counts toward the Boost daily quota. |\n| Unlimited | Any CID, 5 verified sites per organization whitelisted automatically, within a few minutes |\n| Enterprise | Any CID, 5 verified sites per organization whitelisted automatically, within a few minutes |\n| Public goods | Any CID, 1 verified site per organization whitelisted automatically, within a few minutes |\n\nOn Free, sign up in the [portal](https://portal.nodely.io/) and authorize your site's domain on its IPFS page: it is whitelisted on the gateway only (not on the API), shares the free daily quota of that site, and needs no endpoint or token. For more domains, or a hand-kept whitelist entry, email [support@nodely.io](mailto:support@nodely.io).\n\nWhitelisting is free for Algorand projects. The gateway serves JSON, images, audio and video, up to 100 req/s per IP for Algorand mainnet assets and 10 req/s for other content. Gateway traffic counts toward the free daily quota. More on caching, thumbnails and content rules: [IPFS gateway](https://nodely.io/docs/public/ipfs/)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"API access and plans","url":"https://nodely.io/docs/access/","text":"Nodely serves the Algorand node (algod) and indexer APIs, plus Voi and the IPFS gateway. You can use them without an account. A paid plan ties your requests to an **endpoint** in the portal: it gets its own limits, usage analytics and [time travel](https://nodely.io/docs/access/time-travel/) on mainnet. Boost runs on the public `nodely.dev` hosts; Unlimited and Enterprise get the low-latency commercial `nodely.io` hosts."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Plans at a glance","url":"https://nodely.io/docs/access/#plans-at-a-glance","text":"| Plan | Price | How the edge recognises you | Daily quota | Rate limit | Time travel |\n| --- | --- | --- | --- | --- | --- |\n| Free | $0 | Nothing to set up, no key | 128k requests or 2 GB per IP and per site | 30 req/s per IP, bots 5 req/s | Testnet time travel |\n| Boost | $32 / month, excl. VAT | Token or site | 256k requests and 4 GB per endpoint | 120 req/s per client IP, split across the region's edges | Basic time travel (mainnet and testnet) |\n| Unlimited | $256 / month, excl. VAT | Token, whitelisted site or IP | None | 600 req/s per client IP, split across the region's edges | Full time travel (mainnet and testnet) |\n| Enterprise | From $512 / month, excl. VAT | Token, site, IP or dedicated hosts | None | No API rate limit | Full time travel (mainnet and testnet) |\n\nEnterprise has everything Unlimited has, without API rate limits. On Free and Boost, backend and bot requests (no browser `Referer`) get 50 ms or more of added latency; browser apps get none, and Unlimited and Enterprise add none at all. Unlimited can also be paid annually: $212 / month, billed for 12 months; Boost is monthly only. Support response targets per plan: [Support](https://nodely.io/docs/access/support/).\n\nPrices are net: + 23 % VAT for buyers in Poland and EU consumers; no VAT for EU businesses with a valid VAT ID (reverse charge) and outside the EU.\n\nDaily quotas reset at 00:00 UTC. The responses you get at a limit are on [Quotas and rate limits](https://nodely.io/docs/access/limits/). Everything each plan includes is on the [pricing page](https://nodely.io/pricing)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Getting a paid plan","url":"https://nodely.io/docs/access/#getting-a-paid-plan","text":"1.  [Sign up in the Nodely portal](https://portal.nodely.io/register) and create your organization.\n2.  An organization admin picks Boost or Unlimited on the [Billing page](https://portal.nodely.io/billing) and pays by card (Stripe). Boost has 1 user per account; Unlimited and Enterprise have admin and viewer roles: viewers see endpoints and usage but cannot change them or billing.\n3.  Create an endpoint, then add what your app needs:\n    -   **Tokens** for backends, scripts and bots.\n    -   **Sites** for browser apps. You verify each domain with a DNS TXT record or a file on the site.\n    -   **IPs** for servers with fixed public addresses (Unlimited and Enterprise; Boost has no IP whitelisting).\n4.  Send the token: on Boost to the public `nodely.dev` hosts ([free hosts](https://nodely.io/docs/access/#free-no-key)), on Unlimited and Enterprise to the [commercial hosts](https://nodely.io/docs/access/#paid-plans-token-site-or-ip). See [Authentication](https://nodely.io/docs/access/authentication/).\n\nAn endpoint is one project: its tokens, sites and IPs share one set of usage analytics and, on Boost, one daily quota.\n\n| Plan | Endpoints | Tokens per endpoint | Sites | IPs per endpoint |\n| --- | --- | --- | --- | --- |\n| Boost | 1 | 2 | 1 | 0 |\n| Unlimited | 3 | 3 | 5 per organization | 3 |\n| Enterprise | Custom | Custom | 5 per organization | Custom |\n\nSites are counted per organization, over all its endpoints: Boost 1 (+ extra sites at $2 / month each), public goods 1, Unlimited 5, Enterprise 5. One list feeds both the API (Referer) whitelist and the IPFS gateway. An organization above its cap keeps the sites it verified first whitelisted; nothing is deleted, and the portal warns.\n\nChanges you make in the portal (a new token, a deleted site, an upgrade) reach the edges within a few minutes."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Free, no key","url":"https://nodely.io/docs/access/#free-no-key","text":"| Network | Node (algod) API | Indexer API |\n| --- | --- | --- |\n| Algorand MainNet | `https://mainnet-api.4160.nodely.dev` | `https://mainnet-idx.4160.nodely.dev` |\n| Algorand TestNet | `https://testnet-api.4160.nodely.dev` | `https://testnet-idx.4160.nodely.dev` |\n| Algorand BetaNet | `https://betanet-api.4160.nodely.dev` | `https://betanet-idx.4160.nodely.dev` |\n| Algorand FNet | `https://fnet-api.4160.nodely.dev` | `https://fnet-idx.4160.nodely.dev` |\n| Voi MainNet | `https://mainnet-api.voi.nodely.dev` | `https://mainnet-idx.voi.nodely.dev` |\n\n-   The older `algonode.cloud` hosts (for example `https://mainnet-api.algonode.cloud`) work the same way.\n-   Free hosts add an artificial delay to each response. The commercial hosts do not.\n-   Backup hosts on other CDNs are listed under [backup endpoints](https://nodely.io/docs/free/backup/). More networks are in the [endpoint matrix](https://nodely.io/docs/free/endpoints/)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Paid plans: token, site or IP","url":"https://nodely.io/docs/access/#paid-plans-token-site-or-ip","text":"| Network | Node (algod) API | Indexer API |\n| --- | --- | --- |\n| Algorand MainNet | `https://mainnet-api.4160.nodely.io` | `https://mainnet-idx.4160.nodely.io` |\n| Algorand MainNet, no US origins | `https://xna-mainnet-api.4160.nodely.io` | – |\n| Algorand TestNet | `https://testnet-api.4160.nodely.io` | `https://testnet-idx.4160.nodely.io` |\n| Algorand BetaNet | `https://betanet-api.4160.nodely.io` | `https://betanet-idx.4160.nodely.io` |\n| Voi MainNet | `https://mainnet-api.voi.nodely.io` | `https://mainnet-idx.voi.nodely.io` |\n\n-   The commercial `nodely.io` hosts only answer requests with a token or from a whitelisted site or IP, on Unlimited and Enterprise.\n-   Boost runs on the public `nodely.dev` hosts: send its token there to get the Boost quota, rate and analytics.\n-   TestNet and BetaNet have no SLO or SLA.\n-   For failover, your token also works on the secondary, backup and disaster hosts in [backup endpoints](https://nodely.io/docs/free/backup/#algorand-network-commercial-endpoints)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"IPFS gateway","url":"https://nodely.io/docs/access/#ipfs-gateway","text":"`https://ipfs.algonode.xyz/ipfs/<cid>`, with `https://ipfs.algonode.dev/ipfs/<cid>` as a backup. The gateway serves whitelisted sites only. Verified sites of Unlimited and Enterprise endpoints are whitelisted automatically; Boost includes 1 verified site whitelisted automatically; extra sites $2 / month each; Free: 1 verified site authorized in the portal, within the free daily quota. See [IPFS gateway access](https://nodely.io/docs/access/authentication/#ipfs-gateway)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Other networks","url":"https://nodely.io/docs/access/#other-networks","text":"| Network | Endpoint | Details |\n| --- | --- | --- |\n| Ethereum mainnet | `https://eth.nodely.dev` | [Ethereum public RPC](https://nodely.io/docs/ethereum/) |\n| Base mainnet | `https://base.nodely.dev` | [Base public RPC](https://nodely.io/docs/base/) |\n| Arc mainnet | `https://arc.nodely.dev` | [Arc public RPC](https://nodely.io/docs/arc/) |\n| Gno.land mainnet | `https://gnot.nodely.dev` | [Gno.land public RPC](https://nodely.io/docs/gno/) |\n| Monero mainnet and stagenet | `xmr.nodely.dev` | [Monero public node](https://nodely.io/docs/monero/) |\n\nThese are public RPCs without keys, each with the limits listed on its page. The plans, tokens and daily quotas described here cover the Algorand and Voi APIs and the IPFS gateway."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Do I need an API key?","url":"https://nodely.io/docs/access/#do-i-need-an-api-key","text":"Not for the free tier: call the free hosts directly. To have your traffic counted under a paid plan, send a token or call from a whitelisted site (or, on Unlimited and Enterprise, a whitelisted IP): on Boost to the `nodely.dev` hosts, on Unlimited and Enterprise to the commercial `nodely.io` hosts."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Boost or Unlimited?","url":"https://nodely.io/docs/access/#boost-or-unlimited","text":"Boost suits apps that need a token and analytics while their traffic fits in 256k requests and 4 GB a day. Boost includes the IPFS gateway for 1 verified site (more sites as an overage). Boost has 120 req/s per client IP, split across the region's edges, 50 ms or more of added latency on backend and bot requests and a 99.5 % SLO on the Algorand endpoints. Unlimited has no daily quota and no added latency, 600 req/s per client IP, split across the region's edges, the commercial hosts, a 99.99 % SLO on Algorand, more endpoints, tokens, sites and IP whitelisting, admin and viewer roles, a support response target, R&D support and the IPFS gateway for any CID. Both include Ethereum, Base, Arc and time travel on mainnet (Boost: basic time travel; Unlimited: full time travel). You can switch in the portal at any time."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Can I query state at a past round?","url":"https://nodely.io/docs/access/#can-i-query-state-at-a-past-round","text":"Yes, with [time travel](https://nodely.io/docs/access/time-travel/): `?round=` on account, asset, app and box endpoints, the versions API and simulate at a past round. Testnet is open to everyone; mainnet needs Boost, Unlimited or Enterprise."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Can I put my token in a web app?","url":"https://nodely.io/docs/access/#can-i-put-my-token-in-a-web-app","text":"No. Anything in a web page or a mobile bundle is public. Whitelist your site instead: see [browser apps](https://nodely.io/docs/access/authentication/#browser-apps-whitelisted-sites)."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"What happens if a payment fails?","url":"https://nodely.io/docs/access/#what-happens-if-a-payment-fails","text":"Stripe retries the payment and your endpoints keep working for a grace period. If the invoice stays unpaid, the endpoints stop working on the edges until it is paid. Access comes back within minutes of the payment."}
{"id":"/docs/access/","title":"API access and plans","markdownUrl":"https://nodely.io/docs/access.md","heading":"Where do I manage all this?","url":"https://nodely.io/docs/access/#where-do-i-manage-all-this","text":"In the [Nodely portal](https://portal.nodely.io/). Questions about plans or enterprise needs: [contact us](https://nodely.io/contact)."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Quotas and rate limits","url":"https://nodely.io/docs/access/limits/","text":"Two kinds of limits apply:\n\n-   **Daily quotas** cap the requests and the response bytes per UTC day. They reset at 00:00 UTC.\n-   **Rate limits** cap requests per second and, on the free tier, concurrent calls."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Daily quotas","url":"https://nodely.io/docs/access/limits/#daily-quotas","text":"New free tier limits from 1 January 2027\n\nThe free tier limits on this page start on 1 January 2027 (00:00 UTC). Until then the free tier keeps 200k requests or 5 GB a day per IP and site and 60 req/s per IP, with no separate limit for bot traffic, and MainNet time travel stays free.\n\n| Plan | Counted per | Quota per UTC day | When it runs out |\n| --- | --- | --- | --- |\n| Free | Client IP, and site (the host in `Referer`) | 128k requests or 2 GB, whichever comes first | 403, more requests dropped at random as usage nears the quota |\n| Boost | Endpoint: all its tokens, sites and IPs together | 256k requests and 4 GB; reaching either one is enough | 429 with a JSON body until 00:00 UTC |\n| Unlimited | – | No daily quota | – |\n| Enterprise | – | No daily quota | – |\n\n-   Every request counts, including errors and rejected requests. Bytes are the size of the responses.\n-   Usage reaches the edges with a delay of a few minutes, so a busy client can go a little over its quota before it is stopped.\n-   On the free tier, IPFS gateway traffic counts toward the same quota as the APIs."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Free tier: 403","url":"https://nodely.io/docs/access/limits/#free-tier-403","text":"As a client IP or a site gets close to its daily quota, the edge rejects a growing share of its requests at random. Once the quota is used up, it rejects them all until 00:00 UTC. Rejected requests get:\n\n```http\nHTTP/2 403\n\nDaily free API quota exceeded\n```\n\nFollow free-tier usage on the [public dashboard](https://g.nodely.io/d/nodelyapi/). If your app needs a higher request rate, its own API token or analytics, the [Boost plan](https://nodely.io/pricing) gives an endpoint 256k requests and 4 GB a day that no one else shares. More can be added in blocks of 256k requests and 4 GB a day; steady traffic beyond that suits Unlimited."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Boost: warning header, then 429","url":"https://nodely.io/docs/access/limits/#boost-warning-header-then-429","text":"From 80 % of either quota, responses carry an `X-And-Quota` header and the portal sends you an email. At 100 % of either quota, the edge answers every request of the endpoint with a 429 until 00:00 UTC, and the portal emails you again:\n\n```http\nHTTP/2 429\ncontent-type: application/json\nretry-after: 20117\nx-and-quota: block=1;reqs=256154;bytes=3200000000;ts=2026-11-02\n\n{\"message\":\"Daily Boost quota exceeded\",\"ld\":\"acme\",\"requests\":256154,\"bytes\":3200000000,\"day\":\"2026-11-02\",\"reset_in\":20117}\n```\n\n| Field | Meaning |\n| --- | --- |\n| `message` | Always “Daily Boost quota exceeded” |\n| `ld` | Your endpoint’s log name, as shown in the portal analytics |\n| `requests`, `bytes` | The endpoint’s usage today |\n| `day` | The UTC day the quota is counted for |\n| `reset_in` | Seconds until 00:00 UTC, the same as `Retry-After` |\n\n`X-And-Quota` has the form `block=<0|1>;reqs=<requests today>;bytes=<bytes today>;ts=<UTC day>`. `block=0` is the warning from 80 %; `block=1` means the quota is used up.\n\nRetrying before 00:00 UTC does not help. On the [Billing page](https://portal.nodely.io/billing) of the portal an organization admin can add **Extra 256k requests and 4 GB a day** blocks ($32 / month each, up to 7, an overage that raises both daily quotas) or upgrade to Unlimited, which drops the quota. Either takes effect within a few minutes."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Unlimited and Enterprise","url":"https://nodely.io/docs/access/limits/#unlimited-and-enterprise","text":"No daily quota. On Unlimited the rate limits below still apply; Enterprise has no API rate limits."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Rate limits","url":"https://nodely.io/docs/access/limits/#rate-limits","text":"| Plan | Limits |\n| --- | --- |\n| Free | 30 req/s, 10 concurrent calls and 18 transaction POSTs per second per client IP; bot traffic (no browser `Referer` or `Origin`) 5 req/s per IP; 1000 req/s per site |\n| Boost | 120 req/s per client IP, split across the region's edges |\n| Unlimited | 600 req/s per client IP, split across the region's edges |\n| Enterprise | No API rate limit (Unlimited’s features otherwise); the IPFS gateway limit below still applies |\n| IPFS gateway | 100 req/s per IP for Algorand mainnet assets, 10 req/s for other content |\n\nOver a rate limit, the edge answers at once with a plain 429, without the JSON body. Wait and retry with exponential backoff."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Added latency","url":"https://nodely.io/docs/access/limits/#added-latency","text":"On Free and Boost the edges add 50 ms or more to backend and bot requests: those without a browser `Referer`. Browser apps and msgpack requests (`?format=msgp`) get none. Unlimited and Enterprise get none at all."}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Telling the two 429s apart","url":"https://nodely.io/docs/access/limits/#telling-the-two-429s-apart","text":"A 429 with a JSON body whose `message` is “Daily Boost quota exceeded” means the daily quota is used up: stop until 00:00 UTC. Any other 429 is a rate limit: back off and retry. In browsers, read the body rather than the headers: cross-origin scripts may not be allowed to read `Retry-After` or `X-And-Quota`.\n\n```js\nasync function callNodely(url, init = {}, attempt = 0) {\n  const res = await fetch(url, init);\n  if (res.status !== 429) return res;\n\n  if (res.headers.get(\"content-type\")?.includes(\"application/json\")) {\n    const body = await res.clone().json().catch(() => null);\n    if (body?.message === \"Daily Boost quota exceeded\") return res; // wait for 00:00 UTC\n  }\n  if (attempt >= 5) return res;\n\n  // Rate limit: exponential backoff with jitter.\n  await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** attempt + Math.random() * 250));\n  return callNodely(url, init, attempt + 1);\n}\n```"}
{"id":"/docs/access/limits/","title":"Quotas and rate limits","markdownUrl":"https://nodely.io/docs/access/limits.md","heading":"Staying within limits","url":"https://nodely.io/docs/access/limits/#staying-within-limits","text":"-   Cache what does not change. Blocks and confirmed transactions are immutable: fetch them once.\n-   Ask for new data only, for example with `min-round` on indexer searches, instead of polling from round 0 or 1.\n-   Reuse connections with HTTP/2 or keep-alive: see [API speedup](https://nodely.io/docs/unlimited/turboapi/).\n-   Limit concurrency: on the free tier, no more than 10 calls at once, 2 for blocks and 1 for a paginating request (`next=`).\n-   Do not send the same request from many servers in the same round.\n\nThe full free-tier rules are in the [fair usage policy](https://nodely.io/docs/free/policy/)."}
{"id":"/docs/access/support/","title":"Support","markdownUrl":"https://nodely.io/docs/access/support.md","heading":"Support","url":"https://nodely.io/docs/access/support/","text":"Email [support@nodely.io](mailto:support@nodely.io) and name your organization and endpoint in the [Nodely portal](https://portal.nodely.io/), so we can match the request to your plan. Questions anyone can answer, and public goods projects, go to the [Nodely community channel](https://discord.gg/AnH2s9dMkN)."}
{"id":"/docs/access/support/","title":"Support","markdownUrl":"https://nodely.io/docs/access/support.md","heading":"Response targets","url":"https://nodely.io/docs/access/support/#response-targets","text":"| Plan | First response |\n| --- | --- |\n| Enterprise | First response within 4 hours |\n| Unlimited | First response within 24 hours |\n| Boost | Best effort |\n| Free | Best effort |\n| Public goods | Community channels, tickets best effort |\n\n-   Response targets count calendar hours, weekends and holidays included.\n-   A target is met by the first reply from the Nodely team, not by an automatic acknowledgement.\n-   The target is for the first response, not for the fix. Incidents that affect the service are tracked on the [status page](https://status.nodely.io/).\n-   Enterprise also has phone support; where an Enterprise contract sets other terms, the contract applies.\n-   Unlimited also includes 1 h of R&D support per month (help with your integration, not only incidents).\n\nAvailability commitments (SLO / SLA and reimbursement) are on the [pricing page](https://nodely.io/pricing)."}
{"id":"/docs/access/time-travel/","title":"Time travel","markdownUrl":"https://nodely.io/docs/access/time-travel.md","heading":"Time travel","url":"https://nodely.io/docs/access/time-travel/","text":"Time travel answers node (algod) API questions **as of a past round**: an account’s balance and holdings, an app’s global state or a box at any round since genesis, the rounds at which they changed, and a transaction group simulated against past state. A stock node only knows the latest state; Nodely routes these requests to time-travel nodes that keep the history of every ledger object."}
{"id":"/docs/access/time-travel/","title":"Time travel","markdownUrl":"https://nodely.io/docs/access/time-travel.md","heading":"Who gets it","url":"https://nodely.io/docs/access/time-travel/#who-gets-it","text":"| Plan | Time travel |\n| --- | --- |\n| Free | Testnet time travel |\n| Boost | Basic time travel (mainnet and testnet) |\n| Unlimited | Full time travel (mainnet and testnet) |\n| Enterprise | Full time travel (mainnet and testnet) |\n\n-   **Testnet** history is open to everyone, on the free hosts as well, under the usual free-tier limits.\n-   **Mainnet** history needs a paid plan: send a token, or call from a whitelisted site (or IP, on Unlimited and Enterprise). Boost uses the public `nodely.dev` hosts, Unlimited and Enterprise the [commercial hosts](https://nodely.io/docs/access/#paid-plans-token-site-or-ip). Public goods projects on Unlimited get it too. Without a plan, mainnet history requests are rejected with an error; an organization admin can upgrade on the [Billing page](https://portal.nodely.io/billing).\n-   History requests count toward your daily quota and rate limits like any other request."}
{"id":"/docs/access/time-travel/","title":"Time travel","markdownUrl":"https://nodely.io/docs/access/time-travel.md","heading":"What counts as a history request","url":"https://nodely.io/docs/access/time-travel/#what-counts-as-a-history-request","text":"The edge sends these requests to the time-travel nodes and everything else to the regular nodes:\n\n| Request | Answers |\n| --- | --- |\n| `GET /v2/accounts/{address}?round=R`, and its `/assets`, `/applications`, `/assets/{id}`, `/applications/{id}` | The account, its holdings and local states at the end of round R |\n| `GET /v2/assets/{id}?round=R`, `GET /v2/applications/{id}?round=R` | Asset parameters, app parameters and global state at R |\n| `GET /v2/applications/{id}/box?name=…&round=R`, `/boxes?round=R` | A box value, or the app’s boxes, at R |\n| `GET /v2/ledger/supply?round=R` | Totals at R |\n| `GET …/versions`, for example `/v2/accounts/{address}/versions` | The rounds at which an object changed, paginated, with the new values on `include=values` |\n| `POST /v2/transactions/simulate` with `\"round\": R` | The group evaluated as if it were in block R+1 |\n\nSimulate requests that use the fork’s other extensions (`rounds`, `parallel-groups`, `protocol`) count as history requests too. The full list of endpoints, parameters and known limitations is in the [dt-algorand time travel docs](https://github.com/d13co/dt-algorand/blob/dtalgorand/ledger/timetravel/README.md), and the versions API in [VERSIONS.md](https://github.com/d13co/dt-algorand/blob/dtalgorand/ledger/timetravel/VERSIONS.md)."}
{"id":"/docs/access/time-travel/","title":"Time travel","markdownUrl":"https://nodely.io/docs/access/time-travel.md","heading":"Examples","url":"https://nodely.io/docs/access/time-travel/#examples","text":"```bash\n# Mainnet, paid plan: an account as it was at the end of round 50,000,000\ncurl -H \"X-API-Key: $NODELY_TOKEN\" \\\n  \"https://mainnet-api.4160.nodely.io/v2/accounts/$ADDRESS?round=50000000\"\n\n# The rounds at which the account changed between two rounds, newest first\ncurl -H \"X-API-Key: $NODELY_TOKEN\" \\\n  \"https://mainnet-api.4160.nodely.io/v2/accounts/$ADDRESS/versions?min-round=49000000&max-round=50000000&order=desc&limit=10\"\n\n# Testnet, free host, no key: an app's global state at a past round\ncurl \"https://testnet-api.4160.nodely.dev/v2/applications/$APP_ID?round=40000000\"\n```\n\nTo simulate at a past round, add `round` to the usual simulate request body:\n\n```json\n{\n  \"txn-groups\": [{ \"txns\": [\"…signed or unsigned transactions…\"] }],\n  \"allow-empty-signatures\": true,\n  \"round\": 50000000\n}\n```"}
{"id":"/docs/access/time-travel/","title":"Time travel","markdownUrl":"https://nodely.io/docs/access/time-travel.md","heading":"Errors","url":"https://nodely.io/docs/access/time-travel/#errors","text":"| Response | Meaning |\n| --- | --- |\n| An error on a mainnet history request without a plan | Mainnet history needs a paid plan: send your token, or call from a whitelisted site or IP. |\n| `503 {\"message\":\"historical state (time travel) service unavailable\"}` | The time-travel nodes cannot be reached. The edge does not fall back to a regular node, because it would answer with the latest state instead. Retry with backoff. |\n| `404` on `/v2/ledger/supply?round=` | The online stake for that round was not recorded. |\n\nIndexer APIs are not affected: they keep their own `round` and `min-round` / `max-round` parameters."}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Arc public RPC","url":"https://nodely.io/docs/arc/","text":"Nodely runs a public RPC for [Arc](https://docs.arc.io/) mainnet, Circle’s stablecoin L1, on its own node. No account, no keys."}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Endpoints","url":"https://nodely.io/docs/arc/#endpoints","text":"| Network | Chain ID | HTTP JSON-RPC | WebSocket |\n| --- | --- | --- | --- |\n| Arc mainnet | `5042` (`0x13b2`) | `https://arc.nodely.dev` | `wss://arc.nodely.dev/ws` |\n\n-   Served from our own node in Finland, running Circle’s arc-node. Transactions sent with `eth_sendRawTransaction` are relayed to the Arc network.\n-   Blocks come about every 0.5 seconds and are final once included: no reorgs, one confirmation is enough.\n-   Gas is paid in USDC. Native balances use 18 decimals; the USDC ERC-20 interface at `0x3600000000000000000000000000000000000000` uses 6.\n-   Arc drops transactions with a `maxFeePerGas` below its 20 gwei minimum without an error, so they never get a receipt.\n-   CORS is open, so browser apps and wallets can call the endpoint directly.\n-   `GET https://arc.nodely.dev/health` answers `ok head <block> age <seconds>` while the node is in sync."}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Recent data only","url":"https://nodely.io/docs/arc/#recent-data-only","text":"The node is pruned, not archival:\n\n-   State, blocks, receipts, logs, lookups by transaction hash and validator certificates cover the **last 237,000 blocks**, about 33 hours. `eth_call`, `eth_getBalance` and similar calls at older blocks fail.\n\nNeed full history? [Talk to us](https://nodely.io/contact)."}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Available methods","url":"https://nodely.io/docs/arc/#available-methods","text":"-   All read methods in the `eth_` namespace, plus `eth_sendRawTransaction`. Signing, mining and account methods (`eth_sign*`, `eth_sendTransaction`, `eth_accounts`, …) are disabled.\n-   `arc_getCertificate(height)` returns the validators’ commit certificate for a block, `arc_getVersion` the node version.\n-   `net_version`, `net_listening`, `net_peerCount`, `web3_clientVersion`, `web3_sha3`\n-   `eth_subscribe` and `eth_unsubscribe` (`newHeads`, `logs`) on the WebSocket only.\n-   Pending transactions are not exposed: the `pending` block tag returns `null`, and pending-transaction filters and subscriptions return error `-32001`. Blocks are final in about 0.5 seconds, so use `latest`.\n\nOther namespaces (`debug_*`, `trace_*`, `txpool_*`, `admin_*`, …) return error `-32601`."}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Connect","url":"https://nodely.io/docs/arc/#connect","text":"**curl**\n\n```bash\ncurl https://arc.nodely.dev \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}'\n```\n\n**viem**\n\n```ts\nimport { createPublicClient, http, webSocket } from \"viem\";\nimport { arc } from \"viem/chains\";\n\nconst client = createPublicClient({ chain: arc, transport: http(\"https://arc.nodely.dev\") });\nconsole.log(await client.getBlockNumber());\n\nconst ws = createPublicClient({ chain: arc, transport: webSocket(\"wss://arc.nodely.dev/ws\") });\nws.watchBlockNumber({ onBlockNumber: (n) => console.log(\"new block\", n) });\n```\n\n**ethers**\n\n```ts\nimport { JsonRpcProvider } from \"ethers\";\n\nconst provider = new JsonRpcProvider(\"https://arc.nodely.dev\", 5042, { staticNetwork: true });\nconsole.log(await provider.getBlockNumber());\n```\n\n**Wallet**\n\nIf your wallet already lists Arc, edit the network and add `https://arc.nodely.dev` as its RPC URL. Otherwise add a network with:\n\n| Field | Value |\n| --- | --- |\n| Network name | Arc |\n| RPC URL | `https://arc.nodely.dev` |\n| Chain ID | `5042` |\n| Currency symbol | `USDC` |\n| Block explorer | `https://explorer.arc.io` |"}
{"id":"/docs/arc/","title":"Arc public RPC","markdownUrl":"https://nodely.io/docs/arc.md","heading":"Limits","url":"https://nodely.io/docs/arc/#limits","text":"Per client IP:\n\n| Calls | Rate |\n| --- | --- |\n| Most calls | 25 per second (burst 50) |\n| Heavy calls: `eth_getLogs`, `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_getBlockReceipts`, `eth_feeHistory`, `eth_simulateV1` | 5 per second (burst 10) |\n| `eth_sendRawTransaction` | 2 per second (burst 5) |\n\n-   Over the limit you get HTTP 429 and JSON-RPC error `-32005` (`rate limit exceeded`). Back off and retry.\n-   Batches of up to 20 calls; each call counts against the limits.\n-   256 KB maximum request body, 4 WebSocket connections per IP.\n-   `eth_getLogs` spans at most 10,000 blocks and returns at most 10,000 logs; `eth_call` gas cap 30M; responses up to 25 MB.\n\nNeed more? [Talk to us](https://nodely.io/contact) about dedicated endpoints."}
{"id":"/docs/avm/arcs/","title":"Algorand ARCs","markdownUrl":"https://nodely.io/docs/avm/arcs.md","heading":"Algorand Requests for Comments","url":"https://nodely.io/docs/avm/arcs/#algorand-requests-for-comments","text":"Checkout standards and reference implementations of common patterns :\n\n-   [ARC site](https://arc.algorand.foundation/)\n\nARC maturity level at a glance:\n\n-   [ARC Tech Radar](https://tech-radar.algorand.foundation/)\n\nARC adoption matrix:\n\n-   [by wallet](https://arc.algorand.foundation/wallets)\n-   [by NTF project](https://arc.algorand.foundation/nfts)\n\nAdoption committee:\n\n-   [ATAC white paper](https://26119259.fs1.hubspotusercontent-eu1.net/hubfs/26119259/Algorand%20Wallet%20Council%20&%20Algorand%20Technical%20Adoption%20Committee%20\\(1\\).pdf)\n-   [ATAC resolutions and votes](https://github.com/algorandfoundation/technical-adoption-committee)\n\nDid you know?\n\nNodely is active ATAC committe member"}
{"id":"/docs/avm/audits/","title":"Smart Contract Audits","markdownUrl":"https://nodely.io/docs/avm/audits.md","heading":"Dedicated teams","url":"https://nodely.io/docs/avm/audits/#dedicated-teams","text":"Companies known to maintain in-house(!) researchers dedicated to Algorand protocol:\n\n-   [CoinFabrik](https://www.coinfabrik.com/)"}
{"id":"/docs/avm/audits/","title":"Smart Contract Audits","markdownUrl":"https://nodely.io/docs/avm/audits.md","heading":"Offering Algorand audits","url":"https://nodely.io/docs/avm/audits/#offering-algorand-audits","text":"Companies known to deliver AVM audits:\n\n-   [Certik](https://www.certik.com/)\n-   [Coinspect](https://www.coinspect.com/)\n-   [Kudelski Security](https://kudelskisecurity.com/)\n-   [Runtime Verification](https://runtimeverification.com/)\n-   [Trail of Bits](https://www.trailofbits.com/)\n-   [Vantage Point](https://www.vantagepoint.sg/)\n\nDid you know?\n\nAlgorand AVM is unique. Many of the pitfalls of EVM do not apply here and contracts are safer and more predictable by design.  \nYou can also write contracts in Python!"}
{"id":"/docs/avm/sdks/","title":"Algorand SDKs","markdownUrl":"https://nodely.io/docs/avm/sdks.md","heading":"Algorand SDKs","url":"https://nodely.io/docs/avm/sdks/","text":"You can interact with APIs directly or with SDK for your language:"}
{"id":"/docs/avm/sdks/","title":"Algorand SDKs","markdownUrl":"https://nodely.io/docs/avm/sdks.md","heading":"API Swagger","url":"https://nodely.io/docs/avm/sdks/#api-swagger","text":"-   [Node API](https://mainnet-api.algonode.cloud/)\n-   [Indexer API](https://mainnet-idx.algonode.cloud/)"}
{"id":"/docs/avm/sdks/","title":"Algorand SDKs","markdownUrl":"https://nodely.io/docs/avm/sdks.md","heading":"SDKs","url":"https://nodely.io/docs/avm/sdks/#sdks","text":"-   [Python](https://developer.algorand.org/docs/sdks/python/)\n-   [Typescript](https://developer.algorand.org/docs/sdks/javascript/)\n-   [Go](https://developer.algorand.org/docs/sdks/go/)\n-   [Java](https://developer.algorand.org/docs/sdks/java/)\n-   [.NET](https://frankszendzielarz.github.io/dotnet-algorand-sdk/api/index.html)\n-   [Rust](https://github.com/manuelmauro/algonaut)"}
{"id":"/docs/avm/start/","title":"QuickStart","markdownUrl":"https://nodely.io/docs/avm/start.md","heading":"QuickStart","url":"https://nodely.io/docs/avm/start/","text":"You can start building Web3 dApps with UI and smart contract templates in under 10 minutes.\n\n-   [Algokit](https://developer.algorand.org/docs/get-started/algokit/)"}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Base public RPC","url":"https://nodely.io/docs/base/","text":"Nodely runs a public RPC for Base mainnet on its own nodes. No account, no keys."}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Endpoints","url":"https://nodely.io/docs/base/#endpoints","text":"| Network | Chain ID | HTTP JSON-RPC | WebSocket |\n| --- | --- | --- | --- |\n| Base mainnet | `8453` (`0x2105`) | `https://base.nodely.dev` | `wss://base.nodely.dev/ws` |\n\n-   Served from two nodes in Europe (Finland and Germany) with automatic failover: a node that falls more than 30 seconds behind the chain head leaves the pool.\n-   Both nodes derive Base from our own [Ethereum L1 nodes](https://nodely.io/docs/ethereum). Transactions are forwarded to the Base sequencer.\n-   The `pending` block tag follows [Flashblocks](https://docs.base.org/base-chain/api-reference/rpc-overview#flashblocks), so apps see new transactions about every 200 ms instead of every block.\n-   CORS is open, so browser apps and wallets can call the endpoint directly.\n-   `GET https://base.nodely.dev/health` answers `ok head <block> age <seconds>` while the node is in sync."}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Recent data only","url":"https://nodely.io/docs/base/#recent-data-only","text":"The nodes are pruned, not archival:\n\n-   State, blocks, receipts and logs cover the **last 300,000 blocks**: about 7 days at today’s 2-second blocks, about 17 hours once the Denim upgrade (5 November 2026) brings 200 ms blocks. `eth_call`, `eth_getBalance` and similar calls at older blocks fail.\n-   **Lookups by transaction hash** (`eth_getTransactionByHash`, `eth_getTransactionReceipt`) cover only the last 100 or so blocks, a few minutes. That is enough to confirm a transaction you just sent, but not for explorers or indexers: for older transactions use `eth_getBlockReceipts` or `eth_getLogs` with the block number.\n\nNeed full history? [Talk to us](https://nodely.io/contact)."}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Available methods","url":"https://nodely.io/docs/base/#available-methods","text":"-   All read methods in the `eth_` namespace, plus `eth_sendRawTransaction`. Signing, mining and account methods (`eth_sign*`, `eth_sendTransaction`, `eth_accounts`, …) are disabled.\n-   `net_version`, `net_listening`, `net_peerCount`, `web3_clientVersion`, `web3_sha3`\n-   `eth_subscribe` and `eth_unsubscribe` (`newHeads`, `logs`) on the WebSocket only.\n\nOther namespaces (`debug_*`, `trace_*`, `txpool_*`, `admin_*`, …) return error `-32601`."}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Connect","url":"https://nodely.io/docs/base/#connect","text":"**curl**\n\n```bash\ncurl https://base.nodely.dev \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}'\n```\n\n**viem**\n\n```ts\nimport { createPublicClient, http, webSocket } from \"viem\";\nimport { base } from \"viem/chains\";\n\nconst client = createPublicClient({ chain: base, transport: http(\"https://base.nodely.dev\") });\nconsole.log(await client.getBlockNumber());\n\nconst ws = createPublicClient({ chain: base, transport: webSocket(\"wss://base.nodely.dev/ws\") });\nws.watchBlockNumber({ onBlockNumber: (n) => console.log(\"new block\", n) });\n```\n\n**ethers**\n\n```ts\nimport { JsonRpcProvider } from \"ethers\";\n\nconst provider = new JsonRpcProvider(\"https://base.nodely.dev\", 8453, { staticNetwork: true });\nconsole.log(await provider.getBlockNumber());\n```\n\n**Wallet**\n\nIf your wallet already lists Base, edit the network and add `https://base.nodely.dev` as its RPC URL. Otherwise add a network with:\n\n| Field | Value |\n| --- | --- |\n| Network name | Base |\n| RPC URL | `https://base.nodely.dev` |\n| Chain ID | `8453` |\n| Currency symbol | `ETH` |\n| Block explorer | `https://basescan.org` |"}
{"id":"/docs/base/","title":"Base public RPC","markdownUrl":"https://nodely.io/docs/base.md","heading":"Limits","url":"https://nodely.io/docs/base/#limits","text":"Per client IP:\n\n| Calls | Rate |\n| --- | --- |\n| Most calls | 25 per second (burst 50) |\n| Heavy calls: `eth_getLogs`, `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_getBlockReceipts`, `eth_feeHistory`, `eth_simulateV1` | 5 per second (burst 10) |\n| `eth_sendRawTransaction` | 2 per second (burst 5) |\n\n-   Over the limit you get HTTP 429 and JSON-RPC error `-32005` (`rate limit exceeded`). Back off and retry.\n-   Batches of up to 20 calls; each call counts against the limits.\n-   256 KB maximum request body, 4 WebSocket connections per IP.\n-   `eth_getLogs` spans at most 2,000 blocks and returns at most 10,000 logs; `eth_call` gas cap 50M; responses up to 25 MB.\n\nNeed more? [Talk to us](https://nodely.io/contact) about dedicated endpoints."}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Ethereum public RPC","url":"https://nodely.io/docs/ethereum/","text":"Nodely runs a public RPC for Ethereum mainnet on its own nodes. No account, no keys."}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Endpoints","url":"https://nodely.io/docs/ethereum/#endpoints","text":"| Network | Chain ID | HTTP JSON-RPC | WebSocket |\n| --- | --- | --- | --- |\n| Ethereum mainnet | `1` (`0x1`) | `https://eth.nodely.dev` | `wss://eth.nodely.dev/ws` |\n\n-   Served from two nodes in Europe (Finland and Germany) with automatic failover: a node that falls more than 60 seconds behind the chain head leaves the pool.\n-   Each node runs reth with a Lighthouse beacon node. The beacon (consensus layer) API is not public.\n-   Transactions sent with `eth_sendRawTransaction` are broadcast from our nodes to the Ethereum network.\n-   CORS is open, so browser apps and wallets can call the endpoint directly.\n-   `GET https://eth.nodely.dev/health` answers `ok head <block> age <seconds>` while the node is in sync.\n-   The same nodes feed our [Base RPC](https://nodely.io/docs/base), which derives the L2 from them."}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Recent data only","url":"https://nodely.io/docs/ethereum/#recent-data-only","text":"The nodes are pruned, not archival:\n\n-   State, blocks, receipts and logs cover the **last 100,800 blocks** (about 14 days). `eth_call`, `eth_getBalance` and similar calls at older blocks fail with `pruned history unavailable`.\n-   **Lookups by transaction hash** (`eth_getTransactionByHash`, `eth_getTransactionReceipt`) cover only the last few hundred blocks, about an hour; older hashes return `null`. That is enough to confirm a transaction you just sent, but not for explorers or indexers: for older transactions use `eth_getBlockReceipts` or `eth_getLogs` with the block number.\n\nNeed full history? [Talk to us](https://nodely.io/contact)."}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Available methods","url":"https://nodely.io/docs/ethereum/#available-methods","text":"-   All read methods in the `eth_` namespace, plus `eth_sendRawTransaction`. Signing, mining and account methods (`eth_sign*`, `eth_sendTransaction`, `eth_accounts`, …) are disabled.\n-   `net_version`, `net_listening`, `net_peerCount`, `web3_clientVersion`, `web3_sha3`\n-   `eth_subscribe` and `eth_unsubscribe` (`newHeads`, `logs`, `newPendingTransactions`) on the WebSocket only.\n\nOther namespaces (`debug_*`, `trace_*`, `txpool_*`, `admin_*`, …) return error `-32601`."}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Connect","url":"https://nodely.io/docs/ethereum/#connect","text":"**curl**\n\n```bash\ncurl https://eth.nodely.dev \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_blockNumber\",\"params\":[]}'\n```\n\n**viem**\n\n```ts\nimport { createPublicClient, http, webSocket } from \"viem\";\nimport { mainnet } from \"viem/chains\";\n\nconst client = createPublicClient({ chain: mainnet, transport: http(\"https://eth.nodely.dev\") });\nconsole.log(await client.getBlockNumber());\n\nconst ws = createPublicClient({ chain: mainnet, transport: webSocket(\"wss://eth.nodely.dev/ws\") });\nws.watchBlockNumber({ onBlockNumber: (n) => console.log(\"new block\", n) });\n```\n\n**ethers**\n\n```ts\nimport { JsonRpcProvider } from \"ethers\";\n\nconst provider = new JsonRpcProvider(\"https://eth.nodely.dev\", 1, { staticNetwork: true });\nconsole.log(await provider.getBlockNumber());\n```\n\n**Wallet**\n\nWallets already know Ethereum mainnet: edit the network and add `https://eth.nodely.dev` as its RPC URL. For a new network entry use:\n\n| Field | Value |\n| --- | --- |\n| Network name | Ethereum |\n| RPC URL | `https://eth.nodely.dev` |\n| Chain ID | `1` |\n| Currency symbol | `ETH` |\n| Block explorer | `https://etherscan.io` |"}
{"id":"/docs/ethereum/","title":"Ethereum public RPC","markdownUrl":"https://nodely.io/docs/ethereum.md","heading":"Limits","url":"https://nodely.io/docs/ethereum/#limits","text":"Per client IP:\n\n| Calls | Rate |\n| --- | --- |\n| Most calls | 12 per second (burst 25) |\n| Heavy calls: `eth_getLogs`, `eth_call`, `eth_estimateGas`, `eth_createAccessList`, `eth_getBlockReceipts`, `eth_feeHistory`, `eth_simulateV1` | 2 per second (burst 5) |\n| `eth_sendRawTransaction` | 1 per second (burst 2) |\n\n-   Over the limit you get HTTP 429 and JSON-RPC error `-32005` (`rate limit exceeded`). Back off and retry.\n-   Batches of up to 20 calls; each call counts against the limits.\n-   256 KB maximum request body, 4 WebSocket connections per IP.\n-   `eth_getLogs` spans at most 1,000 blocks and returns at most 10,000 logs; `eth_call` gas cap 50M; responses up to 25 MB.\n\nNeed more? [Talk to us](https://nodely.io/contact) about dedicated endpoints."}
{"id":"/docs/free/backup/","title":"Backup endpoints","markdownUrl":"https://nodely.io/docs/free/backup.md","heading":"Choice of endpoints","url":"https://nodely.io/docs/free/backup/#choice-of-endpoints","text":"Nodely uses multiple domains for API endpoints to provide end-users and dApps with a diverse choice of CDN operators.\n\ndApps should allow end-users to customize the API endpoint set to increase availability as well as promote decentralization.  \nBack-end solutions should adopt automatic or feature-flag failover to quickly switch endpoints sets in case of global CDN outage."}
{"id":"/docs/free/backup/","title":"Backup endpoints","markdownUrl":"https://nodely.io/docs/free/backup.md","heading":"Algorand network free endpoints","url":"https://nodely.io/docs/free/backup/#algorand-network-free-endpoints","text":"${net} = mainnet | testnet\n\n| Endpoint schema | Function | Type | CDN | Availability |\n| --- | --- | --- | --- | --- |\n| ${net}-api.4160.nodely.dev | Primary | Algod API | Cloudflare | Highest, 19 regions |\n| ${net}-idx.4160.nodely.dev | Primary | Indexer API | Cloudflare | Highest, 19 regions |\n| ${net}-api.algonode.xyz | Backup | Algod API | Bunny | High, 19 regions |\n| ${net}-idx.algonode.xyz | Backup | Indexer API | Bunny | High, 19 regions |\n| ${net}-api.algonode.network | Disaster | Algod API | no CDN | DNS failover, 12 regions |\n| ${net}-idx.algonode.network | Disaster | Indexer API | no CDN | DNS failover, 12 regions |"}
{"id":"/docs/free/backup/","title":"Backup endpoints","markdownUrl":"https://nodely.io/docs/free/backup.md","heading":"Algorand network commercial endpoints","url":"https://nodely.io/docs/free/backup/#algorand-network-commercial-endpoints","text":"${net} = mainnet | testnet\n\n| Endpoint schema | Function | Type | CDN | Availability |\n| --- | --- | --- | --- | --- |\n| ${net}-api.4160.nodely.io | Commercial only | Algod API | Cloudflare | Highest + Argo boost, 21 regions |\n| ${net}-idx.4160.nodely.io | Commercial only | Indexer API | Cloudflare | Highest + Argo boost, 21 regions |\n| ${net}-api.4160.nodely.dev | Secondary | Algod API | Cloudflare | Highest |\n| ${net}-idx.4160.nodely.dev | Secondary | Indexer API | Cloudflare | Highest |\n| ${net}-api.algonode.xyz | Backup | Algod API | Bunny | High |\n| ${net}-idx.algonode.xyz | Backup | Indexer API | Bunny | High |\n| ${net}-api.algonode.network | Disaster | Algod API | no CDN | DNS failover |\n| ${net}-idx.algonode.network | Disaster | Indexer API | no CDN | DNS failover |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Algorand and AVM endpoint matrix","url":"https://nodely.io/docs/free/endpoints/","text":"Looking for network specific explorers, wallets, faucets, node/indexer running guides ?  \nCheckout the [AVM Tools matrix](https://nodely.io/docs/utils/matrix)\n\nDownload the raw [Algorand Algod specification](https://nodely.io/swagger/api/4160/algod.oas3.yml) or [Indexer specification](https://nodely.io/swagger/api/4160/indexer.oas3.yml). The [service catalog](https://nodely.io/services.json) collects published endpoint tables and specification links for agents."}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Free Archival Node API / RPC","url":"https://nodely.io/docs/free/endpoints/#free-archival-node-api--rpc","text":"Vanilla algod API, experimental & developer endpoints enabled. [see swagger docs](https://mainnet-api.algonode.cloud/)\n\nCommercial customers should use [`nodely.io`](https://nodely.io/docs/unlimited/start/#algorand-network) enterprise endpoints for better availability and ~30% less latency."}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Universal endpoints","url":"https://nodely.io/docs/free/endpoints/#universal-endpoints","text":"| Network | ID | Full Algod v2 API | playground |\n| --- | --- | --- | --- |\n| [Algorand](https://algorand.co/) mainnnet | [mainnet-v1.0](https://mainnet-api.4160.nodely.dev/genesis) | [https://mainnet-api.4160.nodely.dev](https://mainnet-api.4160.nodely.dev/v2/status) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| [Algorand](https://algorand.co/) testnet | [testnet-v1.0](https://testnet-api.4160.nodely.dev/genesis) | [https://testnet-api.4160.nodely.dev](https://testnet-api.4160.nodely.dev/v2/status) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| [Algorand](https://algorand.co/) betanet | [betanet-v1.0](https://betanet-api.4160.nodely.dev/genesis) | [https://betanet-api.4160.nodely.dev](https://betanet-api.4160.nodely.dev/v2/status) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| [FNet](https://fnet.algorand.green/) futurenet | [fnet-v1](https://nodely.io/docs/free/endpoints/\\(https://fnet-api.4160.nodely.dev/genesis\\)) | [https://fnet-api.4160.nodely.dev](https://fnet-api.4160.nodely.dev/v2/status) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/fnet/algod.oas3.yml) |\n| [Voi](https://voi.network/) mainnet | [voimain-v1.0](https://mainnet-api.voi.nodely.dev/genesis) | [https://mainnet-api.voi.nodely.dev](https://mainnet-api.voi.nodely.dev/v2/status) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/voi/algod.oas3.yml) |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Onion network (TOR) endpoints","url":"https://nodely.io/docs/free/endpoints/#onion-network-tor-endpoints","text":"| Network | ID | Full Algod v2 API |\n| --- | --- | --- |\n| [Algorand](https://algorand.co/) mainnnet | [mainnet-v1.0](https://mainnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/genesis) | [https://mainnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/](https://mainnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/v2/status) |\n| [Algorand](https://algorand.co/) testnet | [testnet-v1.0](https://testnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/genesis) | [https://testnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/](https://testnet-api.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/v2/status) |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Specialized endpoints that exclude USA/Canada/Mexico servers","url":"https://nodely.io/docs/free/endpoints/","text":"| Network | ID | Full Algod v2 API |\n| --- | --- | --- |\n| Algorand mainnnet  \nexcl. North America | mainnet-v1.0 | [https://xna-mainnet-api.4160.nodely.dev|](https://xna-mainnet-api.4160.nodely.dev%7C) |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Legacy Endpoints","url":"https://nodely.io/docs/free/endpoints/#legacy-endpoints","text":"| Network | ID | Full Algod v2 API |\n| --- | --- | --- |\n| Algorand mainnnet | mainnet-v1.0 | [https://mainnet-api.algonode.cloud|](https://mainnet-api.algonode.cloud%7C) |\n| Algorand testnet | testnet-v1.0 | [https://testnet-api.algonode.cloud](https://testnet-api.algonode.cloud/) |\n| Algorand betanet | betanet-v1.0 | [https://betanet-api.algonode.cloud](https://betanet-api.algonode.cloud/) |\n\nExample:\n\n```plaintext\ncurl https://testnet-api.algonode.cloud/v2/status\n```"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Free Archival Indexer API","url":"https://nodely.io/docs/free/endpoints/#free-archival-indexer-api","text":"Vanilla indexer API [see swagger docs](https://mainnet-idx.algonode.cloud/)\n\nCommercial customers should use [`nodely.io`](https://nodely.io/docs/unlimited/start/#algorand-network) enterprise endpoints for better availability and 30% less latency."}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Universal endpoints","url":"https://nodely.io/docs/free/endpoints/#universal-endpoints-1","text":"| Network | ID | Full Indexer v2 API | playground |\n| --- | --- | --- | --- |\n| Algorand mainnnet | mainnet-v1.0 | [https://mainnet-idx.4160.nodely.dev](https://mainnet-idx.4160.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) |\n| Algorand testnet | testnet-v1.0 | [https://testnet-idx.4160.nodely.dev](https://testnet-idx.4160.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) |\n| Algorand betanet | betanet-v1.0 | [https://betanet-idx.4160.nodely.dev](https://betanet-idx.4160.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) |\n| [FNet futurenet](https://fnet.algorand.green/) | fnet-v1 | [https://fnet-idx.4160.nodely.dev](https://fnet-idx.4160.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/fnet/indexer.oas3.yml) |\n| Voi mainnet | voimain-v1.0 | [https://mainnet-idx.voi.nodely.dev](https://mainnet-idx.voi.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/voi/indexer.oas3.yml) |\n| Voi testnet | voitest-v1.0 | [https://testnet-idx.voi.nodely.dev](https://testnet-idx.voi.nodely.dev/health) | [swaggerUI](https://nodely.io/swagger/index.html?url=/swagger/api/voi/indexer.oas3.yml) |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Onion network (TOR) endpoints","url":"https://nodely.io/docs/free/endpoints/#onion-network-tor-endpoints-1","text":"| Network | ID | Full Algod v2 API |\n| --- | --- | --- |\n| [Algorand](https://algorand.co/) mainnnet | mainnet-v1.0 | [https://mainnet-idx.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/](https://mainnet-idx.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/health) |\n| [Algorand](https://algorand.co/) testnet | testnet-v1.0 | [https://testnet-idx.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/](https://testnet-idx.ndlyalgoapiudgedqrcwsmtngkl2n2yv5y3icdvzztzpca5lp67apsqd.onion/health) |"}
{"id":"/docs/free/endpoints/","title":"Algorand and AVM endpoint matrix","markdownUrl":"https://nodely.io/docs/free/endpoints.md","heading":"Legacy endpoints (still safe to use)","url":"https://nodely.io/docs/free/endpoints/#legacy-endpoints-still-safe-to-use","text":"| Network | ID | Full Algod v2 API | note |\n| --- | --- | --- | --- |\n| Algorand mainnnet | mainnet-v1.0 | [https://mainnet-idx.algonode.cloud|](https://mainnet-idx.algonode.cloud%7C) |  |\n| Algorand testnet | testnet-v1.0 | [https://testnet-idx.algonode.cloud](https://testnet-idx.algonode.cloud/) |  |\n| Algorand betanet | betanet-v1.0 | [https://betanet-idx.algonode.cloud](https://betanet-idx.algonode.cloud/) |  |\n\nExample:\n\n```plaintext\ncurl https://testnet-idx.algonode.cloud/v2/blocks/0\n```"}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Fair usage policy","url":"https://nodely.io/docs/free/policy/","text":"New free tier limits from 1 January 2027\n\nThe free tier limits on this page start on 1 January 2027 (00:00 UTC). Until then the free tier keeps 200k requests or 5 GB a day per IP and site and 60 req/s per IP, with no separate limit for bot traffic, and MainNet time travel stays free."}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"General","url":"https://nodely.io/docs/free/policy/#general","text":"-   Node & Indexer APIs are FREE!\n-   No tokens, no setup, no surprises\n-   Free tier provides vanilla flavor API only - so you can easily migrate to your own\n-   [Time travel](https://nodely.io/docs/access/time-travel/) (state at past rounds) is free on testnet; mainnet history needs a paid plan\n-   Please mention using Nodely on your project site when doing > 1M requests monthly\n-   Both front-end & back-end traffic is subject to daily quota restrictions.\n-   IPFS gateway traffic is counted towards daily quota along with all other APIs\n-   Need more? The [Boost and Unlimited plans](https://nodely.io/docs/access/) add API tokens, usage analytics and higher request rates; Unlimited also drops the daily quota.\n\nTip\n\nPublic good projects can apply for ability to go above free tier.  \nSee [public goods projects tier](https://nodely.io/docs/unlimited/public-goods-projects)."}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Free tier limits","url":"https://nodely.io/docs/free/policy/#free-tier-limits","text":"Please observe the following limits. Nodely reserves the right to start rejecting requests once daily quota is exceeded.  \nProjects can can check the [dashboard](https://g.nodely.io/d/nodelyapi/) to see the quota status.\n\nDaily quotas count per UTC day and reset at 00:00 UTC."}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Per project / site","url":"https://nodely.io/docs/free/policy/#per-project--site","text":"-   Up to 128k requests per day (about 3.8M per month)\n-   1000 requests/s per site across all free tier regions\n-   2 GB worth of responses per day (about 60 GB per month)"}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Per individual user / browser (ext. IP address)","url":"https://nodely.io/docs/free/policy/#per-individual-user--browser-ext-ip-address","text":"-   30 requests/s, 10 concurrent calls\n-   5 requests/s for bot traffic: requests without a browser `Referer` or `Origin` (backends, scripts, bots)\n-   18 transaction POSTs per second\n-   128k requests or 2 GB worth of responses per day\n\nCaution\n\n-   Free endpoints add artificial 150ms (250ms for archival) delay for requests.\n-   Doing above 1MM requests monthly ? Mention Nodely on your project site."}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Realtime requests","url":"https://nodely.io/docs/free/policy/#realtime-requests","text":"For requests that exceed per second or concurrency limits the API will return HTTP 429 code. Please use exponential backoff after receiving 429 response."}
{"id":"/docs/free/policy/","title":"Fair usage policy","markdownUrl":"https://nodely.io/docs/free/policy.md","heading":"Daily quotas","url":"https://nodely.io/docs/free/policy/#daily-quotas","text":"API edges refresh quota usage about every 30 seconds, from usage data that runs a few minutes behind. As an IP address or a site gets close to its daily quota, a growing share of its requests is rejected at random. Once the quota is used up, all of them are rejected until 00:00 UTC.\n\nYou can expect :\n\n| HTTP result | when |\n| --- | --- |\n| 429 | you exceeded number of requests/s |\n| 429 | you exceeded number of requests in flight |\n| 403 `Daily free API quota exceeded` | you are close to or over the daily byte or request quota |\n\nCaution\n\nFailed requests count as requests towards quota\n\nSee [quotas and rate limits](https://nodely.io/docs/access/limits/) for the paid plans."}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Algorand and AVM API quickstart","url":"https://nodely.io/docs/free/start/","text":"New free tier limits from 1 January 2027\n\nThe free tier limits on this page start on 1 January 2027 (00:00 UTC). Until then the free tier keeps 200k requests or 5 GB a day per IP and site and 60 req/s per IP, with no separate limit for bot traffic, and MainNet time travel stays free.\n\nTo interact with an AVM chain just use one of the endpoints below, no keys required.\n\nNeed more?\n\nAPI tokens, usage analytics and higher request rates come with the Boost and Unlimited plans (Unlimited has no daily quota): see [API access and plans](https://nodely.io/docs/access/)."}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Example usage in SDKs for Algorand testnet","url":"https://nodely.io/docs/free/start/","text":"**JS SDK**\n\n```js\n//\n// npm install algosdk\n//\nimport algosdk from 'algosdk';\n\n// Define the Algorand node connection parameters\nconst algodToken = ''; // free service does not require tokens\nconst algodServer = 'https://testnet-api.4160.nodely.dev';\nconst algodPort = 443;\n\n// Create an instance of the algod client\nconst algodClient = new algosdk.Algodv2(algodToken, algodServer, algodPort);\n\nasync function getNodeStatus() {\n  try {\n    const status = await algodClient.status().do();\n    console.log('Node status:', status);\n  } catch (err) {\n    console.error('Failed to get node status:', err);\n  }\n}\n\n// Call the function to print the node status\ngetNodeStatus();\n```\n\n**Python**\n\n```python\n#\n# pip install py-algorand-sdk\n#\nfrom algosdk.v2client import algod\n\n# Replace these values with your node's address\n# free service does not require tokens\nalgod_address = \"https://testnet-api.4160.nodely.dev\"\nalgod_token = \"\"\n\n# Initialize the algod client\nalgod_client = algod.AlgodClient(algod_token, algod_address)\n\n# Get the node status\ntry:\n    status = algod_client.status()\n    print(\"Node status:\", status)\nexcept Exception as e:\n    print(f\"Failed to get node status: {e}\")\n```"}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Algorand endpoints","url":"https://nodely.io/docs/free/start/#algorand-endpoints","text":"| Algorand | Full Indexer v2 API | Full Algod v2 API |\n| --- | --- | --- |\n| MainNet | [https://mainnet-idx.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) | [https://mainnet-api.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| TestNet | [https://testnet-idx.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) | [https://testnet-api.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| BetaNet | [https://betanet-idx.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/indexer.oas3.yml) | [https://betanet-api.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/4160/algod.oas3.yml) |\n| FNet | [https://fnet-idx.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/fnet/indexer.oas3.yml) | [https://fnet-api.4160.nodely.dev](https://nodely.io/swagger/index.html?url=/swagger/api/fnet/algod.oas3.yml) |\n| more | networks @ [AVM Endpoints matrix](https://nodely.io/docs/free/start/endpoints) | <— |\n\nNote\n\nIt is OK to use the old `algonode.cloud` endpoints, same rules, same infra as `nodely.dev` ✅"}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Algorand Mainnet endpoints info","url":"https://nodely.io/docs/free/start/#algorand-mainnet-endpoints-info","text":"-   Cloudflare automatic balancing across 21+ geo locations\n-   Preflight acceleration (200+ locations)\n-   OK for production (backend & frontend)\n\nNote\n\nFree tier endpoints add artificial latency of 50 ms or more to backend and bot requests (no browser `Referer`); browser apps get none. Boost does the same; Unlimited and Enterprise add none.  \nCommercial `nodely.io` endpoints use separate, low latency Enterprise Cloudflare network."}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Voi network endpoints","url":"https://nodely.io/docs/free/start/#voi-network-endpoints","text":"| Voi | Full Indexer v2 API | Full Algod v2 API |\n| --- | --- | --- |\n| Mainnet | [https://mainnet-idx.voi.nodely.dev](https://mainnet-idx.voi.nodely.dev/health) | [https://mainnet-api.voi.nodely.dev](https://mainnet-api.voi.nodely.dev/v2/status) |"}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Voi Endpoints info","url":"https://nodely.io/docs/free/start/#voi-endpoints-info","text":"-   Cloudflare automatic balancing across 2 geo locations in USA\n-   Preflight acceleration (200+ locations)\n-   OK for production (backend & frontend)"}
{"id":"/docs/free/start/","title":"Algorand and AVM API quickstart","markdownUrl":"https://nodely.io/docs/free/start.md","heading":"Usage","url":"https://nodely.io/docs/free/start/#usage","text":"Nodely hosts vanilla [Algod API](https://developer.algorand.org/docs/rest-apis/algod/v2/) and [indexer API](https://developer.algorand.org/docs/rest-apis/indexer/) - just drop the URL in your SDK and you are good to go.\n\nTip\n\nDo not add /v2 or / at the end of the endpoint url in your SDK config.\n\nClick on a Front-End URL to proceed to online [Algod Swagger](https://mainnet-api.algonode.cloud/) or [Indexer Swagger](https://mainnet-idx.algonode.cloud/) documentation / API playground"}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"Make your first Algorand API call","url":"https://nodely.io/docs/get-started/","text":"Nodely provides two Algorand APIs: **Algod** reads node state and submits transactions; **Indexer** searches indexed blockchain data. Begin on testnet. These read-only examples need `curl`, internet access and no API key."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"1\\. Read node status","url":"https://nodely.io/docs/get-started/","text":"```bash\ncurl --fail-with-body https://testnet-api.4160.nodely.dev/v2/status\n```\n\nA successful response is a JSON object containing `last-round`, the node’s current round. The value changes as the network produces blocks. This request does not create or submit a transaction."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"2\\. Read indexer data","url":"https://nodely.io/docs/get-started/","text":"```bash\ncurl --fail-with-body 'https://testnet-idx.4160.nodely.dev/v2/transactions?limit=1'\n```\n\nThe response contains a `transactions` array and `current-round`. An empty array is valid. For larger result sets, use the returned pagination token as described in the [Indexer specification](https://nodely.io/swagger/api/4160/indexer.oas3.yml)."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"3\\. Choose the right network and access plan","url":"https://nodely.io/docs/get-started/","text":"-   Use the [endpoint matrix](https://nodely.io/docs/free/endpoints/) to select mainnet, testnet or another supported AVM chain.\n-   **Free** endpoints work without tokens, subject to the [usage policy](https://nodely.io/docs/free/policy/).\n-   **Boost** uses public `nodely.dev` hosts with paid authentication.\n-   **Unlimited and Enterprise** use the commercial endpoints in the [Unlimited guide](https://nodely.io/docs/unlimited/start/).\n-   Compare current prices and included services on [Pricing](https://nodely.io/pricing).\n\nWhen using an Algorand SDK, configure the base host without appending `/v2`. The SDK constructs operation paths. See the [JavaScript and Python examples](https://nodely.io/docs/free/start/)."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"4\\. Authenticate when using a paid plan","url":"https://nodely.io/docs/get-started/","text":"Keep tokens in your backend environment. For example, with a token from the Nodely portal:\n\n```bash\ncurl --fail-with-body \\\n  -H \"X-API-Key: $NODELY_TOKEN\" \\\n  https://mainnet-api.4160.nodely.io/v2/status\n```\n\nUse the host appropriate to your plan. Browser applications should use verified sites instead of embedding a secret token. The [authentication guide](https://nodely.io/docs/access/authentication/) covers SDK headers, verified sites, and eligible IP whitelists."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"5\\. Handle errors and reduce repeated work","url":"https://nodely.io/docs/get-started/","text":"-   On **429**, reduce concurrency and use exponential backoff with jitter. Honor `Retry-After` when supplied.\n-   On a **403 quota response**, inspect the response body and current quota. Retrying continuously will not restore a used daily allowance.\n-   Cache immutable block and transaction data; avoid requesting identical history repeatedly.\n-   Limit pagination concurrency and request only the new data your application needs.\n\nRead the [current limits and quota reset rules](https://nodely.io/docs/access/limits/) and [free-tier usage policy](https://nodely.io/docs/free/policy/) before increasing traffic."}
{"id":"/docs/get-started/","title":"Make your first Algorand API call","markdownUrl":"https://nodely.io/docs/get-started.md","heading":"Next steps","url":"https://nodely.io/docs/get-started/#next-steps","text":"-   [Algod OpenAPI YAML](https://nodely.io/swagger/api/4160/algod.oas3.yml) and [Indexer OpenAPI YAML](https://nodely.io/swagger/api/4160/indexer.oas3.yml)\n-   [Query state at a past round](https://nodely.io/docs/access/time-travel/)\n-   [Agent-readable documentation and local search](https://nodely.io/agents/)\n-   [x402 discovery](https://nodely.io/docs/x402/discovery/) for Nodely’s separate pay-per-call services"}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Gno.land public RPC","url":"https://nodely.io/docs/gno/","text":"Nodely runs a public archive RPC for gno.land mainnet. No account, no keys."}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Endpoints","url":"https://nodely.io/docs/gno/#endpoints","text":"| Network | Chain ID | RPC | Websocket |\n| --- | --- | --- | --- |\n| gno.land mainnet | `gnoland-1` | [`https://gnot.nodely.dev`](https://gnot.nodely.dev/status) | `wss://gnot.nodely.dev/websocket` |\n\n-   Full archive nodes synced from genesis.\n-   Requests are routed to the closest region (Europe or US West) with automatic failover.\n-   Both URI (GET) and JSON-RPC (POST) requests work, including JSON-RPC batches.\n-   Transaction search, GraphQL and live subscriptions are on the same host: see [indexer & GraphQL](https://nodely.io/docs/gno/indexer)."}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Available routes","url":"https://nodely.io/docs/gno/#available-routes","text":"Standard Tendermint2 RPC routes are enabled:\n\n-   Chain: `status`, `health`, `net_info`, `genesis`, `blockchain`, `block`, `block_results`, `commit`, `tx`\n-   Consensus: `validators`, `consensus_params`, `consensus_state`, `dump_consensus_state`\n-   Mempool: `unconfirmed_txs`, `num_unconfirmed_txs`\n-   Transactions: `broadcast_tx_sync`, `broadcast_tx_async`, `broadcast_tx_commit`\n-   Application: `abci_query`, `abci_info`\n\nUnsafe (admin) routes are disabled. The node keeps no transaction index, so `tx_search` is not available: use the [indexer & GraphQL](https://nodely.io/docs/gno/indexer) instead."}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Websocket","url":"https://nodely.io/docs/gno/#websocket","text":"The websocket at `wss://gnot.nodely.dev/websocket` accepts the same JSON-RPC calls as HTTP, request/response only. It saves connection overhead when you make many calls.\n\n-   gno.land’s Tendermint2 has no event subscriptions, so `subscribe` returns “Method not found”. Poll `status` or `block` over HTTP, or use the [indexer’s subscriptions](https://nodely.io/docs/gno/indexer#live-updates) to follow new blocks.\n-   Over the websocket, `status` expects one parameter: send `\"params\": [null]` instead of an empty list."}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Examples","url":"https://nodely.io/docs/gno/#examples","text":"```bash\ncurl https://gnot.nodely.dev/status\n\ncurl https://gnot.nodely.dev \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"abci_info\",\"params\":[]}'\n```"}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Limits","url":"https://nodely.io/docs/gno/#limits","text":"-   50 requests per second per IP (burst 100); excess requests get HTTP 429. The indexer has [its own limits](https://nodely.io/docs/gno/indexer#limits).\n-   1 MB maximum request body\n-   `broadcast_tx_commit` waits up to 10 seconds\n\nNeed more? [Talk to us](https://nodely.io/contact) about dedicated or [whitelabel](https://nodely.io/docs/whitelabel) endpoints."}
{"id":"/docs/gno/","title":"Gno.land public RPC","markdownUrl":"https://nodely.io/docs/gno.md","heading":"Coming soon","url":"https://nodely.io/docs/gno/#coming-soon","text":"-   A gno.land block explorer"}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Gno.land indexer & GraphQL","url":"https://nodely.io/docs/gno/indexer/","text":"The gno.land node has no transaction search. Nodely runs the [gno.land tx-indexer](https://github.com/gnolang/tx-indexer) next to its archive nodes to fill that gap: search transactions by sender, recipient, realm or message type, and follow new blocks and transactions in real time."}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Endpoints","url":"https://nodely.io/docs/gno/indexer/#endpoints","text":"All on the same host as the [public RPC](https://nodely.io/docs/gno), `gnot.nodely.dev`:\n\n| Service | Endpoint |\n| --- | --- |\n| GraphQL API (queries and subscriptions) | `https://gnot.nodely.dev/graphql/query` |\n| GraphQL playground | [`https://gnot.nodely.dev/graphql`](https://gnot.nodely.dev/graphql) |\n| Indexer JSON-RPC | `https://gnot.nodely.dev/indexer` |\n| Indexer websocket (`newHeads`) | `wss://gnot.nodely.dev/indexer/ws` |\n\n-   gno.land mainnet (`gnoland-1`), full history from block 1.\n-   No account, no keys. CORS is open, so browser apps can call it directly.\n-   The playground documents every query, field and filter."}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Search transactions","url":"https://nodely.io/docs/gno/indexer/#search-transactions","text":"`getTransactions` takes a `where` filter on any transaction field, including message contents. Filters support `eq`, `gt`, `lt` and `exists`, combined with `_and`, `_or` and `_not`.\n\nThere is no result limit, so always scope a search with `block_height`.\n\nIncoming transfers to an address:\n\n```graphql\n{\n  getTransactions(where: {\n    block_height: { gt: 980000 }\n    messages: { value: { BankMsgSend: { to_address: { eq: \"g1...\" } } } }\n  }) {\n    hash\n    block_height\n    success\n    messages {\n      value {\n        ... on BankMsgSend { from_address to_address amount }\n      }\n    }\n  }\n}\n```\n\nCalls to a realm:\n\n```graphql\n{\n  getTransactions(where: {\n    block_height: { gt: 980000 }\n    messages: { value: { MsgCall: { pkg_path: { eq: \"gno.land/r/...\" } } } }\n  }) {\n    hash\n    block_height\n    messages {\n      value {\n        ... on MsgCall { caller pkg_path func }\n      }\n    }\n  }\n}\n```\n\nPackages and realms deployed:\n\n```graphql\n{\n  getTransactions(where: {\n    block_height: { gt: 980000 }\n    messages: { value: { MsgAddPackage: {} } }\n  }) {\n    hash\n    block_height\n    messages {\n      value {\n        ... on MsgAddPackage { creator package { name path } }\n      }\n    }\n  }\n}\n```\n\nWith curl:\n\n```bash\ncurl https://gnot.nodely.dev/graphql/query \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":\"{ latestBlockHeight }\"}'\n```"}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Live updates","url":"https://nodely.io/docs/gno/indexer/#live-updates","text":"Subscriptions run on the same `/graphql/query` path over a websocket (`graphql-transport-ws` protocol, which standard GraphQL clients use). They deliver blocks or transactions created after the subscription starts.\n\n```graphql\nsubscription {\n  getBlocks(where: {}) {\n    height\n    time\n    num_txs\n  }\n}\n```\n\n`getTransactions` works as a subscription too, with the same filters. For example, a wallet can watch for incoming transfers."}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Supply","url":"https://nodely.io/docs/gno/indexer/#supply","text":"```graphql\n{\n  getSupply(denom: \"ugnot\") { height total spendable locked }\n}\n```\n\n`spendable` is what data aggregators call the circulating supply."}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"JSON-RPC","url":"https://nodely.io/docs/gno/indexer/#json-rpc","text":"POST JSON-RPC 2.0 requests to `https://gnot.nodely.dev/indexer`.\n\n| Method | Params | Returns |\n| --- | --- | --- |\n| `getTxResultByHash` | `[hash]`, base64 | transaction result, base64 Amino |\n| `getTxResult` | `[height, index]` | transaction result, base64 Amino |\n| `getBlock` | `[\"height\"]` | block, base64 Amino |\n| `getSupply` | `[\"ugnot\"]` | `{ denom, height, total, spendable, locked }` |\n| `getGasPrice` | `[]` | `[{ denom, low, average, high }]` |\n\nTransaction and block results come back as base64 Amino binary. Use GraphQL when you want JSON.\n\n```bash\ncurl https://gnot.nodely.dev/indexer \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getGasPrice\",\"params\":[]}'\n```"}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"New block headers","url":"https://nodely.io/docs/gno/indexer/#new-block-headers","text":"Over `wss://gnot.nodely.dev/indexer/ws` you can subscribe to new block headers. This is the push feed the node’s own websocket lacks:\n\n```json\n{ \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"subscribe\", \"params\": [\"newHeads\"] }\n```\n\nEach notification carries the header as base64 Amino binary."}
{"id":"/docs/gno/indexer/","title":"Gno.land indexer & GraphQL","markdownUrl":"https://nodely.io/docs/gno/indexer.md","heading":"Limits","url":"https://nodely.io/docs/gno/indexer/#limits","text":"Per client IP:\n\n-   5 requests per second (burst 20 for GraphQL, 40 for JSON-RPC)\n-   8 concurrent requests\n-   Requests over the limit get HTTP 429\n\nNeed more? [Talk to us](https://nodely.io/contact) about dedicated or [whitelabel](https://nodely.io/docs/whitelabel) endpoints."}
{"id":"/docs/","title":"Documentation","markdownUrl":"https://nodely.io/docs.md","heading":"Documentation","url":"https://nodely.io/docs/","text":"Nodely’s main goal is to boost dev teams productivity with a set of public services that can be consumed without any special setup."}
{"id":"/docs/","title":"Documentation","markdownUrl":"https://nodely.io/docs.md","heading":"Quickstart","url":"https://nodely.io/docs/#quickstart","text":"Go to our [QuickStart](https://nodely.io/docs/free/start) section to start interacting with you chosen AVM chain - no keys needed.\n\nNeed an API token, usage analytics or more than the free daily quota? See [API access and plans](https://nodely.io/docs/access/) for the Boost, Unlimited and Enterprise plans.\n\nBuilding on Monero, Gno.land, Ethereum, Base or Arc? See the [Monero public node](https://nodely.io/docs/monero), [Gno.land public RPC](https://nodely.io/docs/gno), [Ethereum public RPC](https://nodely.io/docs/ethereum), [Base public RPC](https://nodely.io/docs/base) and [Arc public RPC](https://nodely.io/docs/arc) pages.\n\nRunning an RPC brand? We offer [unlimited, flat-fee whitelabel RPC](https://nodely.io/docs/whitelabel).\n\nFew rules :\n\n-   Please observe our [fair usage policy](https://nodely.io/docs/free/policy) for the [free tier](https://nodely.io/docs/free/start)\n-   Free tier is **good for production** - we only as that you mention Nodely on your project’s site.\n-   Help with keeping Algorand chains green by writing code that\n    -   uses local caching\n    -   retries API calls with exponential backoff\n    -   requests only new data / changes - history is immutable on the chain ;)"}
{"id":"/docs/","title":"Documentation","markdownUrl":"https://nodely.io/docs.md","heading":"Supported networks","url":"https://nodely.io/docs/#supported-networks","text":"| Chain ID | Network | Features | Type | Access |\n| --- | --- | --- | --- | --- |\n| algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k | Algorand Mainnet | Node RPC, Indexer API | Archival | Public |\n| algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe | Algorand Testnet | Node RPC, Indexer API | Archival | Public |\n| monero:mainnet | Monero Mainnet | [Restricted daemon RPC](https://nodely.io/docs/monero), [Explorer](https://nodely.io/docs/monero/explorer) | Archival (EU) | Public |\n| monero:stagenet | Monero Stagenet | [Restricted daemon RPC](https://nodely.io/docs/monero), [Explorer](https://nodely.io/docs/monero/explorer), [Faucet](https://nodely.io/docs/monero/faucet) | Archival | Public |\n| gno:gnoland-1 | Gno.land Mainnet | [Tendermint2 RPC, Websocket](https://nodely.io/docs/gno), [Indexer GraphQL](https://nodely.io/docs/gno/indexer) | Archival | Public |\n| eip155:1 | Ethereum Mainnet | [JSON-RPC, WebSocket](https://nodely.io/docs/ethereum) | Pruned (recent blocks) | Public |\n| eip155:8453 | Base Mainnet | [JSON-RPC, WebSocket](https://nodely.io/docs/base) | Pruned (recent blocks) | Public |\n| eip155:5042 | Arc Mainnet | [JSON-RPC, WebSocket](https://nodely.io/docs/arc) | Pruned (recent blocks) | Public |\n| cosmos:cosmoshub-4 | Cosmos Hub 4 | Json-RPC, gRPC, gRPC/HTTP, Rosetta | Archival | Paid |"}
{"id":"/docs/","title":"Documentation","markdownUrl":"https://nodely.io/docs.md","heading":"Search and agent access","url":"https://nodely.io/docs/#search-and-agent-access","text":"[Search documentation, pricing and engineering articles](https://nodely.io/search/), or use the [agent resources](https://nodely.io/agents/) for Markdown pages, the downloadable content index and API specifications. Every documentation page has a **View Markdown** link containing the same released content."}
{"id":"/docs/monero/explorer/","title":"Monero explorer","markdownUrl":"https://nodely.io/docs/monero/explorer.md","heading":"Monero explorer","url":"https://nodely.io/docs/monero/explorer/","text":"| Network | Explorer |\n| --- | --- |\n| Monero mainnet | [explore.xmr.nodely.dev](https://explore.xmr.nodely.dev/) |\n| Monero stagenet | [explore.sxmr.nodely.dev](https://explore.sxmr.nodely.dev/) |"}
{"id":"/docs/monero/explorer/","title":"Monero explorer","markdownUrl":"https://nodely.io/docs/monero/explorer.md","heading":"Features","url":"https://nodely.io/docs/monero/explorer/#features","text":"-   Blocks, transactions with rings and outputs, key image spend status\n-   Live mempool, reorgs and hard forks\n-   Search: addresses are decoded in your browser and never sent to the server\n-   A no-JavaScript lite version under `/lite`\n-   No access logs"}
{"id":"/docs/monero/explorer/","title":"Monero explorer","markdownUrl":"https://nodely.io/docs/monero/explorer.md","heading":"API","url":"https://nodely.io/docs/monero/explorer/#api","text":"-   An onion-explorer compatible API under `/api/` (`networkinfo`, `block`, `transaction`, `transactions`, `mempool`, `search`, `rawblock`, `rawtransaction`, …), a drop-in replacement for tools written against xmrchain-style explorers.\n-   A native API under `/api/v1/`.\n\nAPI requests are rate limited per IP; expect HTTP 429 when over the limit."}
{"id":"/docs/monero/faucet/","title":"Monero stagenet faucet","markdownUrl":"https://nodely.io/docs/monero/faucet.md","heading":"Monero stagenet faucet","url":"https://nodely.io/docs/monero/faucet/","text":"Get stagenet coins at [faucet-stagenet.xmr.nodely.dev](https://faucet-stagenet.xmr.nodely.dev/).\n\n-   0.5 stagenet XMR per claim\n-   Payouts are batched and sent about once a minute\n-   No account and no CAPTCHA: your browser solves a short proof-of-work puzzle instead\n-   One claim per address and per IP every 24 hours\n\nStagenet coins have no value. Point your stagenet wallet at the [Nodely stagenet node](https://nodely.io/docs/monero) (`xmr.nodely.dev:38089`) and check the payout on the [stagenet explorer](https://explore.sxmr.nodely.dev/)."}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Monero public node","url":"https://nodely.io/docs/monero/","text":"Nodely runs public Monero nodes for wallets, apps and developers. No account, no keys."}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Endpoints","url":"https://nodely.io/docs/monero/#endpoints","text":"| Network | Host | Ports | Mode |\n| --- | --- | --- | --- |\n| Monero mainnet | `xmr.nodely.dev` | `18089`, `18081` | restricted RPC |\n| Monero stagenet | `xmr.nodely.dev` | `38089`, `38081` | restricted RPC |\n\n-   `monero.nodely.dev` is an alias of `xmr.nodely.dev`.\n-   TLS is optional: every port accepts both HTTPS and plain HTTP. Wallets detect TLS automatically.\n-   Requests are routed to the closest region (Europe or US West).\n-   The node runs in restricted mode, so admin methods are disabled. Wallet sync, `/json_rpc` and the other daemon endpoints (`/get_info`, `/get_transactions`, `/send_raw_transaction`, …) work as on any public node.\n-   CORS is open, so browser apps can call the node directly."}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Connect a wallet","url":"https://nodely.io/docs/monero/#connect-a-wallet","text":"**CLI**\n\n```bash\nmonero-wallet-cli --daemon-address xmr.nodely.dev:18089\n```\n\nFor stagenet add `--stagenet` and use port `38089`.\n\n**Feather**\n\n1.  Go to **Settings → Network → Node**.\n2.  Uncheck **Let Feather manage this list**.\n3.  Click **Add custom node(s)** and enter `xmr.nodely.dev:18089`.\n\nFor stagenet, start Feather with `feather --stagenet` and use port `38089`.\n\n**Monero GUI**\n\nGo to **Settings → Node → Remote node**, click **Add remote node** and enter address `xmr.nodely.dev`, port `18089`.\n\n**wallet-rpc**\n\n```bash\nmonero-wallet-rpc --daemon-address xmr.nodely.dev:18089 \\\n  --rpc-bind-port 18083 --wallet-dir ./wallets \\\n  --rpc-login user:change-me\n```"}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Daemon RPC","url":"https://nodely.io/docs/monero/#daemon-rpc","text":"```bash\ncurl https://xmr.nodely.dev:18089/get_info\n\ncurl https://xmr.nodely.dev:18089/json_rpc \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"get_block_count\"}'\n```\n\nLibraries such as monero-ts and monero-python take the same URL: `https://xmr.nodely.dev:18089`."}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Related services","url":"https://nodely.io/docs/monero/#related-services","text":"-   [Block explorer](https://nodely.io/docs/monero/explorer) for mainnet and stagenet\n-   [Stagenet faucet](https://nodely.io/docs/monero/faucet) to get test coins"}
{"id":"/docs/monero/","title":"Monero public node","markdownUrl":"https://nodely.io/docs/monero.md","heading":"Privacy & fair use","url":"https://nodely.io/docs/monero/#privacy--fair-use","text":"-   Request logs keep a truncated, hashed client IP, the ASN, the user agent and the RPC method, for capacity planning and abuse handling.\n-   Please do not hammer the node. Heavy or commercial workloads should [talk to us](https://nodely.io/contact) about dedicated or [whitelabel](https://nodely.io/docs/whitelabel) endpoints."}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"BigQuery dataset","url":"https://nodely.io/docs/public/bigquery/","text":"BigQuery costs\n\nRunning queries against this dataset can generate costs up to $2 per query - be careful.  \nContact [sales@nodely.io](mailto:sales@nodely.io) for a faster, more flexible and [flat fee alternative](https://nodely.io/docs/solutions/clickhouse/superset/) .\n\nThis dataset is subject to change without notice.  \nPlease provide [feedback](https://discord.com/channels/491256308461207573/930780105196859412) on missing features to be included in the final ETL."}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Public dataset","url":"https://nodely.io/docs/public/bigquery/#public-dataset","text":"Nodely maintains a [public BigQuery dataset](https://console.cloud.google.com/bigquery?ws=!1m4!1m3!3m2!1snodely-data-pub!2salgorand_mainnet_daily) with Algorand mainnet contents:\n\n-   snapshot only (daily updates once schema is finalized)\n-   schema inspired by Google public blockchain datasets (ETH, …)\n-   dataset is public but not free - Google charges for data read from this dataset\n-   contact [sales@nodely.io](mailto:sales@nodely.io) for datasets and/or SelfService BI with hourly or 5m incremental loads."}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Quick start","url":"https://nodely.io/docs/public/bigquery/#quick-start","text":"Go to [Algorand dataset @ BigQuery](https://console.cloud.google.com/bigquery?ws=!1m4!1m3!3m2!1snodely-data-pub!2salgorand_mainnet_daily) and start playing ;D\n\n[![](https://nodely.io/_astro/bqds.CERdJx2Y_Z15dp40.webp)](https://console.cloud.google.com/bigquery?ws=!1m4!1m3!3m2!1snodely-data-pub!2salgorand_mainnet_daily)"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Reading list","url":"https://nodely.io/docs/public/bigquery/#reading-list","text":"-   [Algorand transaction reference](https://developer.algorand.org/docs/get-details/transactions/transactions/)\n-   [Inner transactions](https://developer.algorand.org/docs/get-details/dapps/smart-contracts/apps/innertx/)\n-   [Algorand Standard Assets (tokens/NFTs)](https://developer.algorand.org/docs/get-details/asa/)\n-   [Account rekey](https://developer.algorand.org/docs/get-details/accounts/rekey/)"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Base tables","url":"https://nodely.io/docs/public/bigquery/#base-tables","text":"**transactions**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.transactions`\n(\n  block_number INT64 NOT NULL             -- Number of the block in which this transaction was located.\n  block_timestamp TIMESTAMP NOT NULL      -- Unix timestamp when the block was assembled\n  transaction_hash STRING NOT NULL        -- Hash of the transaction\n  transaction_group BYTES                 -- Parent atomic group id (binary)\n  transaction_offset INT64 NOT NULL       -- Transaction's index position in the block\n  transaction_type STRING NOT NULL        -- One of acc_close acc_payment acc_payment_create app_call app_clear app_close app_delete app_optin app_update asa_clawback asa_config asa_create asa_destroy asa_freeze asa_optin asa_optout asa_transfer asa_unfreeze key_reg key_unreg stpf\n  from_addr_id INT64                      -- Sender address id\n  to_addr_id INT64                        -- Recipient address id\n  value_float FLOAT64 NOT NULL            -- Decimal adjusted amount of Algo or token\n  value_int NUMERIC(20) NOT NULL          -- Integer amount of Algo or Token without decimal shift\n  close_to_addr_id INT64                  -- Address id of recipient of the closing balance\n  close_value_float FLOAT64 NOT NULL      -- Closing balance amount, decimal adjusted\n  close_value_int NUMERIC(20) NOT NULL    -- Closing balance amount without decimal shift\n  gas INT64 NOT NULL                      -- Transaction free in microAlgos\n  note STRING                             -- Optional note (up to 1KB)\n  rekey_to_addr_id INT64                  -- Account rekey to address id\n  auth_by_addr_id INT64                   -- Transaction authorized by this address id (if sender is rekeyed)\n  has_inners BOOL NOT NULL                -- Transaction has inner transactions\n  is_inner BOOL NOT NULL                  -- Transaction is an inner transaction issued by smart contract\n  clawback_from_addr_id INT64             -- Address id of the account the token is clawed back from\n  token_cfg STRUCT<list ARRAY<STRUCT<element INT64>>> NOT NULL -- new address ids for reserve/clawback/freezer/manger in random order\n  token_id INT64                          -- Asset id (token/nft)\n  token_total NUMERIC(20)                 -- Total number of assets minted\n  token_unit_name STRING                  -- Asset unit name\n  contract_id INT64                       -- ID of the contract called\n  input STRING                            -- Extra TX data / app call input\n  root_offset INT64                       -- transaction offset pointing to the root (outer) transation\n  parent_offset INT64                     -- transaction offset pointing to parent transaction\n  depth INT64                             -- the depth of the transaction in the tree\n  inners_all INT64                        -- number of all inners spawned by this transaction (recursive)\n  inners_direct INT64                     -- number of all direct (1st level) inners spawned by this transaction\n  PRIMARY KEY (block_number, transaction_offset) NOT ENFORCED,\n  FOREIGN KEY (from_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (close_to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (rekey_to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (from_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (close_to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (rekey_to_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (auth_by_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (auth_by_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (clawback_from_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (token_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.tokens`(token_id) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY block_number, transaction_offset\nOPTIONS(\n  description=\"Algorand mainnet transactions. See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**accounts**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.accounts`\n(\n  addr_id INT64 NOT NULL               -- id of the address\n  address STRING NOT NULL              -- Algorand string representation of the account address\n  balance_micro NUMERIC NOT NULL       -- Account microAlgo balance\n  type STRING                          -- Account type : sig|msig|contract. sig/msig detection needs at least one outflow\n  is_deleted BOOL NOT NULL             -- Is account closed\n  is_online BOOL NOT NULL              -- Is account registered to vote\n  block_number INT64 NOT NULL          -- Block of the first inflow that created the account\n  block_timestamp TIMESTAMP NOT NULL   -- Timestamp of the first inflow that created the account\n  last_closed_at INT64                 -- Block of the last account close operation\n  last_closed_at_ts TIMESTAMP          -- Timestamp of the last account close operation\n  rekeyed_to_addr_id INT64             -- Address id of account that is solely authorized to sign for this account\n  contract_id INT64                    -- Id of smart contract that owns this account\n  nft_count INT64 NOT NULL             -- Number of different tokens with total numner == 1 this account holds\n  token_count INT64 NOT NULL           -- Number of different tokens (of any type) this account holds\n  usd_stables_balance FLOAT64 NOT NULL -- USD value of all stable USD tokens this account holds\n  voting_from_block INT64              -- First block this account can vote on\n  voting_until_block INT64             -- Last block this account can vote on\n  mbr_micro INT64 NOT NULL             -- Microalgos locked in this account as 'minimum balance'\n  boxes INT64 NOT NULL                 -- Number of K/V storage entries in this account\n  rekeyed_to_contract_id INT64         -- Id of smart contract that can spend from this account\n  row_ver INT64 NOT NULL               -- Row version (updated at block number)\n  PRIMARY KEY (addr_id) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY addr_id\nOPTIONS(\n  description=\"Account state. See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**blocks**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.blocks`\n(\n  block_timestamp TIMESTAMP NOT NULL           -- block timestamp\n  block_number INT64 NOT NULL                  -- block number\n  proposer_addr_id INT64 NOT NULL              -- address id of block proposer\n  voter_addr_ids STRUCT<list ARRAY<STRUCT<element INT64>>> NOT NULL -- list of cert voters addr ids, up to 75% threshold, random node sample\n  block_algo_sum FLOAT64 NOT NULL              -- sum of Algo transacted in the block\n  block_gas_sum_malgo INT64 NOT NULL           -- total fees in microAlgos\n  block_rewards_malgo INT64 NOT NULL           -- rewards to proposer in microAlgos\n  block_tx_cnt INT64 NOT NULL                  -- successful transactions in the block\n  tokens_dc INT64 NOT NULL                     -- tokens distinct count in the block\n  nft_dc INT64 NOT NULL                        -- NFTs distinct count in the block\n  contract_dc INT64 NOT NULL                   -- Contracts distinct count in the block\n  token_id_top INT64 NOT NULL                  -- Top transacted token id in the block\n  constract_id_top INT64 NOT NULL              -- Top called contract id in the block\n  addresses_new_cnt INT64 NOT NULL             -- New addresses seen in the block\n  group_cnt INT64 NOT NULL                     -- Atomic group count in the block\n  group_max INT64 NOT NULL                     -- TX count in the largest group\n  addresses_dc INT64 NOT NULL                  -- Addresses distinct count in the block\n  pay_cnt INT64 NOT NULL                       -- Count of Algo payment TX\n  keyreg_cnt INT64 NOT NULL                    -- Count of key (un)registration TX\n  acfg_cnt INT64 NOT NULL                      -- Count of token configuration TX\n  axfer_cnt INT64 NOT NULL                     -- Count of token transfer TX\n  afrz_cnt INT64 NOT NULL                      -- Count of token (un)freeze TX\n  appl_cnt INT64 NOT NULL                      -- Count of contract call TX\n  stpf_cnt INT64 NOT NULL                      -- Count of state proof TX\n  PRIMARY KEY (block_number) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY block_number\nOPTIONS(\n  description=\"Blocks stats. See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**contracts**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.contracts`\n(\n  contract_id INT64 NOT NULL          -- Id of the contract (app)\n  block_number INT64 NOT NULL         -- Block the contract was created at\n  block_timestamp TIMESTAMP NOT NULL  -- Timestamp the contract was created at\n  creator_addr_id INT64 NOT NULL      -- Addr_id of the creating account\n  is_deleted BOOL NOT NULL            -- Is the contract deleted\n  closed_at INT64                     -- Block numnber the contract got deleted at\n  closed_at_ts TIMESTAMP              -- Timestamp the contract got deleted at\n  code BYTES                          -- Contract byte code\n  code_hash_sha256 BYTES              -- SHA256 of the contract bytecode\n  clear_code BYTES                    -- Contract clear bytecode\n  clear_code_hash_sha256 BYTES        -- SHA256 of the contract clear bytecodwe\n  addr_id INT64                       -- Id of account address of the contract\n  boxes INT64 NOT NULL                -- Number of boxes this contract holds\n  users INT64 NOT NULL                -- Number of addresses that ever opted into this contract\n  users_current INT64 NOT NULL        -- Number of addresses that are not opted into the contract\n  row_ver INT64 NOT NULL              -- Row version (block number), use the latest one\n  PRIMARY KEY (contract_id) NOT ENFORCED,\n  FOREIGN KEY (addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (creator_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY contract_id\nOPTIONS(\n  description=\"Algorand mainnet contracts. See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**tokens**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.tokens`\n(\n  token_id INT64 NOT NULL             -- ID of the native token (ASA)\n  block_number INT64 NOT NULL         -- Block number of token creation\n  block_timestamp TIMESTAMP NOT NULL  -- Timestamp of token creation\n  creator_addr_id INT64               -- ID of the creator address\n  freeze_addr_id INT64                -- ID of the freeze address\n  manager_addr_id INT64               -- ID of the manager address\n  reserve_addr_id INT64               -- ID of the reserve address\n  clawback_addr_id INT64              -- ID of the clawback address\n  unit_name STRING                    -- Token unit name  (ticker)\n  name STRING                         -- Token full name\n  url STRING                          -- URL associated with the token\n  is_nft BOOL NOT NULL                -- Is this an NFT (total = 1)\n  arcs STRUCT<list ARRAY<STRUCT<element INT64>>> NOT NULL  -- List of standards this token follows\n  ipfs_json STRING                    -- JSON object with metadata downloaded from IPFS\n  default_frozen BOOL NOT NULL        -- Is the token frozen by default\n  token_total NUMERIC(20) NOT NULL    -- Total number of tokens\n  decimals INT64 NOT NULL             -- Decimal shift\n  is_deleted BOOL NOT NULL            -- Is the token deleted\n  closed_at INT64                     -- Block number of the token deletion\n  closed_at_timestamp TIMESTAMP       -- Timestamp of the token deletion\n  row_ver INT64 NOT NULL              -- Row version\n  PRIMARY KEY (token_id) NOT ENFORCED,\n  FOREIGN KEY (creator_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (reserve_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (manager_addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY token_id\nOPTIONS(\n  description=\"Native tokens (Algorand Standard Assets). See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**token\\_holdings**\n\n```sql\n-- `nodely-data-pub`.algorand_mainnet_daily.token_holdings definition\n\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.token_holdings`\n(\n  token_id INT64 NOT NULL              -- ID of the token / NFT\n  addr_id INT64 NOT NULL               -- Holder address id\n  token_total NUMERIC(20) NOT NULL     -- Total number of tokens minted\n  balance_int NUMERIC(20) NOT NULL     -- Balance without decimal shift\n  balance_float FLOAT64 NOT NULL       -- Balance , decimal shifter\n  unit_name STRING NOT NULL            -- Unit name (ticker)\n  is_circulating BOOL NOT NULL         -- Does this balance count towards circulating supply\n  is_frozen BOOL NOT NULL              -- Is the token frozen\n  is_deleted BOOL NOT NULL             -- Is the holding deleted\n  block_number INT64 NOT NULL          -- Block number when address opted-in to the token\n  block_timestamp TIMESTAMP NOT NULL   -- Opt-in timestamp\n  closed_at INT64                      -- Block number holding got deleted (opted-out)\n  closed_at_ts TIMESTAMP               -- Opt-out timestamp\n  row_ver INT64 NOT NULL               -- Row version\n  PRIMARY KEY (token_id, addr_id) NOT ENFORCED,\n  FOREIGN KEY (addr_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.accounts`(addr_id) NOT ENFORCED,\n  FOREIGN KEY (token_id) REFERENCES `nodely-data-pub.algorand_mainnet_daily.tokens`(token_id) NOT ENFORCED\n)\nPARTITION BY TIMESTAMP_TRUNC(block_timestamp, MONTH)\nCLUSTER BY token_id, addr_id\nOPTIONS(\n  description=\"Native tokens holdings. Use See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"production\")]\n);\n```\n\n**account\\_labels**\n\n-   An account can have multiple labels\n-   Each label has a source (eg Algorand Foundation) and multiple arbitrary tags\n\n```sql\n-- `nodely-data-pub`.algorand_mainnet_daily.account_labels definition\n\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily.account_labels`\n(\n  addr STRING NOT NULL                 -- Human readable Algorand address\n  addr_id INT64 NOT NULL               -- Internal address id\n  last_updated_at TIMESTAMP NOT NULL   -- Timestamp of the last update of any of the labels\n  label_cound INTEGER NOT NULL         -- Number of nested labels\n  labels []RECORD\n    label STRING                       -- Address label\n    src STRING                         -- Source of the label (eg Algorand Foundation)\n    tags []STRING                      -- Arbitrary tags (eg CEX)\n  updated_at TIMESTAMP                 -- Last timestamp of the label update\n);\n```\n\n![](https://nodely.io/_astro/labels.BYz_hLgO_18FVUP.webp)"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Base views","url":"https://nodely.io/docs/public/bigquery/#base-views","text":"**v\\_flows\\_simple**\n\n```sql\n-- Simple non zero Algo / NFT / Token flows\n-- Each transaction creates 2 or more flows , +close_to, +clawback\n\n-- Caveats:\n-- * Clawback not rendered yet\n-- * An NFT is a token with a total number or units == 1\n--\ncreate view `algorand_mainnet_daily.v_flows_simple` as\nwith flows as (\n-- no clawback\n  select\n    block_timestamp\n    , from_addr_id addr_id\n    , to_addr_id other_addr_id\n    , 'outflow' as dir\n    , value_float as flow_value\n    , gas / pow(10,6) gas_algo\n    , case when t.transaction_type like 'acc%' then 'algo' when token_total = 1 then 'nft' else 'token' end xfer\n    , token_id\n    , t.is_inner\n    , t.transaction_type\n  from\n    `algorand_mainnet_daily.transactions` t\n  where\n    (t.transaction_type like 'acc%' or t.transaction_type like 'asa%')\nUNION ALL\n  select\n    block_timestamp\n    , from_addr_id addr_id\n    , close_to_addr_id other_addr_id\n    , 'outflow' as dir\n    , close_value_float as flow_value\n    , 0 gas_algo\n    , case when t.transaction_type like 'acc%' then 'algo' when token_total = 1 then 'nft' else 'token' end xfer\n    , token_id\n    , t.is_inner\n    , t.transaction_type\n  from\n    `algorand_mainnet_daily.transactions` t\n  where\n    (t.transaction_type like 'acc%' or t.transaction_type like 'asa%')\n    and close_to_addr_id IS NOT NULL\nUNION ALL\n  select\n    block_timestamp\n    , to_addr_id addr_id\n    , from_addr_id other_addr_id\n    , 'inflow' as dir\n    , value_float as flow_value\n    , 0 gas_algo\n    , case when t.transaction_type like 'acc%' then 'algo' when token_total = 1 then 'nft' else 'token' end xfer\n    , token_id\n    , t.is_inner\n    , t.transaction_type\n  from\n    `algorand_mainnet_daily.transactions` t\n  where\n    (t.transaction_type like 'acc%' or t.transaction_type like 'asa%')\nUNION ALL\n  select\n    block_timestamp\n    , close_to_addr_id addr_id\n    , from_addr_id other_addr_id\n    , 'inflow' as dir\n    , close_value_float as flow_value\n    , 0 gas_algo\n    , case when t.transaction_type like 'acc%' then 'algo' when token_total = 1 then 'nft' else 'token' end xfer\n    , token_id\n    , t.is_inner\n    , t.transaction_type\n  from\n    `algorand_mainnet_daily.transactions` t\n  where\n    (t.transaction_type like 'acc%' or t.transaction_type like 'asa%')\n    and close_to_addr_id IS NOT NULL\n) select * from flows where flow_value > 0;\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Aux tables","url":"https://nodely.io/docs/public/bigquery/#aux-tables","text":"**token\\_prices**\n\n```sql\nCREATE TABLE `nodely-data-pub.algorand_mainnet_daily`.token_prices\n(\n  token_id INT64 NOT NULL -- id of the token\n  token_name STRING NOT NULL -- token name\n  token_ticker STRING NOT NULL -- token ticker\n  algo_value FLOAT64 NOT NULL -- token current value in Algo\n  market_cap FLOAT64 NOT NULL -- token current MC in Algo\n  first_block_number INT64 NOT NULL -- first block with price data\")\n)\nCLUSTER BY token_id\nOPTIONS(\n  description=\"Token prices, updated daily. See: https://nodely.io/docs/public/bigquery\",\n  labels=[(\"status\", \"development\")]\n);\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Addresses created monthly","url":"https://nodely.io/docs/public/bigquery/#addresses-created-monthly","text":"**blocks table**\n\n```sql\n-- <1 GB processed\nSELECT\n  TIMESTAMP_TRUNC(bs.block_timestamp, MONTH) ts\n  , sum(`addresses_new_cnt) addresses_created\nFROM\n  `algorand_mainnet_daily.blocks` bs\nGROUP BY\n  ts\nORDER BY\n  ts\n```\n\n**transactions table**\n\n```sql\n-- 40GB processes\nSELECT\n  TIMESTAMP_TRUNC(txn.block_timestamp, MONTH) ts\n  , count(*) addresses_created\nFROM\n  `algorand_mainnet_daily.transactions` txn\nWHERE\n  txn.transaction_type = 'acc_payment_create'\nGROUP BY\n  ts\nORDER BY\n  ts\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Daily discinct addresses stats","url":"https://nodely.io/docs/public/bigquery/#daily-discinct-addresses-stats","text":"**Fast**\n\n```sql\n-- no clawback\n select\n  TIMESTAMP_TRUNC(flows.block_timestamp, DAY) ts\n  ,count(distinct(flows.addr_id)) uniq_addresses\n  ,countIf(dir = 'outflow' and transaction_type = 'acc_payment_create') new_addresses\n  ,count(distinct(case when dir = 'outflow' then flows.addr_id else NULL end)) uniq_senders\n  ,count(distinct(case when dir = 'outflow' and xfer='algo' and flow_value > 100 then flows.addr_id else NULL end)) uniq_algo_senders_over_100A\n  ,count(distinct(case when dir = 'inflow' then flows.addr_id else NULL end)) uniq_reveicers\n  ,count(distinct(case when dir = 'inflow' and xfer='algo' and flow_value > 100 then flows.addr_id else NULL end)) uniq_algo_receivers_over_100A\n  ,count(distinct(case when dir = 'inflow' then flows.addr_id || ':' || other_addr_id else NULL end)) uniq_pairs\n  from\n    `algorand_mainnet_daily.v_flows_simple` flows\n  where\n    flows.block_timestamp between '2024-04-01' and '2024-04-30'\n  group by ts\n  order by ts\n```\n\n**With account type detection**\n\n```sql\n-- no clawback\n select\n  TIMESTAMP_TRUNC(flows.block_timestamp, DAY) ts\n  ,count(distinct(flows.addr_id)) uniq_addresses\n  ,count(distinct(case when coalesce(ame.type,'') != 'contract' then flows.addr_id else NULL end)) uniq_users\n  ,countIf(dir = 'outflow' and transaction_type = 'acc_payment_create') new_addresses\n  ,count(distinct(case when dir = 'outflow' then flows.addr_id else NULL end)) uniq_senders\n  ,count(distinct(case when dir = 'outflow' and xfer='algo' and flow_value > 100 then flows.addr_id else NULL end)) uniq_algo_senders_over_100A\n  ,count(distinct(case when dir = 'inflow' then flows.addr_id else NULL end)) uniq_reveicers\n  ,count(distinct(case when dir = 'inflow' and xfer='algo' and flow_value > 100 then flows.addr_id else NULL end)) uniq_algo_receivers_over_100A\n  ,count(distinct(case when dir = 'inflow' then flows.addr_id || ':' || other_addr_id else NULL end)) uniq_pairs\n  ,count(distinct(case when dir = 'inflow' and coalesce(ame.type,'') != 'contract' and coalesce(aoth.type,'') != 'contract' then flows.addr_id || ':' || other_addr_id else NULL end)) uniq_p2p_pairs\n  from\n    `algorand_mainnet_daily.v_flows_simple` flows\n      join `algorand_mainnet_daily.accounts` ame on (flows.addr_id = ame.addr_id)\n      join `algorand_mainnet_daily.accounts` aoth on (flows.other_addr_id = aoth.addr_id)\n  where\n    flows.block_timestamp between '2024-04-01' and '2024-04-30'\n  group by ts\n  order by ts\n```\n\n| **ts** | **u\\_addr** | **u\\_users** | **n\\_addr** | **u\\_snd** | **u\\_snd\\_100** | **u\\_rcv** | **u\\_rcv\\_100** | **u\\_pairs** | **u\\_p2p\\_pairs** |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 2024-04-01 | 60379 | 58682 | 8039 | 35924 | 6789 | 56326 | 7868 | 125254 | 100499 |\n| 2024-04-02 | 57538 | 56058 | 8472 | 34813 | 6901 | 54054 | 7542 | 116025 | 94185 |\n| 2024-04-03 | 68982 | 67593 | 11078 | 35524 | 7105 | 65422 | 7688 | 125994 | 106034 |\n| 2024-04-04 | 91427 | 78440 | 7981 | 38997 | 7076 | 88015 | 12873 | 157863 | 118940 |\n| 2024-04-05 | 79063 | 66208 | 8843 | 40902 | 7572 | 75180 | 8086 | 153148 | 113668 |\n| 2024-04-06 | 194888 | 191872 | 8005 | 20760 | 6017 | 190567 | 6271 | 416394 | 395175 |"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Top 10","url":"https://nodely.io/docs/public/bigquery/#top-10","text":"**White Stars**\n\n```sql\n-- White Stars (spawning new accounts)\n-- ~5GB\nWITH whiteStars AS (\n  SELECT\n    from_addr_id addr_id,\n    count(distinct(to_addr_id)) spread\n  FROM `algorand_mainnet_daily.transactions`\n  WHERE\n    block_timestamp > CURRENT_TIMESTAMP() - INTERVAL 7 DAY\n    AND transaction_type = 'acc_payment_create'\n    AND value_int > 0\n  GROUP BY from_addr_id\n  ORDER BY spread DESC\n  LIMIT 10\n) SELECT\n    address , spread as new_accounts\n  FROM\n    whiteStars JOIN `algorand_mainnet_daily.accounts` acc USING (addr_id)\n  ORDER BY new_accounts DESC\n```\n\n**Spammers**\n\n```sql\n-- Spammers (dusting existing accounts)\n-- ~2GB\nWITH spammers AS (\n  SELECT\n    from_addr_id addr_id,\n    count(distinct(to_addr_id)) spread\n  FROM `algorand_mainnet_daily.transactions`\n  WHERE\n    block_timestamp > CURRENT_TIMESTAMP() - INTERVAL 7 DAY\n    AND transaction_type = 'acc_payment'\n    AND value_int > 0\n  GROUP BY from_addr_id\n  ORDER BY spread DESC\n  LIMIT 10\n) SELECT\n    addr_id , spread as victims\n  FROM\n    spammers\n  ORDER BY victims DESC\n```\n\n**Black holes**\n\n```sql\n-- Blackholes (eating from most distinct account )\n-- ~2GB\nWITH bhole AS (\n  SELECT\n    to_addr_id addr_id,\n    count(distinct(from_addr_id)) spread\n  FROM `algorand_mainnet_daily.transactions`\n  WHERE\n    block_timestamp > CURRENT_TIMESTAMP() - INTERVAL 7 DAY\n    AND transaction_type = 'acc_payment'\n    AND value_int > 0\n    AND NOT is_inner\n  GROUP BY addr_id\n  ORDER BY spread DESC\n  LIMIT 10\n) SELECT\n    addr_id , spread as victims\n  FROM\n    bhole\n  ORDER BY victims DESC\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Token value","url":"https://nodely.io/docs/public/bigquery/#token-value","text":"**Tokens MCap**\n\n```sql\n-- Circulating (non clawback, non reserve, not burned) tokens value in USD\nDECLARE algousdc FLOAT64 DEFAULT 0;\n\nSET (algousdc) = (\n  SELECT AS STRUCT algo_value\n  FROM `algorand_mainnet_daily.token_prices`\n  WHERE token_id  = 31566704 /* USDC */\n);\n\nSELECT\n  sum(th.balance_float * algo_value) / algousdc MC_USD\nFROM\n  `algorand_mainnet_daily.token_holdings` th\n  JOIN `algorand_mainnet_daily.token_prices` tp using (token_id)\nWHERE\n  is_circulating\n  and th.addr_id not in (2853884730,1970085357,2451993965,1970086565,2451993800,2451993961,3579003880) /* skip known reserve */\n```\n\n**TOP 25 holders**\n\n```sql\n-- TOP 25 token holders (except Algo) by USD value\nDECLARE algousdc FLOAT64 DEFAULT 0;\n\nSET (algousdc) = (\n  SELECT AS STRUCT algo_value\n  FROM `algorand_mainnet_daily.token_prices`\n  WHERE token_id  = 31566704 /* USDC */\n);\n\nWITH tthaid AS (\nSELECT\n  th.addr_id, sum(th.balance_float * algo_value) / algousdc hold_usd_val\nFROM\n  `algorand_mainnet_daily.token_holdings` th\n  JOIN `algorand_mainnet_daily.token_prices` tp using (token_id)\nWHERE\n  is_circulating\n  and th.addr_id not in (2853884730,1970085357,2451993965,1970086565,2451993800,2451993961,3579003880) /* skip known reserve */\nGROUP BY\n  th.addr_id\nORDER BY hold_usd_val DESC\nLIMIT 25\n) SELECT\n  hold_usd_val, address\n  FROM tthaid JOIN `algorand_mainnet_daily.accounts` using (addr_id)\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Demo","url":"https://nodely.io/docs/public/bigquery/#demo","text":"**Monthly SC deployments**\n\n```sql\nSELECT\n  TIMESTAMP_TRUNC(block_timestamp, MONTH) yearMonth\n  , count(*) newContractDeployments\nFROM\n  nodely-data-pub.algorand_mainnet_daily.contracts\nWHERE\n  block_timestamp < TIMESTAMP_TRUNC(current_timestamp(), MONTH)\nGROUP BY\n  yearMonth;\n```\n\n**Monthly Active/Unique SC**\n\n```sql\nwith dd as (\nSELECT\n  monthYear\n  , sum(cast(date(TIMESTAMP_TRUNC(block_timestamp,MONTH)) = monthYear as int64)) deployed\n  , sum(cast(date(TIMESTAMP_TRUNC(closed_at_ts,MONTH)) = monthYear as int64)) destroyed\nFROM\n  UNNEST(GENERATE_DATE_ARRAY('2020-12-01', '2024-06-01', INTERVAL 1 MONTH)) monthYear,\n  nodely-data-pub.algorand_mainnet_daily.contracts\ngroup by\n  monthYear\norder by\n  monthYear\n) select\n   monthYear\n   ,deployed newDeployments\n   ,deployed - destroyed as deploymentDelta\n   ,SUM(deployed - destroyed) OVER(ORDER BY monthYear ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) activeDeployments\n   ,(select count(distinct(code_hash_sha256)) from `nodely-data-pub.algorand_mainnet_daily`.contracts c\n     where DATE(c.block_timestamp) <= monthYear and (DATE(c.closed_at_ts) is NULL or DATE(c.closed_at_ts) > monthYear )) uniqueSmartContracts\n  from dd\n  order by monthYear\n```\n\n**Monthly Active/Unique SC**\n\n```sql\nwith whiteHoles as (\nselect\n  from_addr_id addr_id\n  ,count(*) cnt\n  ,row_number() over(order by count(*) desc) rn\nfrom\n  `nodely-data-pub.algorand_mainnet_daily`.transactions\nwhere\n  transaction_type = 'acc_payment_create' -- this way first payment to this address\n  and value_int > 0 -- only interested in non-zero payments (that result in fully funded address)\n  and TIMESTAMP_TRUNC(block_timestamp,  MONTH) = '2024-05-01'\ngroup by\n  from_addr_id\norder by\n  cnt desc\n), top10 as (select\n   case when rn < 10 then addr_id else NULL end addr_id\n   , sum(cnt) cnt\n   from whiteHoles\n   group by 1\n   order by 2 desc\n) select\n    COALESCE (`nodely-data-pub.algorand_mainnet_daily`.utilShortAddr(a.address), 'other') creatorAddress\n    , cnt fundedAccounts\n  from\n    top10\n    LEFT JOIN `nodely-data-pub.algorand_mainnet_daily`.accounts a on top10.addr_id = a.addr_id\n  order by\n    cnt desc\n```"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Video tutorials","url":"https://nodely.io/docs/public/bigquery/#video-tutorials","text":"* * *"}
{"id":"/docs/public/bigquery/","title":"BigQuery dataset","markdownUrl":"https://nodely.io/docs/public/bigquery.md","heading":"Upcoming","url":"https://nodely.io/docs/public/bigquery/#upcoming","text":"-   Base tables\n    -   contracts\\_accountstate\n-   Aux tables\n    -   Account labels\n    -   NFD labels\n-   Virtual transaction tables\n    -   Genesis\n    -   Legacy rewards\n    -   2024+ block rewards"}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Algorand IPFS gateway","url":"https://nodely.io/docs/public/ipfs/#algorand-ipfs-gateway","text":"Nodely provides distributed IPFS gateway for all Algorand assets as a part of free tier.\n\n-   Unlimited and Enterprise tiers (and public goods projects) can use IPFS gateway for assets across any chain (any CID); their verified sites are whitelisted automatically. Sites are counted per organization, over all its endpoints: Boost 1 (+ extra sites at $2 / month each), public goods 1, Unlimited 5, Enterprise 5. One list feeds both the API (Referer) whitelist and the IPFS gateway. An organization above its cap keeps the sites it verified first whitelisted; nothing is deleted, and the portal warns.\n-   Boost: 1 verified site whitelisted automatically; extra sites $2 / month each\n-   Free: 1 verified site authorized in the portal, within the free daily quota\n-   IPFS usage counts towards the free tier daily quota, and on Boost towards the Boost daily quota\n-   Only Algorand projects are allowed to use the service\n-   IPFS pinning: Boost 100 MB / 25 files free plus add-ons; Unlimited and Enterprise 256 GB / 64,000 files included. See [Pinning](https://nodely.io/docs/public/ipfs/#pinning)\n\nNote\n\nDomain whitelisting is required. Free tier projects: please contact [support@nodely.io](mailto:support@nodely.io) and we’ll add you free of charge. Boost, Unlimited and Enterprise: sites verified on your endpoint in the [Nodely portal](https://portal.nodely.io/) are added automatically (on Boost: 1 verified site whitelisted automatically; extra sites $2 / month each)."}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Quick Start","url":"https://nodely.io/docs/public/ipfs/#quick-start","text":"You can use `https://ipfs.algonode.xyz/ipfs/${cid}` to access any CID.  \nYou can use `https://ipfs.algonode.dev/ipfs/${cid}` as a backup in case .xyz domain is suspended.  \nFiles that are not cached already will be fetched from the IPFS P2P network.\n\nexamples:  \n\n-   [https://ipfs.algonode.xyz/ipfs/QmWiHqs17Gx5SGg49d7uPsBdom2J2PtUWigLYYVvykbBnJ](https://ipfs.algonode.xyz/ipfs/QmWiHqs17Gx5SGg49d7uPsBdom2J2PtUWigLYYVvykbBnJ)\n-   [https://ipfs.algonode.xyz/ipfs/bafybeieivaqymeaohob2qggwu4edsm7rwhrfuhtiwtengvkwmgfkp2ogdi/nfd.json](https://ipfs.algonode.xyz/ipfs/bafybeieivaqymeaohob2qggwu4edsm7rwhrfuhtiwtengvkwmgfkp2ogdi/nfd.json)"}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Generating thumbnails","url":"https://nodely.io/docs/public/ipfs/#generating-thumbnails","text":"Nodely IPFS gateway uses Bunny.net [image optimizer](https://docs.bunny.net/docs/stream-image-processing). Image objects need to have extra `optimizer=image` parameter to force the optimizer to work when no file extension is provided.\n\nexample:\n\n-   [https://ipfs.algonode.xyz/ipfs/QmZUkUUGFvsFdRTKAJUA7QQhF411KdEyWY99vedxaXMHqo?optimizer=image&width=75](https://ipfs.algonode.xyz/ipfs/QmZUkUUGFvsFdRTKAJUA7QQhF411KdEyWY99vedxaXMHqo?optimizer=image&width=75)"}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Rate limits","url":"https://nodely.io/docs/public/ipfs/#rate-limits","text":"Requests for non Algorand related IPFS objects are limited to 10/sec per IP address Request for Algorand mainnet assets are limited to 100/sec per public IP address"}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"What is being cached / allowed","url":"https://nodely.io/docs/public/ipfs/#what-is-being-cached--allowed","text":"Nodely IPFS gateway uses realtime block streaming pipeline to precache all Mainnet IPFS cids referenced (recursively) in all new ASAs (NFTs).  \nReferenced objects are downloaded using ARC19 standard and recursively parsed using ARC3 to precache and gather metadata on all referenced objects :\n\n-   json files\n-   audio / video / images\n-   3D models\n\nNote\n\nJson, Images, Audio, Video should work without any issues.  \nText, HTML, JavaScript, binaries, archives & PDF content are forbidden on this public service to prevent abuse."}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Pricing","url":"https://nodely.io/docs/public/ipfs/#pricing","text":"| Tier | IPFS gateway |\n| --- | --- |\n| Free | 1 verified site authorized in the portal, within the free daily quota |\n| Boost | 1 verified site whitelisted automatically; extra sites $2 / month each |\n| Unlimited | Any CID, 5 verified sites per organization whitelisted automatically |\n| Enterprise | Any CID, 5 verified sites per organization whitelisted automatically |\n| Public goods | Any CID, 1 verified site per organization whitelisted automatically |\n\nSee [IPFS gateway access](https://nodely.io/docs/access/authentication/#ipfs-gateway). Organization admins add extra Boost sites in the [portal](https://portal.nodely.io/billing)."}
{"id":"/docs/public/ipfs/","title":"IPFS HTTP Gateway","markdownUrl":"https://nodely.io/docs/public/ipfs.md","heading":"Pinning","url":"https://nodely.io/docs/public/ipfs/#pinning","text":"Pinning quotas are per organization. Boost includes 100 MB / 25 files free and can add one larger pinning size, billed monthly with the subscription:\n\n| Add-on | Price |\n| --- | --- |\n| IPFS pinning 256 GB | $8 / month |\n| IPFS pinning 1 TB | $16 / month |\n\nUnlimited and Enterprise include 256 GB / 64,000 files. The IPFS pinning +1 TB add-on ($16 / month) brings it to 1.256 TB / 314,000 files: Unlimited adds it in the portal, Enterprise on its contract.\n\nBoost add-ons: Hard cap with no overage billing, no pay-as-you-go. One pinning size at a time: switch up or down in the portal. Every pinning quota also caps the number of pinned files: 1 file per 4 MB of quota, per organization."}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Light indexer","url":"https://nodely.io/docs/public/light-indexer/","text":"Public service\n\nLight indexer snapshots and indexer fork are maintained by Nodely\n\n[Light indexer @ github](https://github.com/AlgoNode/light-indexer)\n\nHost you own Algorand indexer API in under minutes:\n\n-   100% compatible with upstream Indexer API\n-   Even faster than Nodely.io cloud service\n-   Requires <25GB of SSD\n-   _\\[optionally\\]_ Go fully independent by adding a follower node"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Ingridients","url":"https://nodely.io/docs/public/light-indexer/#ingridients","text":"-   Postgres compatible CockroachDB\n-   Custom DB schema with extra indexes\n-   Custom conduit import plugin\n    -   Sources blocks and deltas from Nodely.io instant follower service\n    -   [https://github.com/AlgoNode/conduit-cockroachdb](https://github.com/AlgoNode/conduit-cockroachdb)\n    -   [https://github.com/AlgoNode/blocksrv](https://github.com/AlgoNode/blocksrv)\n-   Custom conduit export plugin\n    -   Writes to custom DB schema\n    -   Prunes txn, txn\\_participation, block\\_headers to keep last 20k blocks\n    -   [https://github.com/AlgoNode/conduit-cockroachdb](https://github.com/AlgoNode/conduit-cockroachdb)\n-   Custom indexer-api\n    -   Custom DB schema\n    -   Indexed Note prefix search\n    -   Faster pagination\n    -   Faster everything ;)\n    -   [https://github.com/AlgoNode/indexer-api-cdb](https://github.com/AlgoNode/indexer-api-cdb)\n-   Cloudflare hosted DB snapshots (up to 3 hrs old) for fast catchup"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"TODO","url":"https://nodely.io/docs/public/light-indexer/#todo","text":"-   ARM images (sorry)\n-   Auto update container\n-   Documentation\n-   Testnet"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Requirements","url":"https://nodely.io/docs/public/light-indexer/#requirements","text":"-   25GB of free SSD space\n-   docker-compose\n-   jq\n-   bash"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Quickstart","url":"https://nodely.io/docs/public/light-indexer/#quickstart","text":"```bash\ngit clone https://github.com/AlgoNode/light-indexer.git\n#make sure you have 20GB in the current dir\n\ncd light-indexer\n./bin/init\n\n#enjoy mainnet indexer in under 20 minutes\n```"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Security","url":"https://nodely.io/docs/public/light-indexer/#security","text":"-   Database and Indexer API endpoints are exposed, by default, on localhost only.\n-   CockroachDB runs in insecure mode (no authentication)\n\nIf you want to expose Indexer API to the World you can use:\n\n-   Development\n    -   [cloudflare tunnels](https://developers.cloudflare.com/pages/how-to/preview-with-cloudflare-tunnel/)\n    -   [ngrok tunnels](https://ngrok.com/product/secure-tunnels)\n    -   Caddy proxy\n-   Production\n    -   …"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Diagnostic scripts","url":"https://nodely.io/docs/public/light-indexer/#diagnostic-scripts","text":"| Script | Description |\n| --- | --- |\n| `bin/help` | Show your API endpoint address & token |\n| `bin/logs` | Tail logs from all services |\n| `bin/status` | Show if your indexer is lagging |"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Safe scripts (should not break stuff)","url":"https://nodely.io/docs/public/light-indexer/#safe-scripts-should-not-break-stuff","text":"| Script | Description | Example |\n| --- | --- | --- |\n| `bin/down` | Shutdown whole bundle |  |\n| `bin/down ...` | Shutdown a service | `/bin/down conduit` |\n| `bin/up` | Start whole bundle |  |\n| `bin/up ...` | Start a service | `/bin/up api` |\n| `bin/restart ...` | Start a service | `/bin/restart api` |\n| `bin/update` | Download new images and restart services |  |"}
{"id":"/docs/public/light-indexer/","title":"Light indexer","markdownUrl":"https://nodely.io/docs/public/light-indexer.md","heading":"Dangerous scripts (might break stuff)","url":"https://nodely.io/docs/public/light-indexer/#dangerous-scripts-might-break-stuff","text":"| Script | Description |\n| --- | --- |\n| `bin/catchup` | Destroy and download fresh database |\n| `bin/gencfg` | Regenerate configs |\n| `bin/upgrade` | Major upgrade |"}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"Reti Pools Dashboard","url":"https://nodely.io/docs/public/reti/","text":"Nodely hosts a static build of “Réti Staking Dashboard” [opensource repository](https://github.com/algorandfoundation/reti) (**Dashboard**).\n\n-   Please read he **DISCLAIMER** below before using the Website\n-   Other instances of the Réti website are available as anyone can build and run this application\n-   Smart Contracts that the Website interacts with have been [commercially audited](https://github.com/algorandfoundation/reti/tree/main/contracts/contracts/audit)"}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"General Information.","url":"https://nodely.io/docs/public/reti/#general-information","text":"1.  Thank you for visiting our website: [https://reti.nodely.io/](https://reti.nodely.io/) (“Website”).\n2.  This Website is owned and managed by Nodely sp. z o.o. that is a company incorporated in Poland, with its registered office in Warsaw at Żwanowiecka 53, 04-846, entered in the Register of Entrepreneurs run by District Court for the City of Warsaw in Warsaw, XIV Commercial Division of the National Court Register under KRS number 0001061171, with NIP (tax identification number): PL9522246503, share capital of PLN 50,000. (“Nodely”, “we”, “our”, “us”).\n3.  By accessing and using this Website, you acknowledge and accept the terms outlined in this Disclaimer."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"Service.","url":"https://nodely.io/docs/public/reti/#service","text":"1.  We are a technology provider. Our services are limited to granting access to the Website containing a catalogue of staking pools for the crypto-asset named ALGO and enabling users to create their own staking pools.\n    \n2.  Our services are provided “as is” and “as available” and without warranty of any kind, express or implied, to the maximum extent permitted by applicable law. Nodely expressly disclaims any and all warranties of any kind, whether expressed or implied, including warranties and conditions of merchantability, non-infringement, and fitness for a particular purpose, and any warranties implied by any course of dealing and course of performance. No advice or information (oral or written) obtained by you from us shall create any warranty.\n    \n3.  The Website may occasionally be unavailable due to scheduled or emergency maintenance. We may also discontinue making this Website available to you at any time, at our sole discretion. Neither we nor our third-party service providers shall bear any liability for any inconvenience loss or damage resulting from such downtime or discontinuity."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"No investment advice services.","url":"https://nodely.io/docs/public/reti/#no-investment-advice-services","text":"Nodely is not a broker/dealer, or an investment advisor. This is not a service for the giving or receiving of crypto-assets and/or investment advice. None of our content constitutes – or should be understood as constituting – a recommendation to enter in any crypto-asset transactions or to engage in any of the investment strategies presented. We do not provide personalised recommendations or views as to whether a crypto-asset or investment approach is suited to the financial needs of a specific individual."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"No crypto assets services.","url":"https://nodely.io/docs/public/reti/#no-crypto-assets-services","text":"We do not provide any crypto assets services, notably we do not: (1) hold, manage, provide custody or administration, or otherwise control any crypto-asset for you or on your behalf, (2) provide any service that involves exchanging crypto-assets for other funds or exchanging funds for crypto-assets, (3) receive, transfer or execute any orders for crypto-assets for or on your behalf, (4) provide any services relating to placing crypto-assets, (5) provide any advisory and/or portfolio management services in relating to crypto-assets, and/or provide any services that involve transfer of crypto-assets for or on your behalf."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"No content liability.","url":"https://nodely.io/docs/public/reti/#no-content-liability","text":"1.  All information displayed anywhere on the Dashboard on the Website comes from the Algorand mainnet ledger which is maintained by third parties independent from us. Our role is limited exclusively to making this information available to you. We do not own and/or control and/or verify the correctness, accuracy of the content presented on the Dashboard and whether it is up to date.\n    \n2.  You acknowledge that the Dashboard content is intended to be used and must be used for informational purposes only and you use the information provide on the Dashboard at your own risk.\n    \n3.  **Do Your Own Research.** It is very important to do your own analysis and verification of all information before making any decision based on your own personal circumstances.\n    \n4.  We make no representations, warranties or guarantees, whether express or implied, that the content on the Website is accurate, complete or up to date."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"No loss liability.","url":"https://nodely.io/docs/public/reti/#no-loss-liability","text":"By using our Website, you acknowledge that any staking positions you take are at your own risk and own reward. Before staking you should carefully consider whether using our Website is suitable for you in terms of your circumstances, knowledge, and financial resources. You acknowledge that the value of crypto-assets and the income derived from them can go down as well as up. You also acknowledge that Algorand ledger and protocol are software and, as such, and they may contain errors causing unwanted consequences, including loss of your crypto-assets. Past performance is not a guide to future performance."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"No data stored.","url":"https://nodely.io/docs/public/reti/#no-data-stored","text":"We do not collect and/or store any of your data. We do not use cookies and/or create logs of your activity."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"Third-party websites.","url":"https://nodely.io/docs/public/reti/#third-party-websites","text":"The Website may contain links to third-party websites (including, without limitation, content, materials, and/or information in the third-party websites). Such links may be provided for convenience, but they are not controlled by us. You acknowledge and agree that we are not responsible for any aspect of the content, materials, information or services contained in any third-party websites accessible or linked from the Website."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"Support.","url":"https://nodely.io/docs/public/reti/#support","text":"You acknowledge that staking via the Website is done on an open, permissionless, decentralized and non-custodial protocol named Réti. We do not own, and/or control and/or maintain this protocol. You acknowledge that it is technically impossible for Nodely or any other entity to assist in recovering your crypto-assets if you lose your wallet, private keys, or seed phrase."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"General limitations of liability.","url":"https://nodely.io/docs/public/reti/#general-limitations-of-liability","text":"1.  To the maximum extent permitted by law, we accept no liability for damages, including any loss of profit, and/or damage in connection with the use of the Website, Dashboard content, staking pools, or the creation of your own staking pools by you or any persons acting on your behalf.\n    \n2.  To the extend not already excluded, our total liability to you for any loss or damages, regardless of their legal basis, is limited to the amount of USD 100.\n    \n3.  You should, at your own expense, indemnify, and hold Nodely harmless against all claims, liabilities, accusations and actions that arise from or relate to your use of the Website, Dashboard content, staking pools, or the creation of your own staking pools. If such claims are raised and/or pursued against Nodely, you will pay (i) any amounts (including, in particular, any litigation costs and costs of legal services) awarded to a third party in an enforceable judgement and/or fines imposed by authorities or courts, (ii) all amounts payable to a third party and/or authorities and/or courts pursuant to a settlement concluded with such third party or authority, and (iii) compensation for damages suffered by Nodely. You should promptly inform us if such claim occurs and provide Nodely with all necessary information so that Nodely can act effectively to dismiss the claim or accusations."}
{"id":"/docs/public/reti/","title":"Reti Pools Dashboard","markdownUrl":"https://nodely.io/docs/public/reti.md","heading":"Applicable law.","url":"https://nodely.io/docs/public/reti/#applicable-law","text":"1.  To matters not covered by the Disclaimer, the provisions of Polish law shall apply.\n    \n2.  Any dispute or claim arising out of or in connection with these Disclaimer or use of the Website shall be governed by and construed in accordance with the law of Poland. The disputes shall be submitted to the exclusive jurisdiction of the common court for the area of Nodely’s registered office."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"Algorand Archival Snapshots","url":"https://nodely.io/docs/public/snapshots/#algorand-archival-snapshots","text":"Nodely maintains daily archival node/relay snapshots as a public [S3 compatible bucket](http://s3.nodely.io/algo-snaps/)\n\n-   Free for all use cases (even for service providers)\n-   Ideal for bootstrapping test environments and emergencies\n-   Quick: up to 10Gbps of download\n\nNote\n\nAlgorand is a permissionless, decentralized network. You should consider the risks of trusting a single source of history before downloading the snapshot. Syncing your own archival node natively should always be the end goal."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"Quick Start","url":"https://nodely.io/docs/public/snapshots/#quick-start","text":"Snapshots contain consistent, uncompressed copy of SQLite files as written by [go-algorand](https://github.com/algorand/go-algorand) node.\n\n1.  Setup an archival node and stop it before restoring the content of (main/test/beta)net-v1.0 folder.\n2.  Download and install [AWS command line utils](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-version.html)\n3.  Go to your data directory - eg `/var/lib/algorand/mainnet-v1.0`\n4.  (optional) run screen/tmux to make sure the download is not interrupted when you disconnect from the node\n5.  Download the archive (replace mainnet with the network of your choice):\n\n```bash\nexport NETWORK=mainnet\nexport LATEST=$(curl -s http://s3.nodely.io:9000/algo-snaps/$NETWORK/latest)\n\necho \"Latest $NETWORK archival snapshot at $LATEST\"\naws configure set s3.max_concurrent_requests 64\naws configure set default.s3.max_bandwidth 1000MB/s\naws --endpoint-url http://s3.nodely.io:9000 s3 cp s3://$LATEST ./ --recursive --no-sign-request\n```"}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> Cannot access some files","url":"https://nodely.io/docs/public/snapshots/","text":"> Download is restricted until complete snapshots are uploaded. Use the script above to download latest complete snapshot."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> Download is slow","url":"https://nodely.io/docs/public/snapshots/","text":"> Such is the nature of big file transfers over TCP. Try increasing s3.max\\_concurrent\\_requests value in the script above."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> Download is going to take more than a day","url":"https://nodely.io/docs/public/snapshots/","text":"> No worries, archival snapshots are kept for 3 days"}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> My node is not in sync immediately after download","url":"https://nodely.io/docs/public/snapshots/","text":"> Just let it catch up to the tip of the chain, it has a day or two worth of data to download from the network."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> My node is not responsive after start","url":"https://nodely.io/docs/public/snapshots/","text":"> You might have catchup file generation enabled - this requires building of the Merkle Tree before the node becomes responsive. It can take up to an hour."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"\\> Where can I find indexer snapshots ?","url":"https://nodely.io/docs/public/snapshots/","text":"> Nodely does not yet provide vanilla indexer snapshots (working on it). Try our [light indexer](https://nodely.io/docs/public/light-indexer/) for now."}
{"id":"/docs/public/snapshots/","title":"Archival Snapshots","markdownUrl":"https://nodely.io/docs/public/snapshots.md","heading":"Pricing","url":"https://nodely.io/docs/public/snapshots/#pricing","text":"Node snapshots are free and there are no plans to monetize the service."}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"About Analytics DB","url":"https://nodely.io/docs/solutions/clickhouse/#about-analytics-db","text":"Nodely DataWarehouse is based on open source ClickHouse DW."}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Interfaces","url":"https://nodely.io/docs/solutions/clickhouse/#interfaces","text":"DW interface is exposed by default as:\n\n-   SQL REST API over HTTPS protocol at [https://dw2api.allo.info](https://dw2api.allo.info/)\n-   [SQL Editor/playground](https://nodely.io/docs/solutions/clickhouse/sql-playground)\n-   [Apache Superset](https://nodely.io/docs/solutions/clickhouse/superset) Self service business intelligence solution: [https://dw2bi.allo.info](https://dw2bi.allo.info/)\n\nCustom endpoints/integrations include\n\n-   [ODBC PowerBI DataSource](https://clickhouse.com/docs/en/integrations/powerbi)\n-   Postgres or MySQL wire protocol endpoint"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"ClickHouse SQL","url":"https://nodely.io/docs/solutions/clickhouse/#clickhouse-sql","text":"Clickhouse has powerful SQL language extensions and functions. It pays to learn about the join types, join orders, aggregations.\n\nSee: [ClickHouse SQL documentation](https://www.notion.so/ClickHouse-SQL-documentation-9a18c816cd3a4b97a5d4c0125e124014?pvs=21)"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Schema","url":"https://nodely.io/docs/solutions/clickhouse/#schema","text":"Allo analytics schema consists of several databases.\n\nEach customer has access to dedicated scratch (no backup) database and common databases each corresponding to the named network - mainnet, voitestnet with custom ledger schema. Scratch database is available only on primary cluster. Failover does not have dedicated scratch database by default. Manual setup of table replication or backup schedule is possible with PS.\n\nCaution\n\nThere are no NULL values in this schema. Most columns use ZERO VALUE to indicate NULL.\n\n-   COALESCE will not behave as you expect\n-   null dates are `1970-01-01 00:00:00`\n\n\\[[Allo.info](http://allo.info/) DW schema\\]([https://www.notion.so/Allo-info-DW-schema-ee721bd35e8648b6980ecaa9b70329b7?pvs=21](https://www.notion.so/Allo-info-DW-schema-ee721bd35e8648b6980ecaa9b70329b7?pvs=21))"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Dictionaries","url":"https://nodely.io/docs/solutions/clickhouse/#dictionaries","text":"Dictionaries are in-memory maps that can quickly map between a Uint64 ID and a named value.\n\nDictionaries periodically refresh data from their source. **Refreshes are atomic,** no duplicated entries are to be expected.\n\nDictionaries have dict\\_ as a prefix in their names and are grouped in databases with \\_mem suffix:\n\n-   mainnet\\_mem\n-   testnet\\_mem\n-   betanet\\_mem\n\nEach dictionary has corresponding `JOIN Table` that can be used for classical (yet instant) joins .\n\nAll tables with no dict\\_ prefix in \\*\\_mem databases can be used for instant joins.\n\n[Dictionaries](https://www.notion.so/Dictionaries-32fa32e386f34c7b8879005fae9a35aa?pvs=21)"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Tables","url":"https://nodely.io/docs/solutions/clickhouse/#tables","text":"All native (non dictionary based) tables are append only and can contain duplicated rows. Deduplication is eventual and nondeterministic.\n\nTo see dedupilcated view one must use `FINAL` keyword or user argMax functions to select only relevant rows.\n\n💡 All end-user accounts have \\`FINAL\\` keyword added by default to all queries."}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Working with external data","url":"https://nodely.io/docs/solutions/clickhouse/#working-with-external-data","text":"[Working with external data](https://www.notion.so/Working-with-external-data-e80ccc4d1d614ea38c5b44b40269f247?pvs=21)"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Default settings for end-users","url":"https://nodely.io/docs/solutions/clickhouse/#default-settings-for-end-users","text":"| Setting | Value | Description |\n| --- | --- | --- |\n| optimize\\_move\\_to\\_prewhere\\_if\\_final | 1 | Optimize deduplication by applying WHERE filters before dedup phase. |\n| final | 1 | Automatically applies [https://clickhouse.com/docs/en/sql-reference/statements/select/from#final-modifier](https://clickhouse.com/docs/en/sql-reference/statements/select/from#final-modifier) modifier to all tables in a query |\n| union\\_default\\_mode | DISTINCT | Default union behaviour when not specified |\n| optimize\\_rewrite\\_aggregate\\_function\\_with\\_if | 1 |  |\n| allow\\_experimental\\_analyzer | 0 |  |\n| optimize\\_syntax\\_fuse\\_functions | 1 |  |\n|  |  |  |"}
{"id":"/docs/solutions/clickhouse/","title":"Analytics DB","markdownUrl":"https://nodely.io/docs/solutions/clickhouse.md","heading":"Exposing queries as API","url":"https://nodely.io/docs/solutions/clickhouse/#exposing-queries-as-api","text":"[Exposing queries as API](https://www.notion.so/Exposing-queries-as-API-d9d98c344a7641948c3dc94d426ac34f?pvs=21)\n\n[SQL Playground](https://www.notion.so/SQL-Playground-fc686ce4d01e47c2886fff051f79a319?pvs=21)\n\n[Allo Algorand BI](https://www.notion.so/Allo-Algorand-BI-d11cbf2625b04e0eb3931013b20e6ec2?pvs=21)\n\n[ODBC DW Access](https://www.notion.so/ODBC-DW-Access-65497c183ff14b5aae234ca0f983976e?pvs=21)"}
{"id":"/docs/solutions/clickhouse/sql-playground/","title":"Clickhouse SQL Playground","markdownUrl":"https://nodely.io/docs/solutions/clickhouse/sql-playground.md","heading":"SQL Playground","url":"https://nodely.io/docs/solutions/clickhouse/sql-playground/#sql-playground","text":"Playground available at [https://dw2ui.allo.info](https://dw2ui.allo.info/)\n\n-   Use any title you want for connection name\n-   For URL use [https://dw2api.allo.info](https://dw2api.allo.info/)\n-   User: your user name\n-   Password: 🙂\n\nUse it as any other SQL IDE\n\n![tabix](https://nodely.io/_astro/tabix.DDmJCiZ8_15c0SE.webp)"}
{"id":"/docs/solutions/clickhouse/superset/","title":"Self Service BI","markdownUrl":"https://nodely.io/docs/solutions/clickhouse/superset.md","heading":"Apache Superset","url":"https://nodely.io/docs/solutions/clickhouse/superset/#apache-superset","text":"Apache Superset is an open-source business intelligence web application that allows users to visualize and analyze their data. It provides a modern and intuitive interface for creating and sharing interactive dashboards, charts, and tables. Apache Superset supports a wide range of data sources, including popular databases, data warehouses, and cloud storage services. It also offers advanced features such as data exploration, data slicing and dicing, and SQL query building. With Apache Superset, users can easily gain insights into their data and make informed decisions."}
{"id":"/docs/solutions/clickhouse/superset/","title":"Self Service BI","markdownUrl":"https://nodely.io/docs/solutions/clickhouse/superset.md","heading":"Self Service BI","url":"https://nodely.io/docs/solutions/clickhouse/superset/#self-service-bi","text":"Allo BI uses Apache Superset to provide access to both analytical (5 minute delay OLAP) and transactional (realtime OLTP) mainnet/testnet/betanet datasets.\n\nUsers with Alfa roles can\n\n-   define new data sources\n-   consume system wide data sources\n-   create charts and dashboards\n-   create new team members\n-   share datasets, dashboards, queries with team members"}
{"id":"/docs/solutions/clickhouse/superset/","title":"Self Service BI","markdownUrl":"https://nodely.io/docs/solutions/clickhouse/superset.md","heading":"Access","url":"https://nodely.io/docs/solutions/clickhouse/superset/#access","text":"Allo self service BI is available via web browser at [https://dw2bi.allo.info](https://dw2bi.allo.info/)"}
{"id":"/docs/solutions/dedicated/","title":"Enterprise Tier","markdownUrl":"https://nodely.io/docs/solutions/dedicated.md","heading":"Enterprise Tier","url":"https://nodely.io/docs/solutions/dedicated/","text":"This package is the most versatile solution suitable for the most demanding requirements.  \nLow latency, high throughput endpoints with 100% Alogd+Indexer API coverage + performance patches.\n\nThis package is augmented with FTL 1.0 block proxy™ . Latest block appears on the hosted indexer endpoint sooner then on any vanilla local/on-prem indexer."}
{"id":"/docs/solutions/dedicated/","title":"Enterprise Tier","markdownUrl":"https://nodely.io/docs/solutions/dedicated.md","heading":"Technical details","url":"https://nodely.io/docs/solutions/dedicated/#technical-details","text":"The service consists of (per region)\n\n-   1 full archival node\n-   3 “caching” catchup nodes\n-   1 full indexers\n-   3 light indexers\n-   3 dedicated active-active L7 nginx balancers\n-   a dedicated failover L3 balancer"}
{"id":"/docs/solutions/dedicated/","title":"Enterprise Tier","markdownUrl":"https://nodely.io/docs/solutions/dedicated.md","heading":"Included in the package","url":"https://nodely.io/docs/solutions/dedicated/#included-in-the-package","text":"-   2h of R&D monthly\n-   Custom DNS for endpoints\n-   Custom security (Tokens, JWTs, …)\n-   Hierarchical request limits\n-   Realtime monitoring dashboard"}
{"id":"/docs/solutions/dedicated/","title":"Enterprise Tier","markdownUrl":"https://nodely.io/docs/solutions/dedicated.md","heading":"Contract","url":"https://nodely.io/docs/solutions/dedicated/#contract","text":"-   99.95% service availability (SLA)\n-   10x reimbursement for each minute below SLA\n-   Zero downtime upgrades (no maintenance windows)\n-   No per request quotas / surcharges\n-   No vendor lock-in, setup replication\n-   Proper European invoicing\n-   Zero commitment (you can stop mid month)"}
{"id":"/docs/solutions/dedicated/","title":"Enterprise Tier","markdownUrl":"https://nodely.io/docs/solutions/dedicated.md","heading":"Pricing","url":"https://nodely.io/docs/solutions/dedicated/#pricing","text":"-   **1024 USD** monthly per region\n-   minimum 2 regions required for SLA"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Get all TXN for an address - reverse order","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#get-all-txn-for-an-address---reverse-order","text":"```sql\nSELECT\n  encode(t.txid,'escape') tid -- no idea why textual TXID is saved in a bytea field\n  ,t.*\nFROM\n  txn_participation tp JOIN txn t using(round,intra)\nWHERE\n  tp.addr =  AddressTxt2Bin('ALGONODEIBJTET5OSEAXIHDSIEG7C2DOFB2WDYLRZTXN3NXVJ3NJD26L4E');\nORDER BY round desc, intra desc\nLIMIT 1000\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Get TXN info by TXN id","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#get-txn-info-by-txn-id","text":"```sql\nSELECT * FROM txn WHERE txid = 'PHFCDXJOLNQX47Q3YFS6LBYMUMB2TG3QNHKFO3QXKG3P3BGE5U6Q'\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Get account info","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#get-account-info","text":"```sql\nSELECT\n  AddressBin2Txt(addr) address, * FROM account\nWHERE\n  addr = AddressTxt2Bin('ALGONODEIBJTET5OSEAXIHDSIEG7C2DOFB2WDYLRZTXN3NXVJ3NJD26L4E');\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Top ten transacted assets","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#top-ten-transacted-assets","text":"```sql\nSELECT\n  topn(topn_add_agg(asset::text),10)\nFROM\n  txn\nWHERE\n  round > 18000000 and typeenum =6\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Unique asset senders/receivers","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#unique-asset-sendersreceivers","text":"```sql\nSELECT\n     COUNT(DISTINCT(txn -> 'txn' ->> 'snd')) senders\n    ,COUNT(DISTINCT(txn -> 'txn' ->> 'arcv'  )) receivers\n    ,COUNT(*) txcnt\nFROM\n    txn\nWHERE\n    txn.asset = 312769 and typeenum in (3,4,5)\n    AND txn.round BETWEEN 18000000 and 18100000\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Unique asset senders/receivers \\[faster\\]","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/","text":"```sql\nSELECT\n     hll_cardinality(hll_add_agg(hll_hash_text(txn -> 'txn' ->> 'snd'),12)) senders\n    ,hll_cardinality(hll_add_agg(hll_hash_text(txn -> 'txn' ->> 'arcv'),12)) receivers\n    ,COUNT(*) txcnt\nFROM\n    txn\nWHERE\n    txn.asset = 312769 and typeenum in (3,4,5)\n    AND txn.round BETWEEN 18000000 and 18100000\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Avg block time for a range","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#avg-block-time-for-a-range","text":"```sql\nwith tr as (\n  select min(realtime) rt0, max(realtime) rt1\n  from block_header bh\n  where realtime between '2024-02-01' and '2024-03-01'\n)\n, b0 as (select round r0, (header#>>'{ts}')::int4 t0 from block_header bh,tr where realtime = tr.rt0)\n, b1 as (select round r1, (header#>>'{ts}')::int4 t1 from block_header bh,tr where realtime = tr.rt1)\nselect 1.0 * (b1.t1-b0.t0) / (b1.r1-b0.r0) abt from b0,b1\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"Stake needed to vote / propose","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#stake-needed-to-vote--propose","text":"```sql\nwith rt as (\n  select realtime, round from block_header bh order by round desc limit 100\n), btime as\n  (select EXTRACT(EPOCH FROM ((max(realtime) - min(realtime))/100)) as btime, max(round) lr from rt)\n, stake as\n  (select sum(microalgos)/pow(10,6) as stake from account\n  cross join btime where account_data->>'onl' = '1' and (account_data->>'voteLst')::bigint > btime.lr)\nselect '1 hr' frequency, round(stake.stake/ (1*3600/btime.btime)) algo,\n  round(10*(ln(1-1/(3600/btime.btime))/-2990)*stake.stake)/10 svalgo\n  from btime cross join stake\nunion all\nselect '1 day' frequency, round(stake.stake/ (24*3600/btime.btime)) algo,\n  round(10*(ln(1-1/(24*3600/btime.btime))/-2990)*stake.stake)/10 svalgo\n  from btime cross join stake\nunion all\nselect '1 week' frequency, round(stake.stake/ (168*3600/btime.btime)) algo,\n  round(10*(ln(1-1/(168*3600/btime.btime))/-2990)*stake.stake)/10 svalgo\n  from btime cross join stake\nunion all\nselect '30 days' frequency, round(stake.stake/ (30*24*3600/btime.btime)) algo,\n  round(10*(ln(1-1/(30*24*3600/btime.btime))/-2990)*stake.stake)/10 svalgo\n  from btime cross join stake\n```"}
{"id":"/docs/solutions/sql-direct/10-examples/","title":"SQL Direct - example queries","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/10-examples.md","heading":"All accounts with non-expired participation key","url":"https://nodely.io/docs/solutions/sql-direct/10-examples/#all-accounts-with-non-expired-participation-key","text":"```sql\nselect\n  addressbin2txt(addr) as haddr\n  ,*\nfrom\n  account\nwhere\n  account_data->>'onl' = '1'\n  and (account_data->>'voteLst')::bigint > (select max(round) from block_header)\norder by\n  microalgos desc\n```"}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"Quick Start","url":"https://nodely.io/docs/solutions/sql-direct/#quick-start","text":"```bash\npsql -U USERNAME -h sql.xxx.algonode.net -p YYYY ledgerdb\n```\n\nNote\n\nPostgres is running on non-standard port YYYY **without** SSL.  \nServer is running PG version 14. Compatible with v10+ clients and SDKs."}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"Vs vanilla Indexer","url":"https://nodely.io/docs/solutions/sql-direct/#vs-vanilla-indexer","text":"Algorand provides open source Indexer that anyone can run.  \nMaintaining it might be a (costly) challenge - see current SSD requirement [here](https://g.nodely.io/d/howbig)\n\nIf you are interested in running the indexer yourself consider starting with a self contained [light version](https://nodely.io/docs/public/light-indexer)."}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"Schema diffs","url":"https://nodely.io/docs/solutions/sql-direct/#schema-diffs","text":"-   Table public.txn is a partitioned table\n-   Table public.txn has extra indexes\n-   Table public.asset has extra indexes\n\nSchemas:\n\n-   [vanilla schema](https://nodely.io/docs/solutions/sql-direct/schema-idx-vanilla)\n-   [Nodely’s extended schema](https://nodely.io/docs/solutions/sql-direct/schema-ext)"}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"Extras","url":"https://nodely.io/docs/solutions/sql-direct/#extras","text":"-   Realtime NFT Metadata parser with support for\n    -   [ARC3](https://arc.algorand.foundation/ARCs/arc-0003)\n    -   [ARC19](https://arc.algorand.foundation/ARCs/arc-0019)\n    -   [ARC69](https://arc.algorand.foundation/ARCs/arc-0069)\n-   [Nodely’s Algorand extension](https://github.com/algonode/pg_algorand/)\n-   [Citus TOPn extension](https://github.com/citusdata/postgresql-topn/)\n-   [Citus HLL extension](https://github.com/citusdata/postgresql-hll/)"}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"Limitations","url":"https://nodely.io/docs/solutions/sql-direct/#limitations","text":"-   Not compatible with PGAdmin\n-   SQL statements are limited in execution time\n-   Not suitable as a SQL backend for Algorand-Indexer\n-   No [ARC72](https://arc.algorand.foundation/ARCs/arc-0072) support\n\nNote\n\nSome values are stored in original binary format. See extra functions below."}
{"id":"/docs/solutions/sql-direct/","title":"SQL Direct access","markdownUrl":"https://nodely.io/docs/solutions/sql-direct.md","heading":"SQL ETL","url":"https://nodely.io/docs/solutions/sql-direct/#sql-etl","text":"Each dedicated database instance is powered with a highly customized ETL process.\n\n-   Blocks are loaded from multiple sources at the same time.\n-   Hardware is tuned to favor write workloads.\n\nThis results in:\n\n-   More reliable block delivery (no SPoF)\n-   Shorter avg time to new block by 150ms\n-   Faster indexing\n\nParallel ETL process enriches the dataset with real-time NFT metadata sourced from recursive IPFS fetches.\n\n![Diagram](https://nodely.io/d2/docs/docs/solutions/sql-direct/index-0.svg)"}
{"id":"/docs/solutions/sql-direct/schema-ext/","title":"Nodely extended schema","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/schema-ext.md","heading":"v\\_asset - decoded address asset view","url":"https://nodely.io/docs/solutions/sql-direct/schema-ext/","text":"```sql\nCREATE OR REPLACE VIEW v_asset AS\nSELECT\n  index as asset_id\n  ,creator_addr\n  ,AddressBin2Txt(creator_addr) creator\n  ,deleted\n  ,created_at\n  ,closed_at\n  ,AddressBin2Txt(decode(params ->> 'c', 'base64')) clawback\n  ,AddressBin2Txt(decode(params ->> 'f', 'base64')) freeze\n  ,AddressBin2Txt(decode(params ->> 'm', 'base64')) manager\n  ,AddressBin2Txt(decode(params ->> 'r', 'base64')) reserve\n  ,CAST(params ->> 't' as NUMERIC(20,0)) total\n  ,params ->> 'dc' as decimals\n  ,params ->> 'am' as metadata\n  ,params ->> 'au' as url\n  ,params ->> 'an' as name\n  ,params ->> 'un' as unit\n  ,params ->> 'df' as frozen\nFROM\n  asset\n\nDROP TABLE IF EXISTS \"x_asset_meta\";\nCREATE TABLE \"x_asset_meta\" (\n   asset  bigint primary key not NULL,\n   meta jsonb,\n   updated_at timestamp\n);\n\ncreate or replace view xv_asset_refresh as (\nselect index as asset, params#>>'{au}' as au, AddressBin2Txt(decode(params#>>'{r}','base64')) as r, params#>>'{an}' as name, params#>>'{un}' as un\nfrom asset where index > 0 and (params#>>'{au}' like '%ipfs%')\nand index not in (select asset from x_asset_meta where cached_at is not null)\n);\n\ncreate or replace view xv_asset_cids as\nwith cids as (select xam.asset asset,a.created_at,jsonb_path_query(meta#>'{extra}','$.*') as c from x_asset_meta xam join asset a on xam.asset = a.\"index\")\nselect\n    asset\n    ,created_at\n  ,c#>>'{cid}' cid\n  ,(c#>>'{bytes}')::bigint bytes\n  ,c#>>'{mimetype}' mt\nfrom cids;\n\ncreate materialized view xv_asset_stats as\nselect\n    realtime::date as ts\n  ,sum((meta#>>'{extra,vid,bytes}')::bigint)/1024/1024/1024 vid_gb\n  ,sum((meta#>>'{extra,img,bytes}')::bigint)/1024/1024/1024 img_gb\n  ,sum((meta#>>'{extra,aud,bytes}')::bigint)/1024/1024/1024 aud_gb\n  ,sum((meta#>>'{extra,json,bytes}')::bigint)/1024/1024/1024 json_gb\n  ,sum(abs((meta#>>'{extra,oth,bytes}')::bigint))/1024/1024/1024 oth_gb\n  ,count(meta#>>'{extra,vid,bytes}') vid\n  ,count(meta#>>'{extra,img,bytes}') img\n  ,count(meta#>>'{extra,aud,bytes}') aud\n  ,count(meta#>>'{extra,json,bytes}') json\n  ,count(meta#>>'{extra,oth,bytes}') oth\nfrom\n  x_asset_meta xam\n  join asset a on xam.asset = a.\"index\"\n  join block_header bh on a.created_at = bh.round\ngroup by 1;\n\ncreate index xv_as_ts on xv_asset_stats(ts);\n\nSELECT cron.schedule('ipfs-asa-stats-hourly','1 * * * *', $$refresh materialized view xv_asset_stats$$);\n\ncreate materialized view xv_asset_mt_stats as (\nwith cidrn as (\nselect *, row_number() over(partition by cid) rn from xv_asset_cids xac\n) select mt as mediatype,count(*) count,sum(bytes)/1024/1024/1024 gb from cidrn where rn = 1\ngroup by mt having count(*) > 20 order by 2 desc\n)\n\nSELECT cron.schedule('ipfs-asa-mt-stats-hourly','5 * * * *', $$refresh materialized view xv_asset_mt_stats$$);\n```"}
{"id":"/docs/solutions/sql-direct/schema-idx-vanilla/","title":"Algorand indexer v3 vanilla SQL schema","markdownUrl":"https://nodely.io/docs/solutions/sql-direct/schema-idx-vanilla.md","heading":"Algorand indexer v3 vanilla SQL schema","url":"https://nodely.io/docs/solutions/sql-direct/schema-idx-vanilla/","text":"indexer-vanilla.sql\n\n```sql\nCREATE TABLE IF NOT EXISTS block_header (\n  round bigint PRIMARY KEY,\n  realtime timestamp without time zone NOT NULL,\n  rewardslevel bigint NOT NULL,\n  header jsonb NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS txn (\n  round bigint NOT NULL,\n  intra integer NOT NULL,\n  typeenum smallint NOT NULL,\n  asset bigint NOT NULL, -- 0=Algos, otherwise AssetIndex\n  txid bytea, -- base32 of [32]byte hash, or NULL for inner transactions.\n  txn jsonb NOT NULL, -- json encoding of signed txn with apply data; inner txns exclude nested inner txns\n  extra jsonb NOT NULL,\n  PRIMARY KEY ( round, intra )\n);\n\n\n-- Optional, to make txn queries by asset fast:\n-- CREATE INDEX CONCURRENTLY IF NOT EXISTS txn_asset ON txn (asset, round, intra);\n\nCREATE TABLE IF NOT EXISTS txn_participation (\n  addr bytea NOT NULL,\n  round bigint NOT NULL,\n  intra integer NOT NULL\n);\n\n-- expand data.basics.AccountData\nCREATE TABLE IF NOT EXISTS account (\n  addr bytea primary key,\n  microalgos bigint NOT NULL, -- okay because less than 2^54 Algos\n  rewardsbase bigint NOT NULL,\n  rewards_total bigint NOT NULL,\n  deleted bool NOT NULL, -- whether or not it is currently deleted\n  created_at bigint NOT NULL, -- round that the account is first used\n  closed_at bigint, -- round that the account was last closed\n  keytype varchar(8), -- \"sig\", \"msig\", \"lsig\", or NULL if unknown\n  account_data jsonb NOT NULL -- trimmed AccountData that excludes the fields above and the four creatable maps; SQL 'NOT NULL' is held though the json string will be \"null\" iff account is deleted\n);\n\n-- data.basics.AccountData Assets[asset id] AssetHolding{}\nCREATE TABLE IF NOT EXISTS account_asset (\n  addr bytea NOT NULL, -- [32]byte\n  assetid bigint NOT NULL,\n  amount numeric(20) NOT NULL, -- need the full 18446744073709551615\n  frozen boolean NOT NULL,\n  deleted bool NOT NULL, -- whether or not it is currently deleted\n  created_at bigint NOT NULL, -- round that the asset was added to an account\n  closed_at bigint, -- round that the asset was last removed from the account\n  PRIMARY KEY (addr, assetid)\n);\n\n\n-- Optional, to make queries of all asset balances fast /v2/assets/<assetid>/balances\n-- CREATE INDEX CONCURRENTLY IF NOT EXISTS account_asset_asset ON account_asset (assetid, addr ASC);\n\n-- data.basics.AccountData AssetParams[index] AssetParams{}\nCREATE TABLE IF NOT EXISTS asset (\n  index bigint PRIMARY KEY,\n  creator_addr bytea NOT NULL,\n  params jsonb NOT NULL, -- data.basics.AssetParams; json string \"null\" iff asset is deleted\n  deleted bool NOT NULL, -- whether or not it is currently deleted\n  created_at bigint NOT NULL, -- round that the asset was created\n  closed_at bigint -- round that the asset was closed; cannot be recreated because the index is unique\n);\n\n-- Includes indexer import state, migration state, special accounts (fee sink and\n-- rewards pool) and account totals.\nCREATE TABLE IF NOT EXISTS metastate (\n  k text primary key,\n  v jsonb\n);\n\n-- per app global state\n-- roughly go-algorand/data/basics/userBalance.go AppParams\nCREATE TABLE IF NOT EXISTS app (\n  index bigint PRIMARY KEY,\n  creator bytea NOT NULL, -- account address\n  params jsonb NOT NULL, -- json string \"null\" iff app is deleted\n  deleted bool NOT NULL, -- whether or not it is currently deleted\n  created_at bigint NOT NULL, -- round that the asset was created\n  closed_at bigint -- round that the app was deleted; cannot be recreated because the index is unique\n);\n\n-- per-account app local state\nCREATE TABLE IF NOT EXISTS account_app (\n  addr bytea,\n  app bigint,\n  localstate jsonb NOT NULL, -- json string \"null\" iff deleted from the account\n  deleted bool NOT NULL, -- whether or not it is currently deleted\n  created_at bigint NOT NULL, -- round that the app was added to an account\n  closed_at bigint, -- round that the account_app was last removed from the account\n  PRIMARY KEY (addr, app)\n);\n```"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"`Virtual validator`","url":"https://nodely.io/docs/solutions/validator/","text":"AVAIL service provides highly available, load balanced compute slots for running and rotating Algorand mainnet participation keys.  \nManage your Algorand participation using our API first service with best in class availability and key rotation automation.\n\nKey differentiators vs running on a dedicated node:\n\n-   Security\n    -   Key rotation and monitoring automation\n    -   Automatic backup key pruning, no past key material leaks\n-   Continuity / reward eligibility\n    -   No voting downtime during node upgrades\n    -   No scenarios with 320 round voting gaps\n    -   Less than 60sec voting downtime in case of hardware failure\n    -   Guaranteed no lost proposals due to equivoting\n    -   No risk of cloud terms of service violation\n    -   High performance hardware nodes certified to vote at 10K+ TPS\n    -   Nodes voting via Nodely exclusive fast relay network\n-   Decentralization\n    -   Update voting region at any time\n    -   Update primary compute provider category at any time\n-   Lower cost"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Service configuration options","url":"https://nodely.io/docs/solutions/validator/#service-configuration-options","text":"-   Choose to be eligible (or not) for rewards/incentives\n-   Choose your stake voting region : North America / Europe / Singapore / Australia\n-   Choose primary compute platform (hyper-scaler/alternative)"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Semi automated / Non API","url":"https://nodely.io/docs/solutions/validator/#semi-automated--non-api","text":"-   Manual periodic email for Pera QR code /Ledger key registration"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Full automated","url":"https://nodely.io/docs/solutions/validator/#full-automated","text":"-   External API call\n-   Smart contract call"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Is AVAIL a staking pool service ?","url":"https://nodely.io/docs/solutions/validator/#q-is-avail-a-staking-pool-service-","text":"No, each participation key is linked to the customer’s single, non-custodial account.  \nNodely has no technical means to spend or manage customer’s funds."}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Does pricing depend on the amount of Algo staked ?","url":"https://nodely.io/docs/solutions/validator/#q-does-pricing-depend-on-the-amount-of-algo-staked-","text":"No, service pricing is based only on the amount of active participation keys."}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Can anyone stake using this service ?","url":"https://nodely.io/docs/solutions/validator/#q-can-anyone-stake-using-this-service-","text":"Any entity accepting business invoices can subscribe to the service. Service only provides running virtualized participation keys. Any eligibility for protocol rewards depends on the customer choice of the key registration method and non-custodial account balance."}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Can I run Reti pool on AVAIL?","url":"https://nodely.io/docs/solutions/validator/#q-can-i-run-reti-pool-on-avail","text":"No, Reti node manager is not compatible with AVAIL key management."}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Is the service under SLA ?","url":"https://nodely.io/docs/solutions/validator/#q-is-the-service-under-sla-","text":"Yes, Nodely guarantees less than 60 seconds of unavailability monthly with proportional reimbursement of service fee.  \nSee ToS for Nodely services."}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Q: Is it OK to backup participation key ?","url":"https://nodely.io/docs/solutions/validator/#q-is-it-ok-to-backup-participation-key-","text":"Participation keys are in fact bundle of Falcon, quantum resistant keys , each valid for a narrow range of rounds.\n\n  \nKey backups are safe with Nodely:\n\n-   Bundles are pruned continuously so that any stolen material do not include keys used in the past\n-   Any leaked keys are invalidated with an automatic keyreg and of no further use to anyone"}
{"id":"/docs/solutions/validator/","title":"Algorand Validator Adaptive Infrastructure Layer","markdownUrl":"https://nodely.io/docs/solutions/validator.md","heading":"Pricing","url":"https://nodely.io/docs/solutions/validator/#pricing","text":"-   $64/mo per active participation key, no choice of primary provider tiers\n-   $256/mo for 8 active participation keys ($32/mo/key), choice of provider tiers\n-   All prices are for business entities only with upfront, annual payment"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"Upcoming","url":"https://nodely.io/docs/telemetry/changelog/#upcoming","text":"-   Dashboards:\n    -   Log browser (warnings/errors)\n    -   Individual suggestions (too many keys, bad network, same keys on multiple nodes, …)\n-   Gamification:\n    -   Leader boards\n    -   NFT Badges for node runners (using ARC59 inbox)\n-   Infrastructure:\n    -   Complete parser (no lost events, health scores up to 100%)\n-   Documentation:\n    -   Algorithms and thresholds behind all the metrics and alarm states"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"2024-12-10","url":"https://nodely.io/docs/telemetry/changelog/#2024-12-10","text":"-   Infrastructure:\n    -   Now logging location of the node not the cloudflare proxy. :facepalm:\n-   Node dashboard:\n    -   Peer map ![alt text](https://nodely.io/_astro/peermap.DaW2NJ95_ZsObym.webp)"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"2024-12-07","url":"https://nodely.io/docs/telemetry/changelog/#2024-12-07","text":"-   Infrastructure:\n    -   Ingestion now done in 20 datacenters across the Globe\n        -   Event latency dropped by 50ms on average\n    -   File buffered ingestion - no more lost events due to infra problems"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"2024-12-06","url":"https://nodely.io/docs/telemetry/changelog/#2024-12-06","text":"-   Node dashboard:\n    -   Jitter calculations now ignore outliers with over 2.5s time delta\n-   Global dashboard:\n    -   Global node count (history + split per node type)\n    -   Jitter calculations now ignore outliers with over 2.5s time delta\n-   Infrastructure:\n    -   Ratelimits and optimized ingestion pipeline\n    -   Protection against synthetic traffic/attacks\n    -   Better parser - health scores closer to 100% (but not perfect yet)\n    -   File buffered ingestion - no more lost events due to infra problems"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"2024-12-05","url":"https://nodely.io/docs/telemetry/changelog/#2024-12-05","text":"-   Dashboards:\n    -   [Global dashboard](https://g.nodely.io/d/telemetrymain)\n-   Infrastructure:\n    -   Ratelimits and optimized ingestion pipeline\n    -   Protection against synthetic traffic/attacks"}
{"id":"/docs/telemetry/changelog/","title":"Telemetry Release Notes","markdownUrl":"https://nodely.io/docs/telemetry/changelog.md","heading":"2024-12-04","url":"https://nodely.io/docs/telemetry/changelog/#2024-12-04","text":"-   Initial service announcement\n    -   Temporary [Individual metrics](https://g.nodely.io/d/telemetry) on Grafana\n-   Initial infrastructure:\n    -   Ingestion located in single DataCenter (EU) only\n    -   Ephemeral ingestion\n    -   Event Parser incomplete\n    -   Issues:\n        -   Network metrics (Jitter) unreliable\n        -   Healthscores are not 100% due to 3 events lost per hour\n        -   Telemetry data might be lost when database is down\n        -   No ingestion overload protection"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Node telemetry","url":"https://nodely.io/docs/telemetry/quickstart/#node-telemetry","text":"Algorand Algod node has built in telemetry mechanism that sends important events, errors and metrics to a chosen telemetry service.  \nBy default telemetry sending is disabled. Once enabled telemetry is sent to Algorand Technologies operated service and used for network diagnostics.\n\nNote\n\nThis page describes Nodely hosted telemetry service. You need extra settings for the node to send events to our infrastructure."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Operating system support","url":"https://nodely.io/docs/telemetry/quickstart/#operating-system-support","text":"Make sure you have your node setup using one of the tools/guides below.\n\n| Node/OS | Mac | Linux | Windows |\n| --- | --- | --- | --- |\n| [Nodekit.run](https://nodekit.run/) | + | + | \\- |\n| [FUNC](https://github.com/GalaxyPay/func) | + | + | [Video guide](https://www.youtube.com/watch?si=yH9Ruw0czPHQiQIY&v=O5Mb9GSR1pc&feature=youtu.be) |\n| [OG Install](https://developer.algorand.org/docs/run-a-node/setup/install/) | + | + | \\- |\n| [Docker](hhttps://developer.algorand.org/articles/introducing-official-algod-docker-containers/) | + | + | \\- |\n\nCheck out the Quick Setup section of this documentation once you have your node set up."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Nodely Telemetry highlights","url":"https://nodely.io/docs/telemetry/quickstart/#nodely-telemetry-highlights","text":"-   Key metrics :\n    -   Health (overall score based on other metrics)\n    -   Voting performance\n    -   Network performance\n    -   Synchronization issues\n-   Telemetry events\n    -   HeartBeats with internal metrics\n    -   Warnings and Errors\n-   Leader boards"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Individual telemetry","url":"https://nodely.io/docs/telemetry/quickstart/#individual-telemetry","text":"Caution\n\n-   [Temporary dashboard](https://g.nodely.io/d/telemetry/) is a WORK IN PROGRESS\n-   You have to input your node’s GUID manually in the “Node GUID field” and press enter\n-   Check out [release notes](https://nodely.io/docs/telemetry/changelog) for latest updates and upcoming stuff\n\n[![Individual telemetry](https://nodely.io/_astro/telemetry.DVrautgr_Z1gvokN.webp)](https://g.nodely.io/d/telemetry/)"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Global telemetry","url":"https://nodely.io/docs/telemetry/quickstart/#global-telemetry","text":"You can compare your node to others on the global dashboard [https://g.nodely.io/d/telemetrymain](https://g.nodely.io/d/telemetrymain)\n\n[![global telemetry dashboard](https://nodely.io/_astro/telmain.DvmBo7oc_2rf19k.webp)](https://g.nodely.io/d/telemetrymain)"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"OG install","url":"https://nodely.io/docs/telemetry/quickstart/#og-install","text":"Below instruction will work only on default node install via package manager or updater scrips.\n\nIf your Linux/Mac node is installed with package manger or updater script just execute the following commands to make you node start sending telemetry to the service.\n\n```bash\n  # set telemetry endpoint to Nodely\n  sudo diagcfg -d /var/lib/algorand telemetry endpoint -e https://tel.4160.nodely.io\n\n  # anonymize node name in telemery (do not leak hostname)\n  sudo diagcfg -d /var/lib/algorand telemetry name -n \"anon\"\n\n  # Or you can make your name public by prefixing it with @\n  # sudo diagcfg -d /var/lib/algorand telemetry name -n \"@MyPublicNodeName\"\n\n  # enable telemetry\n  sudo diagcfg -d /var/lib/algorand telemetry enable\n\n  # restart your nodes\n  sudo systemctl restart algorand\n```\n\nYou might need to provide `-d folder` parameter where `folder` is the location of your node’s data folder.\n\n-   Note the random node id (GUID) returned by the first command\n-   Restart you node for settings to take effect.\n-   Go to the [temporary dashboard](https://g.nodely.io/d/telemetry/) and enter your node’s GUID to check out the stats\n-   You can also visit [https://g.nodely.io/d/telemetry/?var-GUID=$nodeid](https://g.nodely.io/d/telemetry/?var-GUID=$nodeid) (replacing $nodeid with your GUID) to go to your node’s stats directly.\n\nNote\n\n  \n◯🔴🔴🔴 lights mean your node is not configured properly for sending telemetry but otherwise might be working properly."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"[Func node](https://github.com/GalaxyPay/func)","url":"https://nodely.io/docs/telemetry/quickstart/","text":"-   Version 3.0 or later of FUNC has built-in telemetry support  \n    Just enable it on the main screen and use the link next to the Telemetry label to go to your private dashboard.  \n    You might need to restart your node if there is no telemetry on the dashboard after a minute."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"[A1CN](https://github.com/AustP/austs-one-click-node)","url":"https://nodely.io/docs/telemetry/quickstart/","text":"-   Version 1.6.0 or later hast built-in telemetry support  \n    Just enable Nodely telemetry and a link to your personal telemetry dashboard will appear.  \n    You might need to restart your node if there is no telemetry on the dashboard after a minute."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"[Nodekit.run](https://nodekit.run/)","url":"https://nodely.io/docs/telemetry/quickstart/","text":"```bash\n# set telemetry endpoint to Nodely\n\nuser@node:~$ ./nodekit telemetry enable nodely\n\n███    ██  ██████  ██████  ███████ ██╗  ██╗██╗████████╗\n████   ██ ██    ██ ██   ██ ██      ██║ ██╔╝██║╚══██╔══╝\n██ ██  ██ ██    ██ ██   ██ █████   █████╔╝ ██║   ██║\n██  ██ ██ ██    ██ ██   ██ ██      ██╔═██╗ ██║   ██║\n██   ████  ██████  ██████  ███████ ██║  ██╗██║   ██║\n                                   ╚═╝  ╚═╝╚═╝   ╚═╝\n\n\n   Overview\n\n  Nodely Telemetry is a free telemetry service offered by a third party (Nodely)\n  Enabling telemetry will configure your node to send health metrics to Nodely\n\n  │ Privacy note: Information about your node (including participating accounts\n  │ and approximate geographic location) will be associated with an anonymous user\n  │ identifier (GUID.)\n\n  │ Tip: Keep this GUID identifier private if you do not want this information to\n  │ be linked to your identity.\n\n  Nodely Telemetry Documentation https://nodely.io/docs/public/telemetry/\n\n  Do you want to enable telemetry with the Nodely provider? (y/n)\n\n(Press Y)\n\nWARN (You may be prompted for your password)\nDEBU Running: sudo /home/bit/nodekit configure telemetry -d /var/lib/algorand --enable --name anon --endpoint https://tel.4160.nodely.io\nINFO Telemetry enabled. To see your Nodely dashboard URL, run:\n./nodekit telemetry status\n```\n\n```plaintext\nuser@node:~$ ./nodekit telemetry status\n\nTelemetry is Enabled\nProvider: Nodely\nNode name: anon\nTelemetry GUID: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\nTelemetry Endpoint: https://tel.4160.nodely.io\nNodely Dashboard URL: https://g.nodely.io/d/telemetry/node-telemetry?var-GUID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\n```"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"[Official docker](https://developer.algorand.org/articles/introducing-official-algod-docker-containers/)","url":"https://nodely.io/docs/telemetry/quickstart/","text":"Official docker disables telemetry unless TELEMETRY\\_NAME env var is defined.  \nSo launch your docker container with TELEMETRY\\_NAME=anon after you enter the container and setup the telemetry\n\n```bash\n  # set telemetry endpoint to Nodely\n  diagcfg -d /algod/data telemetry endpoint -e https://tel.4160.nodely.io\n```\n\nRemember to restart container with TELEMETRY\\_NAME=anon (or your own name prefixed by @ character) once you setup the telemetry endpoint from within the container."}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Target audience","url":"https://nodely.io/docs/telemetry/quickstart/#target-audience","text":"Telemetry service is designed for any kind of Algorand mainnet node.\n\n-   Validator nodes\n-   API nodes\n-   P2P Nodes and Relays\n\nCaution\n\nDo not use the service for Relay/Archiver Running Programme (legacy relays)"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Data collected","url":"https://nodely.io/docs/telemetry/quickstart/#data-collected","text":"-   Node geolocation down to country level\n-   Node version and 10 minute metrics snapshots\n-   Telemetry logs including validator’s public address\n-   We also store each node’s IP prefix (/24 for IPv4, /64 for IPv6) and its operating system, and we count the node IDs (GUIDs) that reach our relays, including from nodes with telemetry off. We share aggregate figures from this data with the Algorand Foundation: node counts by version, the share of online stake whose version we know only from telemetry, and per-round block timing for three regions (Americas; Europe, Middle East and Africa; Asia-Pacific).\n-   Nodely reserves the rights to prune data of nodes inactive for over a week"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"GDRP / Privacy","url":"https://nodely.io/docs/telemetry/quickstart/#gdrp--privacy","text":"-   Nodely Telemetry service does not collect PI data.\n-   Collected dataset is available publicly in context of node’s random unique identifier\n-   Node’s UUID can be reset at any time by node operator"}
{"id":"/docs/telemetry/quickstart/","title":"Node telemetry quickstart","markdownUrl":"https://nodely.io/docs/telemetry/quickstart.md","heading":"Pricing","url":"https://nodely.io/docs/telemetry/quickstart/#pricing","text":"-   Node performance data collection and charting is a free, public service.\n-   API access is part of the [Nodely Analytics](https://nodely.io/pricing/#advanced) tier only."}
{"id":"/docs/unlimited/public-goods-projects/","title":"Public goods projects","markdownUrl":"https://nodely.io/docs/unlimited/public-goods-projects.md","heading":"Public goods projects","url":"https://nodely.io/docs/unlimited/public-goods-projects/","text":"Hey xGov grant recipients, public good projects - check if you qualify for a free Unlimited tier offering  \n\\- basically an all you can eat package."}
{"id":"/docs/unlimited/public-goods-projects/","title":"Public goods projects","markdownUrl":"https://nodely.io/docs/unlimited/public-goods-projects.md","heading":"Offer","url":"https://nodely.io/docs/unlimited/public-goods-projects/#offer","text":"-   Free full Unlimited tier (256USD/mo value)\n-   Free EU or US 2vCPU/4GB RAM/40GB Nodely cloud offering - based on [Coolify](https://coolify.io/)\n-   Free project promotion on Nodely site\n\nCaution\n\nNodely cloud will be available in late Q2’24"}
{"id":"/docs/unlimited/public-goods-projects/","title":"Public goods projects","markdownUrl":"https://nodely.io/docs/unlimited/public-goods-projects.md","heading":"Requirements","url":"https://nodely.io/docs/unlimited/public-goods-projects/#requirements","text":"Subject to individual assessment you are good if your project :\n\n-   Is deployed at least on Algorand mainnet or only on Algorand testnet\n-   Is open-source\n-   Is permissionless (no KYC/gating)\n-   Has no tokenomics / tokens"}
{"id":"/docs/unlimited/public-goods-projects/","title":"Public goods projects","markdownUrl":"https://nodely.io/docs/unlimited/public-goods-projects.md","heading":"\\> What if we are not open-source yet?","url":"https://nodely.io/docs/unlimited/public-goods-projects/","text":"Call us either way."}
{"id":"/docs/unlimited/public-goods-projects/","title":"Public goods projects","markdownUrl":"https://nodely.io/docs/unlimited/public-goods-projects.md","heading":"\\> What is Coolify ?","url":"https://nodely.io/docs/unlimited/public-goods-projects/","text":"It’s like Netlify but open-source with free auto SSL.  \nYou can deploy [any app](https://coolify.io/docs/introduction) using Dockerfile, docker-compose or [Nixpacks](https://nixpacks.com/docs/getting-started).\n\nNodely is one of the sponsors of the Coolify project."}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Unlimited API","url":"https://nodely.io/docs/unlimited/start/","text":"This tier adds SLA and our unmatched R&D support on top of public free endpoints.\n\nCheckout our [3D status page](https://status.nodely.io/) to see all our geo locations in real-time.\n\nTokens required\n\nCommercial tier provides separate [set of endpoints](https://nodely.io/docs/unlimited/start/#algorand-network) and requires an API token, a whitelisted site or a whitelisted IP. See [Authentication](https://nodely.io/docs/access/authentication/)."}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Included in the package","url":"https://nodely.io/docs/unlimited/start/#included-in-the-package","text":"-   low latency Enterprise Cloudflare proxied endpoints with no added latency (99.99 % SLO on Algorand)\n-   Extra Node API endpoints with no origins in USA\n-   Unlimited number of requests to supported AVM chains, plus Ethereum, Base, Arc\n-   up to 600 req/s per client IP, split across the region's edges\n-   3 endpoints, each with 3 tokens and 3 IPs; 5 sites per organization\n-   usage analytics per endpoint in the Nodely portal, admin and viewer roles\n-   Full time travel ([details](https://nodely.io/docs/access/time-travel/)) on mainnet and testnet: state at any past round, object versions, simulate at a past round\n-   IPFS pinning: 256 GB included, IPFS pinning +1 TB for $16 / month\n-   [AI models](https://nodely.io/docs/access/ai-models/): embeddings and a 125B-parameter chat model, 256k context; AI Throughput ×2 add-on $16 / month\n-   [Ariadne](https://nodely.io/ariadne): Nodely’s AI-assisted workspace for Algorand investigations, threat intel and the DeFi radar\n-   unlimited IPFS egress\n-   2TB of monthly quota (excluding IPFS)\n-   Unlimited [IPFS HTTP](https://nodely.io/docs/public/ipfs) gateway with up to 100 requests per second; sites verified in the portal are whitelisted automatically (5 sites per organization)\n-   Support: first response within 24 hours (calendar hours, see [Support](https://nodely.io/docs/access/support/))\n-   1h of R&D monthly\n-   Cloudflare emergency bypass endpoints\n-   Testnet & Betanet endpoints (no SLO/SLA)\n-   Realtime monitoring dashboard"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Contract","url":"https://nodely.io/docs/unlimited/start/#contract","text":"-   99.99% service level objective (SLO)\n-   1x reimbursement for each minute below SLO\n-   Zero downtime upgrades (no maintenance windows)\n-   No request quotas / overages\n-   No vendor lock-in\n-   Proper European invoicing\n-   Zero commitment (you can stop mid month)\n\nSee :\n\n-   [Unlimited tier Contract](https://docs.google.com/document/d/1W2BNp54sdfR45wHEo-Lw-TWpXbxFwPplkPc427fisGs)\n-   [Unlimited tier SLA](https://docs.google.com/document/d/15ClSCEEzjWVnv-xKVS-m4c9LJPiFlmjmwH7OH5pKarA)"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Extra services","url":"https://nodely.io/docs/unlimited/start/#extra-services","text":"-   [IPFS gateway](https://nodely.io/docs/public/ipfs)\n-   S3 bucket with (TBA)\n    -   Emergency mainnet node snapshots\n    -   Emergency mainnet indexer snapshots\n-   [Light indexer](https://nodely.io/docs/public/light-indexer) snapshots\n-   Instant follower API compatible with Conduit"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Low latency endpoints","url":"https://nodely.io/docs/unlimited/start/#low-latency-endpoints","text":"Commercial tier does not inject artificial delay to requests."}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Algorand network","url":"https://nodely.io/docs/unlimited/start/#algorand-network","text":"| Algorand | Full Indexer v2 API | Full Algod v2 API |\n| --- | --- | --- |\n| MainNet | `https://mainnet-idx.4160.nodely.io` | `https://mainnet-api.4160.nodely.io` |\n| MainNet - no USA |  | `https://xna-mainnet-api.4160.nodely.io` |\n| TestNet | `https://testnet-idx.4160.nodely.io` | `https://testnet-api.4160.nodely.io` |\n| BetaNet | `https://betanet-idx.4160.nodely.io` | `https://betanet-api.4160.nodely.io` |"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Voi network","url":"https://nodely.io/docs/unlimited/start/#voi-network","text":"| Voi | Full Indexer v2 API | Full Algod v2 API |\n| --- | --- | --- |\n| MainNet | `https://mainnet-idx.voi.nodely.io` | `https://mainnet-api.voi.nodely.io` |"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Setup","url":"https://nodely.io/docs/unlimited/start/#setup","text":"-   no setup fees"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Annual option:","url":"https://nodely.io/docs/unlimited/start/#annual-option","text":"-   $212 USD / month, billed $2,544 USD for 12 months up front"}
{"id":"/docs/unlimited/start/","title":"Unlimited API","markdownUrl":"https://nodely.io/docs/unlimited/start.md","heading":"Monthly options:","url":"https://nodely.io/docs/unlimited/start/#monthly-options","text":"-   256 USD by card: [sign up in the Nodely portal](https://portal.nodely.io/register), then an organization admin subscribes on the [Billing page](https://portal.nodely.io/billing)\n-   256 USD SWIFT or 240 Euro SEPA wires with Net15 (details on each invoice)\n-   256 USDCa TX with Net15 (details on each invoice)\n\nNeed a daily quota instead of unlimited traffic? See the Boost plan in [API access and plans](https://nodely.io/docs/access/).\n\nNet30 terms are available only for Enterprise tiers."}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"The TCP/DNS latency problem","url":"https://nodely.io/docs/unlimited/turboapi/#the-tcpdns-latency-problem","text":"Are you making thousands of back-end requests per hour and running into latency or timeout issues ?\n\nHTTP/2\n\nUsing HTTP/2 or HTTP/1.1 with keep-alive and connection pooling can reduce latency at least x5 and eliminate timeouts.\n\nMost back-end scripts and SDKs use short lived HTTP/1.1 requests to RPC node. As most Linux / Docker / K8S setups do not cache external DNS responses this slows down each API request by adding :\n\n-   extra DNS resolutions for A and AAAA records\n-   extra TCP handshake\n\nUsing HTTP/2 or HTTP/1.1 connection pooling eliminates the extra steps and allows you to make thousands of requests per second easily. Custom REST clients can be easily modified to use connection pooling.\n\nSlow SDKs\n\nAlgorand SDKs do not support HTTP connection pooling"}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Local API proxy","url":"https://nodely.io/docs/unlimited/turboapi/#local-api-proxy","text":"Consider running local reverse proxy to speed up band-end clients using Algorand SDK.\n\nProxy will speed things up by:\n\n-   Making DNS resolution only once for thousands of API calls\n-   Keeping TCP connections alive and reusing them\n\nProxy will also increase availability by:\n\n-   Proactively monitoring Cloudflare and non-cloudflare Nodely endpoints\n-   Falling back to closest non-cloudflare region in case of global CF outage\n\nHuge speedup, less CPU usage, faster responses, no DNS timeouts."}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Caddy reverse proxy using Docker","url":"https://nodely.io/docs/unlimited/turboapi/#caddy-reverse-proxy-using-docker","text":"Commercial service\n\nThis solution applies only to customers using commercial API tokens from Nodely"}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Caddy config file","url":"https://nodely.io/docs/unlimited/turboapi/#caddy-config-file","text":"Create a file named `Caddyfile` with the following contents:\n\n```plaintext\n# rev 1.0 @ 2025-08-23 - initial release\n\n(log) {\n    log {\n        output stdout\n        format json\n    }\n}\n\n(nodely-rev) {\n    health_uri /health\n    health_interval 5s\n    health_timeout 2s\n    health_status 200\n\n    lb_try_duration 1000ms\n    lb_retries 3\n    lb_retry_match {\n        method \"GET\" \"HEAD\" \"OPTIONS\" \"POST\"\n    }\n    lb_policy first\n    lb_try_interval 50ms\n    transport http {\n      dial_timeout            1500ms\n      response_header_timeout 5500ms\n      keepalive 30s\n      max_conns_per_host 50\n    }\n}\n\n# Node API endpoint (http://localhost:8801)\n:8801 {\n    bind 127.0.0.1\n    import log\n    reverse_proxy /* {\n        to https://mainnet-api.4160.nodely.io https://mainnet-api.algonode.network\n        header_up Host mainnet-api.4160.nodely.io\n        import nodely-rev\n    }\n}\n\n# Indexer API endpoint  (http://localhost:8802)\n:8802 {\n    bind 127.0.0.1\n    import log\n    reverse_proxy /* {\n        to https://mainnet-idx.4160.nodely.io https://mainnet-idx.algonode.network\n        header_up Host mainnet-idx.4160.nodely.io\n        import nodely-rev\n    }\n}\n```"}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Run the rev-proxy using Docker compose","url":"https://nodely.io/docs/unlimited/turboapi/#run-the-rev-proxy-using-docker-compose","text":"Create a `docker-compose.yaml` file with the following contents:\n\n```yaml\nservices:\n  nodelyproxy:\n    container_name: nodelyproxy\n    image: caddy\n    volumes:\n      - type: bind\n        source: ./Caddyfile\n        target: /etc/caddy/Caddyfile\n    restart: always\n    deploy:\n        resources:\n            limits:\n              memory:  \"1G\"\n    environment:\n      - 'GOMEMLIMIT=512MiB'\n      - 'GOMAXPROCS=2'\n    network_mode: host\n```\n\nYou can modify the compose file to run in a separate docker network and map the ports in some other way. Running `docker compose up -d` will start rev-proxy on ports 8801 and 8802."}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Using the rev-proxy","url":"https://nodely.io/docs/unlimited/turboapi/#using-the-rev-proxy","text":"You can than point your client code to use\n\n-   `http://localhost:8801` for Algod (node) API\n-   `http://localhost:8802` for Indexer API\n\n`curl http://localhost:8802/health`\n\nHints:\n\n-   You can remove the “bind 127.0.0.1” directive to make the proxy listen on your public/external IP address\n-   You can include this service as a sidecart to your K8S deployments or docker-compose setups"}
{"id":"/docs/unlimited/turboapi/","title":"Making API calls at least x5 faster","markdownUrl":"https://nodely.io/docs/unlimited/turboapi.md","heading":"Docker compose sidecart example","url":"https://nodely.io/docs/unlimited/turboapi/#docker-compose-sidecart-example","text":"Caution\n\nRemove `bind 127.0.0.1` from the Caddyfile and remember to use API keys.\n\n```yaml\nservices:\n  nodelyproxy:\n    container_name: nodelyproxy\n    image: caddy\n    volumes:\n      - type: bind\n        source: ./Caddyfile\n        target: /etc/caddy/Caddyfile\n    restart: always\n    deploy:\n        resources:\n            limits:\n              memory:  \"1G\"\n    environment:\n      - 'GOMEMLIMIT=512MiB'\n      - 'GOMAXPROCS=2'\n    networks:\n      - example_network\n\n  client:\n    image: curlimages/curl:latest\n    container_name: client_curl\n    networks:\n      - example_network\n    depends_on:\n      - nodelyproxy\n    command: >\n       sh -c \"\n       while true; do\n         echo '--- Making indexer request at: ' && date &&\n         curl -s http://nodelyproxy:8802/health &&\n         echo ''\n         sleep 1\n       done\n       \"\n\nnetworks:\n  example_network:\n```"}
{"id":"/docs/utils/matrix/","title":"AVM tools","markdownUrl":"https://nodely.io/docs/utils/matrix.md","heading":"AVM tools","url":"https://nodely.io/docs/utils/matrix/","text":"| Network | Explorers | Wallets | Faucet | Other |\n| --- | --- | --- | --- | --- |\n| Algorand mainnnet | [Allo](https://allo.info/), [BitQuery](https://explorer.bitquery.io/algorand), [Pera](https://explorer.perawallet.app/) | [Defly](https://defly.app/), [Lute](https://lute.app/), [Pera](https://perawallet.app/) | :( |  |\n| Algorand testnet | [BitQuery](https://explorer.bitquery.io/algorand_testnet), [Pera](https://explorer.perawallet.app/) | [Defly](https://defly.app/), [Lute](https://lute.app/), [Pera](https://perawallet.app/) |  |  |\n| Algorand betanet | [BitQuery](https://explorer.bitquery.io/algorand_betanet) | [Lute](https://lute.app/) |  |  |\n| FNet futurenet | [Dappflow](https://app.dappflow.org/) | [Lute](https://lute.app/) |  |  |\n| Voi testnet | [Voi.observer](https://voi.observer/) | [Lute](https://lute.app/) |  |  |\n| Voi mainnet | [Voi.observer](https://voi.observer/) | [Lute](https://lute.app/) |  |  |\n| AVM agnostic / sandbox | [Dappflow](https://app.dappflow.org/), [Lora](https://lora.algokit.io/) | [A-Wallet](https://www.a-wallet.net/) |  |  |"}
{"id":"/docs/utils/matrix/","title":"AVM tools","markdownUrl":"https://nodely.io/docs/utils/matrix.md","heading":"Other networks","url":"https://nodely.io/docs/utils/matrix/#other-networks","text":"| Network | Explorers | Wallets | Faucet | Node |\n| --- | --- | --- | --- | --- |\n| Monero mainnet | [Nodely explorer](https://explore.xmr.nodely.dev/) | [Feather](https://featherwallet.org/), [Monero GUI/CLI](https://www.getmonero.org/downloads/) |  | [xmr.nodely.dev:18089](https://nodely.io/docs/monero) |\n| Monero stagenet | [Nodely explorer](https://explore.sxmr.nodely.dev/) | [Feather](https://featherwallet.org/), [Monero GUI/CLI](https://www.getmonero.org/downloads/) | [Nodely faucet](https://faucet-stagenet.xmr.nodely.dev/) | [xmr.nodely.dev:38089](https://nodely.io/docs/monero) |\n| Gno.land mainnet |  |  |  | [gnot.nodely.dev](https://nodely.io/docs/gno) |\n| Ethereum mainnet | [Etherscan](https://etherscan.io/), [Blockscout](https://eth.blockscout.com/) | [MetaMask](https://metamask.io/), [Rabby](https://rabby.io/) |  | [eth.nodely.dev](https://nodely.io/docs/ethereum) |\n| Base mainnet | [Basescan](https://basescan.org/), [Blockscout](https://base.blockscout.com/) | [MetaMask](https://metamask.io/), [Rabby](https://rabby.io/) |  | [base.nodely.dev](https://nodely.io/docs/base) |\n| Arc mainnet | [Arc Explorer](https://explorer.arc.io/) | [MetaMask](https://metamask.io/), [Rabby](https://rabby.io/) |  | [arc.nodely.dev](https://nodely.io/docs/arc) |"}
{"id":"/docs/utils/node-ui/","title":"Algorand Node Managers","markdownUrl":"https://nodely.io/docs/utils/node-ui.md","heading":"Management UIs","url":"https://nodely.io/docs/utils/node-ui/#management-uis","text":"-   [Allo’ Ctrl](https://github.com/AlgoNode/alloctrl)\n-   [Terminal UI](https://github.com/algorand/node-ui)"}
{"id":"/docs/utils/node-ui/","title":"Algorand Node Managers","markdownUrl":"https://nodely.io/docs/utils/node-ui.md","heading":"OneClick nodes","url":"https://nodely.io/docs/utils/node-ui/#oneclick-nodes","text":"-   [Algorun](https://github.com/algorandfoundation/algorun)\n-   [Pixelnode](https://www.pixelnode.org/)\n-   [Aust’s OCN](https://github.com/AustP/austs-one-click-node)"}
{"id":"/docs/whitelabel/","title":"Whitelabel RPC","markdownUrl":"https://nodely.io/docs/whitelabel.md","heading":"Whitelabel RPC","url":"https://nodely.io/docs/whitelabel/","text":"Nodely runs whitelabel RPC infrastructure for RPC providers. You sell the endpoints under your brand; we run the nodes behind them."}
{"id":"/docs/whitelabel/","title":"Whitelabel RPC","markdownUrl":"https://nodely.io/docs/whitelabel.md","heading":"What you get","url":"https://nodely.io/docs/whitelabel/#what-you-get","text":"-   **Unlimited requests for a flat fee.** No per-request billing, no compute units, no overages.\n-   **Your domain.** Endpoints on your own hostnames, with your authentication (tokens, headers or allowlists).\n-   **Supported protocols:** [Algorand](https://nodely.io/docs/free/start) (node and indexer APIs), [Monero](https://nodely.io/docs/monero) and [Gno.land](https://nodely.io/docs/gno).\n-   **Geo-distributed, archival-capable nodes** run by the team behind AlgoNode.\n-   **No lock-in.** Vanilla, open-source node APIs, so your customers’ code stays portable.\n-   **Engineering support** from people who run the nodes."}
{"id":"/docs/whitelabel/","title":"Whitelabel RPC","markdownUrl":"https://nodely.io/docs/whitelabel.md","heading":"Pricing","url":"https://nodely.io/docs/whitelabel/#pricing","text":"Flat monthly fee, scoped to the protocols and regions you need. [Contact us](https://nodely.io/contact) or write to [sales@nodely.io](mailto:sales@nodely.io) for a quote."}
{"id":"/docs/x402/discovery/","title":"x402 API discovery","markdownUrl":"https://nodely.io/docs/x402/discovery.md","heading":"x402 API discovery","url":"https://nodely.io/docs/x402/discovery/","text":"Agents and x402 directories can find and use these APIs without reading this page. Every discovery route is free."}
{"id":"/docs/x402/discovery/","title":"x402 API discovery","markdownUrl":"https://nodely.io/docs/x402/discovery.md","heading":"`/.well-known/x402`","url":"https://nodely.io/docs/x402/discovery/","text":"[`https://x402.api.nodely.io/.well-known/x402`](https://x402.api.nodely.io/.well-known/x402) lists the paid resources:\n\n```json\n{\n  \"version\": 1,\n  \"resources\": [\n    \"https://x402.api.nodely.io/v1/search\",\n    \"https://x402.api.nodely.io/v1/scrape\",\n    \"https://x402.api.nodely.io/v1/prices/price\",\n    \"https://x402.api.nodely.io/v1/prices/history\",\n    \"https://x402.api.nodely.io/v1/prices/pairs\",\n    \"https://x402.api.nodely.io/v1/prices/pools\",\n    \"https://x402.api.nodely.io/v1/prices/candles\",\n    \"https://x402.api.nodely.io/v1/prices/account\",\n    \"https://x402.api.nodely.io/v1/images/search\",\n    \"https://x402.api.nodely.io/v1/images/similar/{cid}\"\n  ]\n}\n```"}
{"id":"/docs/x402/discovery/","title":"x402 API discovery","markdownUrl":"https://nodely.io/docs/x402/discovery.md","heading":"OpenAPI","url":"https://nodely.io/docs/x402/discovery/#openapi","text":"[`https://x402.api.nodely.io/openapi.json`](https://x402.api.nodely.io/openapi.json) is an OpenAPI 3.1 description of all routes, with request and response schemas and the payment headers. The [live API reference](https://x402.api.nodely.io/docs/) renders it as an interactive page."}
{"id":"/docs/x402/discovery/","title":"x402 API discovery","markdownUrl":"https://nodely.io/docs/x402/discovery.md","heading":"llms.txt","url":"https://nodely.io/docs/x402/discovery/#llmstxt","text":"[`https://x402.api.nodely.io/llms.txt`](https://x402.api.nodely.io/llms.txt) is a short plain-text summary for language models: the APIs, prices, how to pay and links to the machine-readable files."}
{"id":"/docs/x402/discovery/","title":"x402 API discovery","markdownUrl":"https://nodely.io/docs/x402/discovery.md","heading":"Bazaar metadata in the 402","url":"https://nodely.io/docs/x402/discovery/#bazaar-metadata-in-the-402","text":"Each 402 response describes the resource it is selling, so x402 directories (the “bazaar”) can list it:\n\n-   a description, MIME type, service name and tags\n-   an example input and output\n-   a JSON Schema for the request body\n\nThis metadata is under `extensions.bazaar` in the `PAYMENT-REQUIRED` JSON. To see it, decode the header from an unpaid request:\n\n```bash\ncurl -s -o /dev/null -D - -X POST https://x402.api.nodely.io/v1/scrape \\\n  -H 'Content-Type: application/json' -d '{\"url\":\"https://example.org/\"}' \\\n  | awk -F': ' 'tolower($1)==\"payment-required\"{print $2}' | tr -d '\\r' | base64 -d | jq .\n```"}
{"id":"/docs/x402/images/","title":"x402 NFT image search API","markdownUrl":"https://nodely.io/docs/x402/images.md","heading":"x402 NFT image search API","url":"https://nodely.io/docs/x402/images/","text":"This API searches the images of every Algorand NFT in Nodely’s IPFS cache by meaning, not by file name. You can search with a text query in any language, with an image of your own, or with the CID of an image already in the cache. Every image is embedded with the Qwen3-VL-Embedding-2B model, and the API answers with the nearest images, their IPFS CIDs, similarity scores and the Algorand assets (ASA ids) that reference them.\n\nIt costs **0.005 USDC per call**, paid with [x402](https://nodely.io/docs/x402/payment) in USDC on Algorand. This API doesn’t take payment on Base or Arc.\n\n| Endpoint | What it searches with |\n| --- | --- |\n| `GET https://x402.api.nodely.io/v1/images/search?q=...` | A text query, 1–1000 characters, any language |\n| `POST https://x402.api.nodely.io/v1/images/search` | An image: png, jpeg, gif, webp or bmp up to 16 MiB |\n| `GET https://x402.api.nodely.io/v1/images/similar/{cid}` | An image already in the cache, by its IPFS CID (“more like this”) |"}
{"id":"/docs/x402/images/","title":"x402 NFT image search API","markdownUrl":"https://nodely.io/docs/x402/images.md","heading":"Parameters","url":"https://nodely.io/docs/x402/images/#parameters","text":"All three endpoints take the same query parameters:\n\n| Parameter | Notes |\n| --- | --- |\n| `k` | Number of results, 1–100, default 20 |\n| `assets` | `0` leaves out the referencing Algorand assets, which is faster |\n\n`GET /v1/images/search` also takes `q` (required). `POST /v1/images/search` takes the image either as a raw body with an `image/*` `Content-Type`, or as JSON `{\"image\": \"<base64 or data URL>\"}`. `/v1/images/similar/{cid}` leaves out the queried image’s own content from the results."}
{"id":"/docs/x402/images/","title":"x402 NFT image search API","markdownUrl":"https://nodely.io/docs/x402/images.md","heading":"Response","url":"https://nodely.io/docs/x402/images/#response","text":"```json\n{\n  \"results\": [\n    {\n      \"cid\": \"bafkrei…\",\n      \"mime\": \"image/png\",\n      \"score\": 0.61,\n      \"assets\": [\n        { \"asset\": 1234567890, \"key\": \"url\", \"depth\": 0 }\n      ]\n    }\n  ]\n}\n```\n\n| Field | Meaning |\n| --- | --- |\n| `cid` | IPFS CID of the image. Fetch it through any IPFS gateway |\n| `mime` | Image type |\n| `score` | Cosine similarity: higher is closer |\n| `assets` | Up to 5 Algorand assets that reference the CID. `key` says where (the asset URL, ARC-19, ARC-69 media…); `depth` is `0` for the asset’s own URL and `1` for a reference inside its metadata |"}
{"id":"/docs/x402/images/","title":"x402 NFT image search API","markdownUrl":"https://nodely.io/docs/x402/images.md","heading":"What is not charged","url":"https://nodely.io/docs/x402/images/#what-is-not-charged","text":"-   An invalid request (`400`).\n-   An upload that isn’t a supported image (`415`).\n-   A `similar` call with a CID that isn’t an embedded image in the cache (`404`).\n-   A search where the embedding model or the index doesn’t answer (`503`)."}
{"id":"/docs/x402/images/","title":"x402 NFT image search API","markdownUrl":"https://nodely.io/docs/x402/images.md","heading":"Example","url":"https://nodely.io/docs/x402/images/#example","text":"Using the Algorand paid fetch client from [Pricing & payment](https://nodely.io/docs/x402/payment#algorand-client):\n\n```js\n// Text search\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/images/search?q=pixel%20art%20frog&k=10\");\nconsole.log(await res.json());\n\n// Reverse image search with a local file\nimport { readFile } from \"node:fs/promises\";\nconst img = await paidFetch(\"https://x402.api.nodely.io/v1/images/search?k=10\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"image/png\" },\n  body: await readFile(\"frog.png\"),\n});\nconsole.log(await img.json());\n```\n\nFree routes in this namespace:\n\n-   [`/v1/images/pricing`](https://x402.api.nodely.io/v1/images/pricing)\n-   [`/v1/images/health`](https://x402.api.nodely.io/v1/images/health)\n-   [`/v1/images/openapi.json`](https://x402.api.nodely.io/v1/images/openapi.json)"}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"x402 pay-per-call APIs","url":"https://nodely.io/docs/x402/","text":"Nodely sells pay-per-call APIs for AI agents at `https://x402.api.nodely.io`. You pay per request with [x402](https://www.x402.org/) in USDC on Algorand mainnet; web search and page scrape also take USDC on Base and Arc. You don’t need an account, a sign-up or an API key."}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"How it works","url":"https://nodely.io/docs/x402/#how-it-works","text":"1.  Call a paid route.\n2.  The API answers **HTTP 402 Payment Required** with the price and where to pay.\n3.  Your client signs one USDC payment and sends the same request again with the signed payment attached. Nodely pays the network fee, so you spend only USDC: no ALGO on Algorand, no ETH on Base.\n4.  The API answers with the result and a payment receipt.\n\nThe official x402 clients handle all of this. [Pricing & payment](https://nodely.io/docs/x402/payment) covers the details and has a client example.\n\n![The x402 payment flow on Algorand, using the web search API as an example: request, 402 offer, signing, retry, result, and who pays what](https://nodely.io/images/x402/x402-flow.gif)"}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"Why no API keys","url":"https://nodely.io/docs/x402/#why-no-api-keys","text":"An agent can find the API, read the price from the 402 response and pay, all without a human. You don’t need a sign-up, a key to rotate or a monthly plan. You pay only for requests that deliver a result."}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"APIs and prices","url":"https://nodely.io/docs/x402/#apis-and-prices","text":"| API | Route | Price | Pay on |\n| --- | --- | --- | --- |\n| [Web search](https://nodely.io/docs/x402/search) | `POST` / `GET /v1/search` | 0.0085 USDC per query on Algorand, 0.009 on Base and Arc | Algorand, Base, Arc |\n| [Page scrape](https://nodely.io/docs/x402/scrape) | `POST` / `GET /v1/scrape` | 0.011 USDC per page on Algorand, 0.012 on Base and Arc | Algorand, Base, Arc |\n| [Algorand DEX prices](https://nodely.io/docs/x402/prices) | `GET /v1/prices/{price,history,pairs,pools,candles}` | 0.001 USDC per call | Algorand |\n| [Account value](https://nodely.io/docs/x402/prices#get-v1pricesaccount) | `GET /v1/prices/account` | 0.002 USDC per call | Algorand |\n| [NFT image search](https://nodely.io/docs/x402/images) | `GET` / `POST /v1/images/search`, `GET /v1/images/similar/{cid}` | 0.005 USDC per call | Algorand |\n\nA search that returns nothing isn’t charged. A scrape that fails or hits an HTTP error page isn’t charged either, and neither is a price query that finds no data, an account that was never on chain, or an image search that fails or names an unknown CID."}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"Free routes","url":"https://nodely.io/docs/x402/#free-routes","text":"| Route | What it returns |\n| --- | --- |\n| [`/v1/search/pricing`](https://x402.api.nodely.io/v1/search/pricing), [`/v1/scrape/pricing`](https://x402.api.nodely.io/v1/scrape/pricing), [`/v1/prices/pricing`](https://x402.api.nodely.io/v1/prices/pricing), [`/v1/images/pricing`](https://x402.api.nodely.io/v1/images/pricing) | Price, asset, networks and receiving address |\n| [`/v1/search/health`](https://x402.api.nodely.io/v1/search/health), [`/v1/prices/health`](https://x402.api.nodely.io/v1/prices/health), [`/v1/images/health`](https://x402.api.nodely.io/v1/images/health), [`/health`](https://x402.api.nodely.io/health) | Service health |\n| [`/v1/prices/status`](https://x402.api.nodely.io/v1/prices/status) | How far the price dataset is built |\n| [`/docs/`](https://x402.api.nodely.io/docs/) | Live, interactive API reference |\n| [`/openapi.json`](https://x402.api.nodely.io/openapi.json) | OpenAPI 3.1 description |\n| [`/.well-known/x402`](https://x402.api.nodely.io/.well-known/x402), [`/llms.txt`](https://x402.api.nodely.io/llms.txt) | Machine-readable discovery, see [Discovery](https://nodely.io/docs/x402/discovery) |"}
{"id":"/docs/x402/","title":"x402 pay-per-call APIs","markdownUrl":"https://nodely.io/docs/x402.md","heading":"Try it","url":"https://nodely.io/docs/x402/#try-it","text":"This request shows the 402 payment offer without paying anything:\n\n```bash\ncurl -si -X POST https://x402.api.nodely.io/v1/search \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":\"x402\"}'\n```"}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"x402 pricing & payment","url":"https://nodely.io/docs/x402/payment/","text":"Each paid request is paid separately in USDC, using the x402 v2 protocol. You can pay on Algorand mainnet for every API, and on Base or Arc for web search and page scrape. Web search costs 0.0085 USDC on Algorand and 0.009 USDC on Base or Arc; page scrape costs 0.011 USDC on Algorand and 0.012 USDC on Base or Arc. DEX prices (0.001 USDC), account value (0.002 USDC) and NFT image search (0.005 USDC) are paid on Algorand. Nodely pays the network fee on every network, so you only spend USDC.\n\n![The x402 payment flow on Algorand, using the web search API as an example: request, 402 offer, signing, retry, result, and who pays what](https://nodely.io/images/x402/x402-flow.gif)"}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Prices","url":"https://nodely.io/docs/x402/payment/#prices","text":"| API | Price | Amount (USDC base units) | Pay on |\n| --- | --- | --- | --- |\n| Web search, `/v1/search` | 0.0085 USDC per query | `8500` | Algorand |\n| Web search, `/v1/search` | 0.009 USDC per query | `9000` | Base, Arc |\n| Page scrape, `/v1/scrape` | 0.011 USDC per page | `11000` | Algorand |\n| Page scrape, `/v1/scrape` | 0.012 USDC per page | `12000` | Base, Arc |\n| DEX prices, `/v1/prices/{price,history,pairs,pools,candles}` | 0.001 USDC per call | `1000` | Algorand |\n| Account value, `/v1/prices/account` | 0.002 USDC per call | `2000` | Algorand |\n| NFT image search, `/v1/images/search`, `/v1/images/similar/{cid}` | 0.005 USDC per call | `5000` | Algorand |\n\nEach route has its own price. Read the current price from the route’s 402 response or from its free pricing route: [`/v1/search/pricing`](https://x402.api.nodely.io/v1/search/pricing), [`/v1/scrape/pricing`](https://x402.api.nodely.io/v1/scrape/pricing), [`/v1/prices/pricing`](https://x402.api.nodely.io/v1/prices/pricing) or [`/v1/images/pricing`](https://x402.api.nodely.io/v1/images/pricing)."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Payment parameters","url":"https://nodely.io/docs/x402/payment/#payment-parameters","text":"| Field | Value |\n| --- | --- |\n| Protocol | x402 v2 |\n| Scheme | `exact` |\n| Amount | The route’s price in USDC base units (6 decimals), for example `10000` = 0.01 USDC |\n\nEvery 402 response and every pricing route also lists the networks, assets and addresses below."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Algorand","url":"https://nodely.io/docs/x402/payment/#algorand","text":"| Field | Value |\n| --- | --- |\n| Network | `algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k` (Algorand mainnet; the full-genesis-hash form is also accepted) |\n| Asset | USDC, ASA `31566704` |\n| Receiving address (`payTo`) | `X4O2COYWOFR7XS3EOYEF6MG42Y4Q743SKZMULC776NODRTMMRIVTCOBANQ` |\n| Fee payer (`extra.feePayer`) | `X4O2STHZWIA425GOSCKVW3KY6IAW3F6SSV5AZ23HOYFLKCDRTHKWUYNDLY`. It pays the network fee of your payment |\n| APIs | All |"}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Base and Arc","url":"https://nodely.io/docs/x402/payment/#base-and-arc","text":"| Field | Base | Arc |\n| --- | --- | --- |\n| Network | `eip155:8453` | `eip155:5042` |\n| USDC contract (`asset`) | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | `0x3600000000000000000000000000000000000000` |\n| EIP-712 domain (`extra`) | `USD Coin`, version `2` | `USDC`, version `2` |\n| APIs | Web search, page scrape | Web search, page scrape |\n\nThe receiving address (`payTo`) is the same on both: `0x27BFde54149948b6507eFC3F2B1656e422A2c986`."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"The payment flow","url":"https://nodely.io/docs/x402/payment/#the-payment-flow","text":"1.  **Request.** Call a paid route as usual.\n2.  **402.** The API answers `402 Payment Required`. The `PAYMENT-REQUIRED` header holds base64-encoded JSON that lists the accepted payments, one per network, and the response body holds the same JSON.\n3.  **Sign.** Your client picks the offer for a network where it holds USDC. On Algorand it signs its own USDC transfer (see [Paying on Algorand](https://nodely.io/docs/x402/payment/#paying-on-algorand)); on Base or Arc it signs a USDC transfer authorization (see [Paying on Base or Arc](https://nodely.io/docs/x402/payment/#paying-on-base-or-arc)).\n4.  **Retry.** Send the same request again with the signed payment in the `PAYMENT-SIGNATURE` header. The API also accepts the older `X-PAYMENT` header.\n5.  **200.** The API returns the result. The `PAYMENT-RESPONSE` header confirms the payment; on Algorand it holds the payment’s transaction id.\n\nYour paying account needs at least **10× the price** in USDC on the network you pay on. On Algorand it also needs its **minimum balance**: about 0.2 ALGO, which covers the account and its USDC opt-in. This ALGO stays in your account; you don’t spend it. On Base and Arc you need USDC only."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Network fee","url":"https://nodely.io/docs/x402/payment/#network-fee","text":"Nodely pays the Algorand network fee. The 402 offer names a fee payer in `extra.feePayer`, and the official client then builds an atomic group of two transactions:\n\n| # | Transaction | Signed by | Fee |\n| --- | --- | --- | --- |\n| 0 | Payment of 0 ALGO from the fee payer to itself | Nobody yet: the API signs it after checking the group | The whole group’s fee, about 0.002 ALGO |\n| 1 | Your USDC transfer to `payTo` for the price | You | 0 |\n\nBoth transactions carry the same group id, so neither can go on chain without the other. The API’s signature is only good for this one transfer of yours, and you sign nothing but the USDC you pay. A client that ignores `extra.feePayer` and sends a single USDC transfer with its own fee is also accepted.\n\nWho pays what, per call:\n\n| Who | Pays | To |\n| --- | --- | --- |\n| You | The price in USDC, for example 0.0085 | Nodely (`payTo`) |\n| Nodely (fee payer) | About 0.002 ALGO | The Algorand network |"}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"What the API checks before it answers","url":"https://nodely.io/docs/x402/payment/#what-the-api-checks-before-it-answers","text":"Every check below runs before the API starts the search, scrape or price query. Nothing goes on chain until there is a result.\n\n1.  **The request.** Invalid input is answered `400` and never asks for payment.\n2.  **The offer.** The payment header is present and valid x402 v2, and the payment terms you accepted are exactly one of the offers for this route: scheme, network, asset, amount and `payTo`.\n3.  **Your transfer.** The transaction is:\n    -   a USDC transfer for exactly the price to `payTo`, on Algorand mainnet;\n    -   signed with a single key, by you or by the address your account is rekeyed to;\n    -   free of close-out, clawback and rekey fields;\n    -   valid for long enough that the API can do the work and submit it (the official client’s default window is enough).\n4.  **The fee payer’s transaction**, when the fee is sponsored:\n    -   a 0-ALGO payment from the fee payer to itself, with no close, rekey or lease;\n    -   the same validity window as your transfer;\n    -   a fee within a fixed cap;\n    -   grouped with your transfer and nothing else.\n5.  **Your account**, looked up on chain:\n    -   the key that signed is the account’s current signer;\n    -   it is opted in to USDC and the holding isn’t frozen;\n    -   it holds at least 10× the price, plus any of your payments still settling.\n6.  **Replay and limits.** The same payment can’t pay for two results. An account whose payment failed on chain is blocked for 24 hours. Each account may have at most 20 payments settling at once.\n\nWhen the result is ready, and before any of it is sent, the API submits the payment to Algorand. The response goes out only after the network has accepted the payment. The payment’s transaction id comes back in `PAYMENT-RESPONSE`, and the transaction confirms in the next block, about 3 seconds later."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Paying on Base or Arc","url":"https://nodely.io/docs/x402/payment/#paying-on-base-or-arc","text":"Your client signs an EIP-3009 `transferWithAuthorization` for the USDC contract: a signature that lets exactly the price move from your account to `payTo`, once, before a deadline. You don’t send a transaction yourself. Nodely’s relayer submits your authorization on chain and pays the gas, so on Base you need no ETH. Arc’s gas is paid in USDC, and Nodely pays that too.\n\nBefore the API starts the search or scrape, it checks:\n\n1.  **The request and the offer**, as on Algorand: invalid input is answered `400`, and the terms you accepted must be exactly one of the offers for this route.\n2.  **Your authorization.** It is signed by your account under the token’s EIP-712 domain, moves exactly the price to `payTo`, hasn’t been used before, and stays valid long enough for the work and the settlement (the official client’s default is enough).\n3.  **Your account.** It holds at least 10× the price in USDC, plus any of your payments still settling, and isn’t on USDC’s blocklist.\n4.  **Limits.** Each account may have at most 5 payments settling at once. While gas on the network is unusually expensive, new payments get `503`.\n\nThe API sends the result first, then submits your authorization. `PAYMENT-RESPONSE` confirms the payment, but its `transaction` field is empty, because the settling transaction is sent right after the response. An account whose authorization then fails on chain, for example because it was cancelled or the USDC was moved first, is blocked for 24 hours."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Client example (Node.js)","url":"https://nodely.io/docs/x402/payment/#client-example-nodejs","text":"The official `@x402/fetch` package handles the 402 and the retry, with `@x402/avm` for Algorand or `@x402/evm` for Base and Arc. Python users can use the `x402` package."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Algorand client","url":"https://nodely.io/docs/x402/payment/#algorand-client","text":"```bash\nnpm install @x402/core @x402/fetch @x402/avm\n```\n\n```js\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ALGORAND_MAINNET_CAIP2, ExactAvmScheme, toClientAvmSigner } from \"@x402/avm\";\n\n// Base64 secret key of an account holding USDC (and its ~0.2 ALGO minimum balance)\nconst signer = toClientAvmSigner(process.env.ALGORAND_SECRET_KEY_B64);\nconst client = new x402Client().register(ALGORAND_MAINNET_CAIP2,\n  new ExactAvmScheme(signer, { algodUrl: \"https://mainnet-api.4160.nodely.dev\" }));\nconst paidFetch = wrapFetchWithPayment(fetch, client);\n\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/search\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ query: \"algorand x402\", max_results: 5 }),\n});\nconsole.log(await res.json());\n```"}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Base or Arc client","url":"https://nodely.io/docs/x402/payment/#base-or-arc-client","text":"```bash\nnpm install @x402/core @x402/fetch @x402/evm viem\n```\n\n```js\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ExactEvmScheme, toClientEvmSigner } from \"@x402/evm\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n// Private key (0x…) of an account holding USDC on Base. No ETH needed: Nodely pays the gas.\nconst signer = toClientEvmSigner(privateKeyToAccount(process.env.EVM_PRIVATE_KEY));\n// Base; to pay on Arc, register \"eip155:5042\" instead\nconst client = new x402Client().register(\"eip155:8453\", new ExactEvmScheme(signer));\nconst paidFetch = wrapFetchWithPayment(fetch, client);\n\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/search\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ query: \"base x402\", max_results: 5 }),\n});\nconsole.log(await res.json());\n```\n\nThe DEX prices, account value and NFT image search APIs take payment on Algorand only, so use the Algorand client for them."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"What is not charged","url":"https://nodely.io/docs/x402/payment/#what-is-not-charged","text":"-   A search where no engine returns any results.\n-   A scrape that fails (`502 scrape_failed`) or times out (`504 scrape_timeout`).\n-   A scrape where the target page answers with HTTP 4xx or 5xx.\n-   A price query that finds no data, for example an asset with no pool or a range with no candle.\n-   An account value query for an address never seen on chain (`404`).\n-   An image search that names an unknown CID (`404`), sends an unsupported image (`415`), or finds the model or index unavailable (`503`).\n-   A request rejected before payment, for example invalid input (`400`).\n\nYou can retry a failed attempt with the same signed payment. The number of free retries is limited."}
{"id":"/docs/x402/payment/","title":"x402 pricing & payment","markdownUrl":"https://nodely.io/docs/x402/payment.md","heading":"Errors","url":"https://nodely.io/docs/x402/payment/#errors","text":"Error responses are JSON:\n\n```json\n{ \"error\": { \"code\": \"scrape_failed\", \"message\": \"…\" }, \"request_id\": \"…\" }\n```\n\n| Status | Meaning |\n| --- | --- |\n| `400` | Invalid request (bad fields, a disallowed URL). Not charged. |\n| `402` | Payment required, or the payment was rejected. The `error` field says why. |\n| `429` | Too many requests. |\n| `502` | Upstream failure, for example `scrape_failed`. Not charged. |\n| `503` | Service temporarily unavailable, or gas on Base or Arc is too expensive right now. |\n| `504` | Scrape timed out (`scrape_timeout`). Not charged. |"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"x402 Algorand DEX prices and account value API","url":"https://nodely.io/docs/x402/prices/","text":"This API returns the price of any Algorand asset (ASA) at any round or time since round 19,247,000, OHLC candles for charts, and the total USD value of an Algorand account across its wallet, DeFi and staking positions. Prices come from the on-chain state of DEX pools. It is paid with [x402](https://nodely.io/docs/x402/payment) in USDC on Algorand. This API doesn’t take payment on Base or Arc.\n\n| Endpoint | Price |\n| --- | --- |\n| `GET https://x402.api.nodely.io/v1/prices/{price,history,pairs,pools,candles}` | 0.001 USDC per call |\n| `GET https://x402.api.nodely.io/v1/prices/account` | 0.002 USDC per call |\n\n-   A call that finds no data isn’t charged (`404`), and neither is a call rejected as invalid (`400`).\n-   `price`, `history`, `pairs` and `pools` are also free, with a rate limit, at [algoprices.api.nodely.io](https://algoprices.api.nodely.io/v1/api-docs/). Use x402 when you want to pay per call instead of hitting that limit. `candles` and `account` are x402 only."}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"How prices are computed","url":"https://nodely.io/docs/x402/prices/#how-prices-are-computed","text":"The state of every pool is replayed from its on-chain state changes, so a price is exact to the round. Pools come from 12 venues: Tinyman V2, Pact, Pact StableSwap, Pact weighted, Humble, Algofi, LiquiHog, Biatec and NanoSwap, plus the mint and redeem rates of tALGO, xALGO and Folks lending.\n\nA USD price is a route search to USDC across the pools, weighted by liquidity. A price in any other quote asset is the ratio of the two USD prices. Every price carries three numbers:\n\n-   `price`, in the quote you asked for\n-   `usdc`, in USD\n-   `algo`, in ALGO"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"Assets and times","url":"https://nodely.io/docs/x402/prices/#assets-and-times","text":"Wherever a parameter takes an asset (`asset`, `quote`), you can pass an ASA id, `algo` (= 0) or `usdc` (= 31566704). Times (`ts`, `from`, `to`) take unix seconds, RFC 3339 or `YYYY-MM-DD` (UTC)."}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/price`","url":"https://nodely.io/docs/x402/prices/","text":"The price of an asset at one round or one time.\n\n| Parameter | Notes |\n| --- | --- |\n| `asset` | Required |\n| `quote` | Default `usdc` |\n| `round` or `ts` | One of them. Omit both for the latest price |\n| `details` | `1` lists every pool quote used: venue, pool, intermediate asset, implied USD price, weight, and whether it was kept |\n| `min_liq` | Minimum pool liquidity in USD for routing, default 50 |\n| `max_hops` | Maximum route length to USDC, default 4 |\n| `stale_days` | Ignore pools with no activity for this many days, default 30 |\n| `max_dev` | Drop pool quotes further than this fraction from the median, default 0.2 |\n\n```json\n{\n  \"asset\": { \"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6 },\n  \"quote\": { \"id\": 31566704, \"unit\": \"USDC\", \"name\": \"USDC\", \"decimals\": 6 },\n  \"round\": 65552798,\n  \"ts\": \"2026-10-01T00:00:00Z\",\n  \"price\": 0.12426479033114125,\n  \"usdc\": 0.12426479033114125,\n  \"algo\": 1,\n  \"asset_usd\": { \"usd\": 0.12426479033114124, \"liquidity_usd\": 1035359.008177, \"hops\": 1 },\n  \"quote_usd\": { \"usd\": 1 }\n}\n```"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/history`","url":"https://nodely.io/docs/x402/prices/","text":"Prices over a time range, split into equal-width bins. Each point is the price at the end of its bin.\n\n| Parameter | Notes |\n| --- | --- |\n| `asset`, `from`, `to` | Required |\n| `quote` | Default `usdc` |\n| `bins` | Number of bins, default 100, at most 2000 |\n| `min_liq`, `max_hops`, `stale_days`, `max_dev` | As for `price` |\n\n```json\n{\n  \"from\": \"2026-10-01T00:00:00Z\",\n  \"to\": \"2026-10-03T00:00:00Z\",\n  \"bin_seconds\": 86400,\n  \"pools\": 8,\n  \"points\": [\n    { \"ts\": \"2026-10-02T00:00:00Z\", \"price\": 0.12227, \"usdc\": 0.12227, \"algo\": 1, \"liquidity_usd\": 1025247.3 },\n    { \"ts\": \"2026-10-03T00:00:00Z\", \"price\": 0.12720, \"usdc\": 0.12720, \"algo\": 1, \"liquidity_usd\": 1046091.07 }\n  ]\n}\n```"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/pairs`","url":"https://nodely.io/docs/x402/prices/","text":"All pairs with a live pool on a day, with reserves, volume and TVL.\n\n| Parameter | Notes |\n| --- | --- |\n| `date` | `YYYY-MM-DD` (UTC), default the last finalized day |\n| `active` | `1` returns only pairs with at least one swap that day |\n| `min_tvl` | Minimum TVL in USD |\n| `kind` | `amm` returns tradable pools only; `rate` returns mint/redeem and lending rate venues only |"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/pools`","url":"https://nodely.io/docs/x402/prices/","text":"The pools that hold an asset (`asset`, required): venue, pool id, app id, both assets, fee and first round."}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/candles`","url":"https://nodely.io/docs/x402/prices/","text":"OHLC candles in USD for charts, in bins aligned to UTC (weeks start on Monday), at most 2000 per call. Each candle is the **main pool’s**: of the asset’s AMM pools with activity in the bin, the one holding the most of the asset at the bin’s open, with at least `min_liq` USD of depth and a USD close within `max_dev` of the asset’s routed price. `volume_usd` sums the traded amount over all of the asset’s AMM pools.\n\n| Parameter | Notes |\n| --- | --- |\n| `asset`, `from`, `to` | Required. `from` is floored to its bin; `to` is rounded up to the end of its bin and clamped to the indexed tip |\n| `interval` | `1h` (default), `2h`, `4h`, `6h`, `8h`, `12h`, `1d` or `1w` |\n| `min_liq` | Minimum main-pool depth in USD at the bin’s open, default 50 |\n| `max_dev` | Maximum deviation of the main pool’s USD close from the routed price, default 0.2 |\n\nBins without a candle are left out. The bin still open at the tip is included with `partial: true` and changes until it closes. `pool_switch: true` marks a candle whose main pool differs from the previous one. A close can differ slightly from `/v1/prices/history`, which is a routed price over all pools. A range with no candle answers `404` and isn’t charged.\n\nThe shape of a response (illustrative values):\n\n```json\n{\n  \"asset\": { \"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6 },\n  \"quote\": \"usd\",\n  \"interval\": \"1d\",\n  \"interval_seconds\": 86400,\n  \"from\": \"2026-11-01T00:00:00Z\",\n  \"to\": \"2026-11-03T00:00:00Z\",\n  \"candles\": [\n    {\n      \"ts\": \"2026-11-01T00:00:00Z\",\n      \"open\": 0.0951, \"high\": 0.0968, \"low\": 0.0933, \"close\": 0.0942,\n      \"volume_usd\": 412000, \"liquidity_usd\": 610000,\n      \"swaps\": 9800, \"events\": 10400, \"pools\": 9,\n      \"pool\": { \"venue\": \"tinyman2\", \"pool_id\": 1002590888, \"pair_asset\": 31566704 },\n      \"pool_switch\": false\n    }\n  ]\n}\n```"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"`GET /v1/prices/account`","url":"https://nodely.io/docs/x402/prices/","text":"The total value of an Algorand account at the chain tip, in USD and ALGO, across its wallet, DeFi and staking positions. It costs **0.002 USDC per call**.\n\n| Parameter | Notes |\n| --- | --- |\n| `address` | Required, a 58-character Algorand address |\n| `min_liq`, `max_hops`, `stale_days`, `max_dev` | As for `price` |\n\nWhat is counted:\n\n-   **Wallet:** the ALGO balance (including the minimum balance) and every ASA except single-unit NFTs.\n-   **Liquidity:** LP tokens of Tinyman v1 and V2, Pact, Pact StableSwap, Pact weighted, NanoSwap, Humble, LiquiHog and Algofi pools, as the account’s share of the pool reserves (pools without recent trades included).\n-   **Lending:** Folks Lending v2 and v1, Algofi v1 and v2, CompX, DorkFi and MagnetFi: deposits, collateral, and loans as debt with accrued interest (a loan’s net value is floored at 0).\n-   **Staking:** Pact farms, Algofi staking, Reti pools, the HAY staking box, Alpha-style stakes, TINY locked in the Tinyman governance vault (veTINY), Tinyman Staked tALGO; tALGO, xALGO and Myth dualSTAKE tokens at what their contract pays on redemption now. Unclaimed rewards are counted and shown in `rewards_usd`.\n-   **Other:** PEX positions, Alpha Arcade outcome shares, Vestige token locks, Tinyman v2 order escrows, the ARC-59 inbox and Tinyman v1 redeemable excess.\n\nEvery amount is priced by the same routed DEX prices as `/v1/prices/price`. In the response:\n\n-   `total_usd` is `assets_usd - debt_usd`; `total_algo` is the same in ALGO.\n-   `total_liquid_usd` nets each asset across positions and caps it at the asset’s routed liquidity, which is what a sale could realize. `over_liquidity` lists the assets it caps.\n-   `by_protocol_usd` and `by_kind_usd` (balance, liquidity, deposit, loan, stake, …) break the total down.\n-   `positions` lists every position: protocol, kind, value, the app and escrow account holding it, and each asset leg with amount, price and liquidity.\n-   `unpriced` lists assets without a route, which are left out of the totals. `unvalued` lists positions found but not decodable, and `not_checked` lists sources that could not be read.\n\nAn address never seen on chain answers `404` and isn’t charged.\n\nAn example answer for `H3A7GQA62RWHF2B7M7VOB3WFEZXCTL63J56SFITK7PAJ6OWLCCQYVR6UTI`, an account with positions in 16 protocols, among them a DorkFi loan (debt and collateral, the tALGO collateral valued at its burn rate), LP in four venues, farm and staking rewards, a veTINY lock, a Tinyman order and an ARC-59 inbox. The live answer has 76 positions; this one keeps the largest of each protocol and kind, at most two asset legs each, and one entry of each list:\n\n```json\n{\n  \"address\": \"H3A7GQA62RWHF2B7M7VOB3WFEZXCTL63J56SFITK7PAJ6OWLCCQYVR6UTI\",\n  \"round\": 66791198,\n  \"ts\": \"2026-11-09T13:14:14Z\",\n  \"total_usd\": 11117.1129,\n  \"total_algo\": 120584.5686,\n  \"total_liquid_usd\": 11108.1568,\n  \"over_liquidity\": [\n    {\"asset\": {\"id\": 2700230095, \"unit\": \"BURNS\", \"name\": \"Mr. Burns\", \"decimals\": 8}, \"usd\": 59.3352, \"liquidity_usd\": 50.3791}\n  ],\n  \"assets_usd\": 12542.9758,\n  \"debt_usd\": 1425.8629,\n  \"rewards_usd\": 4.4732,\n  \"algo_usd\": 0.0921935,\n  \"by_protocol_usd\": {\"arc59_inbox\": 0, \"backed_token\": 0.0132446, \"compx\": 0.405364, \"dorkfi\": 1289.9156, \"haystack\": 101.4902, \"liquihog\": 24.1925, \"pact\": 0.024473, \"pact_farm\": 4539.344, \"pactw\": 467.5531, \"staking\": 0.393108, \"tinyman2\": 2112.8725, \"tinyman_orders\": 2.1108, \"tinyman_stalgo\": 4.54214e-06, \"tinyman_vault\": 362.6134, \"vestige_lock\": 0.207689, \"wallet\": 2215.9769},\n  \"by_kind_usd\": {\"balance\": 2215.9769, \"claimable\": 0, \"deposit\": 0.405364, \"liquidity\": 2604.6426, \"loan\": 1289.9156, \"lock\": 362.8211, \"order\": 2.1108, \"receipt\": 0.0132446, \"stake\": 4641.2274},\n  \"algo\": {\"balance\": 323.225, \"min_balance\": 286.9045},\n  \"positions\": [\n    {\n      \"protocol\": \"wallet\",\n      \"kind\": \"balance\",\n      \"usd\": 2215.9769,\n      \"unpriced_legs\": 81,\n      \"assets\": [\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 323.225, \"price_usd\": 0.0921935, \"usd\": 29.7992, \"liquidity_usd\": 904023.8123},\n        {\"asset\": {\"id\": 2154668640, \"unit\": \"MOOJ\", \"name\": \"MoonJuiceRocketFuel\", \"decimals\": 8}, \"amount\": 485000.4958, \"price_usd\": 0.00205084, \"usd\": 994.6567, \"liquidity_usd\": 7696.1189}\n      ]\n    },\n    {\n      \"protocol\": \"pact_farm\",\n      \"kind\": \"stake\",\n      \"app\": 3744606182,\n      \"usd\": 2059.2378,\n      \"assets\": [\n        {\"asset\": {\"id\": 2994233666, \"unit\": \"POW\", \"name\": \"Power\", \"decimals\": 6}, \"amount\": 6500000, \"price_usd\": 0.000316799, \"usd\": 2059.1952, \"liquidity_usd\": 8566.4383},\n        {\"asset\": {\"id\": 2994233666, \"unit\": \"POW\", \"name\": \"Power\", \"decimals\": 6}, \"amount\": 134.5136, \"reward\": true, \"price_usd\": 0.000316799, \"usd\": 0.0426138, \"liquidity_usd\": 8566.4383}\n      ]\n    },\n    {\n      \"protocol\": \"dorkfi\",\n      \"kind\": \"loan\",\n      \"app\": 3333688282,\n      \"usd\": 1289.9156,\n      \"assets\": [\n        {\"asset\": {\"id\": 31566704, \"unit\": \"USDC\", \"name\": \"USDC\", \"decimals\": 6}, \"amount\": 1202.1183, \"debt\": true, \"price_usd\": 1, \"usd\": -1202.1183},\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 10314.9782, \"price_usd\": 0.0921935, \"usd\": 950.9739, \"liquidity_usd\": 904023.8123, \"via\": {\"lp_asset\": 2537013734, \"lp_amount\": 9359740975, \"venue\": \"talgo\", \"pool_id\": 2537013674, \"share\": 0.000292348}}\n      ]\n    },\n    {\n      \"protocol\": \"tinyman2\",\n      \"kind\": \"liquidity\",\n      \"usd\": 392.037,\n      \"assets\": [\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 2128.0853, \"price_usd\": 0.0921935, \"usd\": 196.1956, \"liquidity_usd\": 904023.8123, \"via\": {\"lp_asset\": 3760582745, \"lp_amount\": 5555180723, \"venue\": \"tinyman2\", \"pool_id\": 3760582745, \"share\": 0.83306}},\n        {\"asset\": {\"id\": 3760522314, \"unit\": \"STACKED\", \"name\": \"STACKED\", \"decimals\": 6}, \"amount\": 14712.6763, \"price_usd\": 0.0133111, \"usd\": 195.8414, \"liquidity_usd\": 1642.6592, \"via\": {\"lp_asset\": 3760582745, \"lp_amount\": 5555180723, \"venue\": \"tinyman2\", \"pool_id\": 3760582745, \"share\": 0.83306}}\n      ]\n    },\n    {\n      \"protocol\": \"tinyman_vault\",\n      \"kind\": \"lock\",\n      \"app\": 2200606875,\n      \"note\": \"locked until 2029-02-08\",\n      \"usd\": 362.6134,\n      \"assets\": [\n        {\"asset\": {\"id\": 2200000000, \"unit\": \"TINY\", \"name\": \"TINY\", \"decimals\": 6}, \"amount\": 569130.045, \"price_usd\": 0.000637136, \"usd\": 362.6134, \"liquidity_usd\": 35017.7533}\n      ]\n    },\n    {\n      \"protocol\": \"pactw\",\n      \"kind\": \"liquidity\",\n      \"app\": 3754618063,\n      \"usd\": 156.163,\n      \"assets\": [\n        {\"asset\": {\"id\": 3738683004, \"unit\": \"CRED\", \"name\": \"Colony Credit\", \"decimals\": 6}, \"amount\": 6341778.9625, \"price_usd\": 1.25023e-05, \"usd\": 79.287, \"liquidity_usd\": 3205.5329, \"via\": {\"lp_asset\": 3754618066, \"lp_amount\": 4446734080043, \"venue\": \"pactw\", \"pool_id\": 3754618063, \"share\": 1.0}},\n        {\"asset\": {\"id\": 3738669733, \"unit\": \"DUCAT\", \"name\": \"DUCAT\", \"decimals\": 6}, \"amount\": 3129029.2975, \"price_usd\": 2.45687e-05, \"usd\": 76.8761, \"liquidity_usd\": 6378.0442, \"via\": {\"lp_asset\": 3754618066, \"lp_amount\": 4446734080043, \"venue\": \"pactw\", \"pool_id\": 3754618063, \"share\": 1.0}}\n      ]\n    },\n    {\n      \"protocol\": \"haystack\",\n      \"kind\": \"stake\",\n      \"app\": 3321763884,\n      \"usd\": 101.4902,\n      \"assets\": [\n        {\"asset\": {\"id\": 3160000000, \"unit\": \"HAY\", \"name\": \"Haystack\", \"decimals\": 6}, \"amount\": 11999.2179, \"price_usd\": 0.00845663, \"usd\": 101.473, \"liquidity_usd\": 48854.5026},\n        {\"asset\": {\"id\": 31566704, \"unit\": \"USDC\", \"name\": \"USDC\", \"decimals\": 6}, \"amount\": 0.016538, \"reward\": true, \"price_usd\": 1, \"usd\": 0.016538}\n      ]\n    },\n    {\n      \"protocol\": \"liquihog\",\n      \"kind\": \"liquidity\",\n      \"app\": 3730769955,\n      \"usd\": 22.4902,\n      \"assets\": [\n        {\"asset\": {\"id\": 2700230095, \"unit\": \"BURNS\", \"name\": \"Mr. Burns\", \"decimals\": 8}, \"amount\": 599569.5186, \"price_usd\": 1.89953e-05, \"usd\": 11.389, \"liquidity_usd\": 50.3791, \"via\": {\"lp_asset\": 3730769968, \"lp_amount\": 16053064035714, \"venue\": \"liquihog\", \"pool_id\": 3730769955, \"share\": 1.0}},\n        {\"asset\": {\"id\": 3728317002, \"unit\": \"POVERTY\", \"name\": \"POVERTY\", \"decimals\": 6}, \"amount\": 4429484.9464, \"price_usd\": 2.50621e-06, \"usd\": 11.1012, \"liquidity_usd\": 1016.0335, \"via\": {\"lp_asset\": 3730769968, \"lp_amount\": 16053064035714, \"venue\": \"liquihog\", \"pool_id\": 3730769955, \"share\": 1.0}}\n      ]\n    },\n    {\n      \"protocol\": \"tinyman_orders\",\n      \"kind\": \"order\",\n      \"app\": 3150295170,\n      \"account\": \"DA6RBEPGWENG3TWXW66JCLQ5SEJCDYRFEMYJ7JLSZZVQG5C52GS3GYL6GQ\",\n      \"note\": \"open limit / recurring order funds\",\n      \"usd\": 2.1108,\n      \"assets\": [\n        {\"asset\": {\"id\": 31566704, \"unit\": \"USDC\", \"name\": \"USDC\", \"decimals\": 6}, \"amount\": 1.392, \"price_usd\": 1, \"usd\": 1.392},\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 7.7952, \"price_usd\": 0.0921935, \"usd\": 0.718667, \"liquidity_usd\": 904023.8123}\n      ]\n    },\n    {\n      \"protocol\": \"compx\",\n      \"kind\": \"deposit\",\n      \"app\": 3425976099,\n      \"note\": \"deposit receipt valued at the market's exchange rate\",\n      \"usd\": 0.405364,\n      \"assets\": [\n        {\"asset\": {\"id\": 2200000000, \"unit\": \"TINY\", \"name\": \"TINY\", \"decimals\": 6}, \"amount\": 636.2285, \"price_usd\": 0.000637136, \"usd\": 0.405364, \"liquidity_usd\": 35017.7533, \"via\": {\"lp_asset\": 3310764958, \"lp_amount\": 634138461, \"venue\": \"compx\", \"pool_id\": 3425976099, \"share\": 0.00244582}}\n      ]\n    },\n    {\n      \"protocol\": \"staking\",\n      \"kind\": \"stake\",\n      \"app\": 3626756314,\n      \"usd\": 0.393108,\n      \"assets\": [\n        {\"asset\": {\"id\": 31566704, \"unit\": \"USDC\", \"name\": \"USDC\", \"decimals\": 6}, \"amount\": 0.393108, \"reward\": true, \"price_usd\": 1, \"usd\": 0.393108}\n      ]\n    },\n    {\n      \"protocol\": \"vestige_lock\",\n      \"kind\": \"lock\",\n      \"app\": 1128697057,\n      \"account\": \"KYHKUFNXJUJHZWVVILBPVBENFK7IUY24J7B6CXD3EMJLLDJCCIUKPIBA5M\",\n      \"note\": \"tokens locked or vesting in a Vestige lock\",\n      \"usd\": 0.207689,\n      \"assets\": [\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 2.2527, \"price_usd\": 0.0921935, \"usd\": 0.207689, \"liquidity_usd\": 904023.8123}\n      ]\n    },\n    {\n      \"protocol\": \"pact\",\n      \"kind\": \"liquidity\",\n      \"app\": 2614663940,\n      \"usd\": 0.024473,\n      \"assets\": [\n        {\"asset\": {\"id\": 2154668640, \"unit\": \"MOOJ\", \"name\": \"MoonJuiceRocketFuel\", \"decimals\": 8}, \"amount\": 6.3003, \"price_usd\": 0.00205084, \"usd\": 0.012921, \"liquidity_usd\": 7696.1189, \"via\": {\"lp_asset\": 2614663946, \"lp_amount\": 6172458490, \"venue\": \"pact\", \"pool_id\": 2614663940, \"share\": 1}},\n        {\"asset\": {\"id\": 2614577662, \"unit\": \"ATARD\", \"name\": \"ALGOTARDIO\", \"decimals\": 6}, \"amount\": 72481.8881, \"price_usd\": 1.59378e-07, \"usd\": 0.011552, \"liquidity_usd\": 7210.5784, \"via\": {\"lp_asset\": 2614663946, \"lp_amount\": 6172458490, \"venue\": \"pact\", \"pool_id\": 2614663940, \"share\": 1}}\n      ]\n    },\n    {\n      \"protocol\": \"backed_token\",\n      \"kind\": \"receipt\",\n      \"app\": 3338877570,\n      \"note\": \"valued as the issuing contract's holdings / circulating supply\",\n      \"usd\": 0.0132346,\n      \"assets\": [\n        {\"asset\": {\"id\": 0, \"unit\": \"ALGO\", \"name\": \"Algorand\", \"decimals\": 6}, \"amount\": 0.143552, \"price_usd\": 0.0921935, \"usd\": 0.0132346, \"liquidity_usd\": 904023.8123, \"via\": {\"lp_asset\": 3338881950, \"lp_amount\": 1, \"venue\": \"backing\", \"pool_id\": 3338877570, \"share\": 0.000891266}}\n      ]\n    },\n    {\n      \"protocol\": \"tinyman_stalgo\",\n      \"kind\": \"stake\",\n      \"app\": 2537022861,\n      \"note\": \"staked tALGO (decrease_stake returns it 1:1) plus unclaimed TINY rewards; claiming needs veTINY power >= 5,000\",\n      \"usd\": 4.54214e-06,\n      \"assets\": [\n        {\"asset\": {\"id\": 2200000000, \"unit\": \"TINY\", \"name\": \"TINY\", \"decimals\": 6}, \"amount\": 0.007129, \"reward\": true, \"price_usd\": 0.000637136, \"usd\": 4.54214e-06, \"liquidity_usd\": 35017.7533}\n      ]\n    },\n    {\n      \"protocol\": \"arc59_inbox\",\n      \"kind\": \"claimable\",\n      \"app\": 2449590623,\n      \"account\": \"VRKYZKT7ZAF3NXHPXNIWXRAAIKRWV6VCGBH6XWKJXFEMIVEPYWDJ5PJMFA\",\n      \"note\": \"assets waiting in the ARC-59 inbox, claimable by the account\",\n      \"usd\": 0,\n      \"unpriced_legs\": 2,\n      \"assets\": [\n        {\"asset\": {\"id\": 3292986008, \"unit\": \"ALGNVCHR\", \"name\": \"Gift Allocation\", \"decimals\": 0}, \"amount\": 1, \"price_usd\": null, \"usd\": null},\n        {\"asset\": {\"id\": 3612111137, \"unit\": \"MKV\", \"name\": \"Moon Kitten V3\", \"decimals\": 6}, \"amount\": 10000, \"price_usd\": null, \"usd\": null}\n      ]\n    }\n  ],\n  \"unpriced\": [\n    {\"asset\": {\"id\": 3179991867, \"unit\": \"justtard\", \"name\": \"Just a Atardio\", \"decimals\": 0}, \"amount\": 1, \"protocol\": \"wallet\"}\n  ],\n  \"nfts\": 714,\n  \"unvalued\": [\n    {\"protocol\": \"compx\", \"app\": 2400334372, \"reason\": \"CompX gen1 cToken or cAlgo: market wound down 2026-01-30 (contract_state 2, cash removed) or unbacked; not redeemable\", \"raw_amount\": 1}\n  ],\n  \"not_checked\": []\n}\n```"}
{"id":"/docs/x402/prices/","title":"x402 Algorand DEX prices and account value API","markdownUrl":"https://nodely.io/docs/x402/prices.md","heading":"Example","url":"https://nodely.io/docs/x402/prices/#example","text":"Using the Algorand paid fetch client from [Pricing & payment](https://nodely.io/docs/x402/payment#algorand-client):\n\n```js\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/prices/price?asset=algo&ts=2026-10-01\");\nconsole.log(await res.json());\n\nconst acct = await paidFetch(\"https://x402.api.nodely.io/v1/prices/account?address=H3A7GQA62RWHF2B7M7VOB3WFEZXCTL63J56SFITK7PAJ6OWLCCQYVR6UTI\");\nconsole.log((await acct.json()).total_usd);\n```\n\nFree routes in this namespace:\n\n-   [`/v1/prices/pricing`](https://x402.api.nodely.io/v1/prices/pricing)\n-   [`/v1/prices/health`](https://x402.api.nodely.io/v1/prices/health)\n-   [`/v1/prices/status`](https://x402.api.nodely.io/v1/prices/status), which shows how far the dataset is built\n-   [`/v1/prices/openapi.json`](https://x402.api.nodely.io/v1/prices/openapi.json)"}
{"id":"/docs/x402/scrape/","title":"x402 page scrape API","markdownUrl":"https://nodely.io/docs/x402/scrape.md","heading":"x402 page scrape API","url":"https://nodely.io/docs/x402/scrape/","text":"This API fetches one web page and returns its content as markdown, HTML or a list of links. It renders the page in a headless browser when the page needs one. It costs **0.011 USDC per page** on Algorand and **0.012 USDC** on Base or Arc, paid with [x402](https://nodely.io/docs/x402/payment).\n\n-   Endpoint: `POST https://x402.api.nodely.io/v1/scrape`. `GET` with query parameters also works; separate list values with commas.\n-   One public `http(s)` URL per call.\n-   A page that fails, times out or answers with HTTP 4xx/5xx isn’t charged."}
{"id":"/docs/x402/scrape/","title":"x402 page scrape API","markdownUrl":"https://nodely.io/docs/x402/scrape.md","heading":"Request","url":"https://nodely.io/docs/x402/scrape/#request","text":"Field names follow Firecrawl v2. The API accepts both camelCase and snake\\_case names.\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `url` | string, up to 2048 chars | Required. Must be `http` or `https` with a public DNS name |\n| `formats` | array of `markdown`, `html`, `rawHtml`, `links` | Default `[\"markdown\"]` |\n| `only_main_content` | boolean, default true | Removes navigation, headers and footers. Alias: `onlyMainContent` |\n| `include_tags`, `exclude_tags` | string array, up to 50 | Alias: `includeTags`, `excludeTags` |\n| `wait_for` | integer ms, 0–10000 | Wait after the page loads. At most half the timeout. Alias: `waitFor` |\n| `mobile` | boolean, default false | Render as a mobile browser |\n| `timeout` | integer ms | At most 20 s, limited by the payment’s validity window |\n\n```json\n{ \"url\": \"https://example.org/\", \"formats\": [\"markdown\", \"links\"] }\n```\n\nThe API refuses these URLs with `400` before you pay anything:\n\n-   URLs with credentials\n-   IP addresses instead of host names\n-   private names such as `localhost`, `*.local`, `*.internal`, `*.lan` and single-label hosts"}
{"id":"/docs/x402/scrape/","title":"x402 page scrape API","markdownUrl":"https://nodely.io/docs/x402/scrape.md","heading":"Response","url":"https://nodely.io/docs/x402/scrape/#response","text":"```json\n{\n  \"url\": \"https://example.org/\",\n  \"data\": {\n    \"markdown\": \"# Example Domain\\n\\nThis domain is for use in documentation examples.\",\n    \"links\": [\"https://www.iana.org/domains/example\"],\n    \"metadata\": {\n      \"title\": \"Example Domain\",\n      \"sourceURL\": \"https://example.org/\",\n      \"url\": \"https://example.org/\",\n      \"statusCode\": 200,\n      \"contentType\": \"text/html\"\n    }\n  },\n  \"warnings\": [],\n  \"request_id\": \"…\",\n  \"response_time\": 1.7\n}\n```\n\n`data` follows Firecrawl v2’s scrape data format. The `PAYMENT-RESPONSE` header confirms the payment; on Algorand it holds the payment’s transaction id."}
{"id":"/docs/x402/scrape/","title":"x402 page scrape API","markdownUrl":"https://nodely.io/docs/x402/scrape.md","heading":"Limits and charging","url":"https://nodely.io/docs/x402/scrape/#limits-and-charging","text":"-   The scrape must finish while the payment is still valid. The deadline is whatever time the payment’s validity window has left, up to 20 s.\n-   On Algorand, if the window has less than 3 s left, the API refuses the request with `402 invalid_exact_avm_validity_window` and fetches nothing.\n-   The API charges only when it delivers the page and the page answered with a status below 400.\n-   A failed scrape (`502 scrape_failed`) or a timeout (`504 scrape_timeout`) isn’t charged. You can retry it with the same payment a limited number of times."}
{"id":"/docs/x402/scrape/","title":"x402 page scrape API","markdownUrl":"https://nodely.io/docs/x402/scrape.md","heading":"Examples","url":"https://nodely.io/docs/x402/scrape/#examples","text":"Show the 402 offer without paying:\n\n```bash\ncurl -si -X POST https://x402.api.nodely.io/v1/scrape \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\":\"https://example.org/\"}'\n```\n\nPaid request with the Node.js client from [Pricing & payment](https://nodely.io/docs/x402/payment#client-example-nodejs):\n\n```js\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/scrape\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ url: \"https://example.org/\", formats: [\"markdown\"] }),\n});\nconst { data } = await res.json();\nconsole.log(data.markdown);\n```\n\nThe full schema is in the [live API reference](https://x402.api.nodely.io/docs/)."}
{"id":"/docs/x402/search/","title":"x402 web search API","markdownUrl":"https://nodely.io/docs/x402/search.md","heading":"x402 web search API","url":"https://nodely.io/docs/x402/search/","text":"This API sends one query to several search engines, merges the results and ranks them. It costs **0.0085 USDC per query** on Algorand and **0.009 USDC** on Base or Arc, paid with [x402](https://nodely.io/docs/x402/payment).\n\n-   Endpoint: `POST https://x402.api.nodely.io/v1/search`. `GET` with query parameters also works; separate list values with commas.\n-   Engines: several independent web search engines, named by Greek letters (`alpha`, `gamma`, …); `topic: news` uses separate news engines. [`/v1/search/pricing`](https://x402.api.nodely.io/v1/search/pricing) lists the current names (`engines`, `news_engines`).\n-   A search where no engine returns anything isn’t charged."}
{"id":"/docs/x402/search/","title":"x402 web search API","markdownUrl":"https://nodely.io/docs/x402/search.md","heading":"Request","url":"https://nodely.io/docs/x402/search/#request","text":"Field names follow Tavily. The API also accepts the field names used by Exa, You.com, Perplexity, Brave, Serper and Linkup, so an existing client usually works unchanged.\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `query` | string, 1–400 chars | Required. Alias: `q` |\n| `max_results` | integer 1–50, default 10 | Aliases: `count`, `num_results`, `numResults`, `maxResults`, `limit`, `num` |\n| `page` | integer 1–10, default 1 |  |\n| `time_range` | `day` / `week` / `month` / `year` | Aliases: `freshness`, `search_recency_filter` |\n| `start_date`, `end_date` | date (`YYYY-MM-DD`) |  |\n| `include_domains`, `exclude_domains` | string array |  |\n| `language` | string | e.g. `en`, `en-US` |\n| `country` | string | ISO 3166-1 alpha-2 |\n| `safesearch` | `off` / `moderate` / `strict` (or `0` / `1` / `2`) |  |\n| `topic` | `general` / `news`, default `general` |  |\n| `engines` | array of engine names from `/v1/search/pricing` | Limits the search to these engines. Unknown names are ignored with a warning; 400 if none is left |\n| `include_answer` | boolean, default false |  |\n| `stream` | boolean, default false | See [Streaming](https://nodely.io/docs/x402/search/#streaming) |\n\n```json\n{ \"query\": \"algorand x402\", \"max_results\": 5, \"time_range\": \"month\" }\n```"}
{"id":"/docs/x402/search/","title":"x402 web search API","markdownUrl":"https://nodely.io/docs/x402/search.md","heading":"Response","url":"https://nodely.io/docs/x402/search/#response","text":"```json\n{\n  \"query\": \"algorand x402\",\n  \"results\": [\n    {\n      \"title\": \"…\",\n      \"url\": \"https://…\",\n      \"content\": \"…\",\n      \"score\": 0.92,\n      \"published_date\": \"2026-10-01\",\n      \"engines\": [\"alpha\", \"gamma\"],\n      \"position\": 1\n    }\n  ],\n  \"answer\": null,\n  \"suggestions\": [],\n  \"engines\": [{ \"name\": \"gamma\", \"results\": 10, \"elapsed_s\": 0.8 }],\n  \"response_time\": 1.4,\n  \"request_id\": \"…\",\n  \"warnings\": []\n}\n```\n\n-   `score` is between 0 and 1.\n-   `engines` on each result lists the engines that returned it.\n-   The top-level `engines` reports each engine’s result count, error (`timeout`, `blocked`, `suspended` or `unavailable`) and timing.\n-   `thumbnail`, when present, is an image hosted by the result’s own site.\n\nThe `PAYMENT-RESPONSE` header confirms the payment; on Algorand it holds the payment’s transaction id."}
{"id":"/docs/x402/search/","title":"x402 web search API","markdownUrl":"https://nodely.io/docs/x402/search.md","heading":"Streaming","url":"https://nodely.io/docs/x402/search/#streaming","text":"Send `Accept: application/x-ndjson` for newline-delimited JSON, or `Accept: text/event-stream` for server-sent events. Each engine’s results arrive as soon as that engine answers.\n\nThe stream sends events in this order:\n\n-   `meta`\n-   `results`: one per engine, with only results not already sent\n-   `engine_error`: when an engine fails\n-   `done` or `error`\n\nThe `done` event carries the full response shown above, and the request is charged. A stream that ends with `error` isn’t charged."}
{"id":"/docs/x402/search/","title":"x402 web search API","markdownUrl":"https://nodely.io/docs/x402/search.md","heading":"Examples","url":"https://nodely.io/docs/x402/search/#examples","text":"Show the 402 offer without paying:\n\n```bash\ncurl -si -X POST https://x402.api.nodely.io/v1/search \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":\"x402\"}'\n```\n\nPaid request with the Node.js client from [Pricing & payment](https://nodely.io/docs/x402/payment#client-example-nodejs):\n\n```js\nconst res = await paidFetch(\"https://x402.api.nodely.io/v1/search\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n  body: JSON.stringify({ query: \"algorand news\", topic: \"news\", time_range: \"week\" }),\n});\n```\n\nThe full schema is in the [live API reference](https://x402.api.nodely.io/docs/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Frequently Asked Questions","url":"https://nodely.io/faq/","text":"Let's see if we manage to answer your questions on Nodely and Algorand"}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Can our project just use the free endpoints?","url":"https://nodely.io/faq/","text":"Sure, as long as you are happy with our Fair Usage Policy! (See below)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"What kind of projects use the free endpoints?","url":"https://nodely.io/faq/","text":"We have users that are :\n\n-   NFT teams\n-   DeFi\n-   GameFi\n-   Asset/NFT management\n-   R&D individuals\n\n  \nNodely helps projects of all sizes - from 0 total users to thousands of daily active users."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"How does fair usage policy work?","url":"https://nodely.io/faq/","text":"You can get for free:\n\n-   30 requests per second, 10 concurrent calls and 18 transaction POSTs per second per source IP address; 5 requests per second for bot traffic (no browser Referer)\n-   128k requests or 2 GB worth of responses per IP address and per site, per UTC day\n-   1000 requests per second per site\n\n  \nDetails: [fair usage policy](https://nodely.io/docs/free/policy/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"What happens if I do not respect limits?","url":"https://nodely.io/faq/","text":"Over a per-second or concurrency limit the API returns 429. As an IP address or a site nears its daily quota, a growing share of its requests gets 403 \"Daily free API quota exceeded\", and all of them do once the quota is used up, until 00:00 UTC. We reserve the right to blacklist back-end requests if they are too heavy.  \n  \nTo avoid getting your server based or serverless solution blacklisted, use the following strategies: stay within the daily quota; **respect the 429 rate limit** error and **use exponential backoff** before retrying; do not query for the same immutable data multiple times - cache the results and ask for fresh data (use min-round param); Repeatedly requesting with min-round=0 or 1 will get you banned; Do not make hundreds of identical requests from multiple servers/ip addresses in the same round; get yourself a rate limiting http client or library; do not generate more than 10 concurrent requests; do not generate more than 2 concurrent requests for blocks; do not generate more than 1 concurrent paginating request (with next=) ."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Does backend traffic count towards soft/hard limits?","url":"https://nodely.io/faq/","text":"Yes. Backend and bot traffic (requests without a browser Referer or Origin) also has its own limit on the free tier: 5 requests per second per IP. Other limits still apply - GB quota, concurrent calls, etc."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Do we need to contact Nodely before we go live?","url":"https://nodely.io/faq/","text":"Nope. While not strictly needed it just pays of to give us a heads-up. We’ll gladly help you (free of charge) to make a successful transition to the **mainnet**. We can monitor the public dashboard during the launch so that you can focus on your own backend. If you are a huge success and our limits negatively impact the experience we can issue you temporary tokens that **boost the limits tenfold**."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"There are paid options - do we need them?","url":"https://nodely.io/faq/","text":"The primary goal of Nodely is to help teams run their own API infrastructure. Until that happens teams decide on the paid packages when:  \n  \n\n-   they need their own API token and usage analytics, within a daily quota of 256k requests and 4 GB (Boost, $32/month excl. VAT).\n-   they need no daily quota and low-latency commercial endpoints with no added latency (Unlimited, $256/month excl. VAT).\n-   they need a guarantee (SLA) and a real phone number to call in case something breaks.\n-   they would like to hide the API call logs from the public dashboard\n-   they need dedicated resources that have known performance characteristics\n-   they need endpoints located physically next to their back-end\n\n  \nBut mostly because Nodely has helped them become profitable and now they can afford it 🎉"}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Custom endpoints?","url":"https://nodely.io/faq/","text":"Our team hates vendor lock-in and one way to prevent this is to focus on vanilla API. Our API might be faster and less resource intensive but all the patches and designs are made public.  \n  \nThat’s why **we offer endpoints with extra functionalities** but we dedicate them only to commercial customers, and we charge them an arm a and a leg. Still interested? Contact us Some examples of custom endpoints: Endpoints that are depreciated elsewhere; Streaming endpoints to avoid polling (new blocks, filtered TXNs); Analytical endpoints; FTLBlock™ endpoints (for arbitrage bots)"}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"What is the difference between Boost and Unlimited?","url":"https://nodely.io/faq/","text":"**Boost** ($32/month, monthly only) gives one endpoint 256k requests and 4 GB per UTC day (more in blocks of 256k requests and 4 GB a day for $32/month), 120 req/s per client IP, split across the region's edges, 50 ms or more of added latency on backend and bot requests, a 99.5 % SLO on the Algorand endpoints, the public nodely.dev hosts, one user per account, API tokens or whitelisted sites and 7-day usage analytics, plus the IPFS gateway for 1 verified site. **Unlimited** ($256/month, or $212/month billed annually) has no daily quota and no added latency, 600 req/s per client IP, split across the region's edges, the commercial nodely.io hosts, a 99.99 % SLO on Algorand, 3 endpoints, IP whitelisting, admin and viewer roles, a 24-hour support response target, R&D support and the IPFS gateway for any CID (5 sites per organization). **Enterprise** (from $512/month) has everything in Unlimited with no API rate limits and a 4-hour support response target. Boost, Unlimited and Enterprise include Ethereum, Base and Arc and time travel on mainnet. Prices are net: + 23 % VAT for buyers in Poland and EU consumers; no VAT for EU businesses with a valid VAT ID (reverse charge) and outside the EU. See [pricing](https://nodely.io/pricing)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"How do I get an API token?","url":"https://nodely.io/faq/","text":"[Sign up in the Nodely portal](https://portal.nodely.io/register). An organization admin picks a plan on the Billing page, then creates an endpoint and adds tokens and whitelisted sites (and, on Unlimited and Enterprise, IPs) to it. See [API access and plans](https://nodely.io/docs/access/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"How do I send the token?","url":"https://nodely.io/faq/","text":"In one of the `X-Algo-API-Token`, `X-Indexer-API-Token` or `X-API-Key` headers. The Algorand SDKs send the first two for you when you pass the token to the algod or indexer client. See [authentication](https://nodely.io/docs/access/authentication/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"How do browser apps authenticate without exposing a token?","url":"https://nodely.io/faq/","text":"Whitelist your site in the portal and verify the domain with a DNS TXT record or a file on the site. Browser requests are then recognised by their `Referer` header, so make sure your pages do not use `Referrer-Policy: no-referrer`."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"When do daily quotas reset, and what happens at the limit?","url":"https://nodely.io/faq/","text":"Quotas count per UTC day and reset at 00:00 UTC. The free tier answers 403 \"Daily free API quota exceeded\". A Boost endpoint gets an `X-And-Quota` header and an email from 80 %, then a 429 with a JSON body (\"Daily Boost quota exceeded\") until the reset, unless an admin adds an overage block (Extra 256k requests and 4 GB a day) or upgrades. See [quotas and rate limits](https://nodely.io/docs/access/limits/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Who can upgrade or change billing?","url":"https://nodely.io/faq/","text":"Organization admins: they start a subscription, add add-ons and open the Stripe billing portal. Boost has one user per account. On Unlimited and Enterprise, admins manage endpoints, tokens, sites and IPs, and viewers see them read-only."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Can my app load content from the IPFS gateway?","url":"https://nodely.io/faq/","text":"Yes, once your site is whitelisted. On Unlimited and Enterprise, sites verified in the portal are whitelisted automatically and can load any CID (5 sites per organization; public goods 1). Boost includes 1 verified site whitelisted automatically; extra sites $2 / month each. Free: 1 verified site authorized in the portal, within the free daily quota, with no endpoint or token. See [IPFS gateway access](https://nodely.io/docs/access/authentication/#ipfs-gateway)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"How fast does support answer?","url":"https://nodely.io/faq/","text":"Enterprise: first response within 4 hours. Unlimited: first response within 24 hours. Boost and the free tier: best effort. Public goods projects: the [community channels](https://discord.gg/AnH2s9dMkN), tickets best effort. Response targets count calendar hours, weekends and holidays included. Email [support@nodely.io](mailto:support@nodely.io). See [support](https://nodely.io/docs/access/support/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Can I query Algorand state at a past round?","url":"https://nodely.io/faq/","text":"Yes, with time travel: `?round=` on account, asset, app and box endpoints, the versions API and simulate at a past round. Testnet is open to everyone; mainnet needs a Boost, Unlimited or Enterprise plan. See [time travel](https://nodely.io/docs/access/time-travel/)."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"What is Nodely?","url":"https://nodely.io/faq/","text":"We are a self-funded team with the aim of providing the best native, globally distributed, low latency Algorand API service."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"What’s the difference between Nodely and Algonode?","url":"https://nodely.io/faq/","text":"There's no difference! Algonode has become Nodely, but we are the same team of of SREs that has been helping Algorand projects of all sizes become profitable. We offer the same services with ths same conditions."}
{"id":"/faq/","title":"Frequently Asked Questions","markdownUrl":"https://nodely.io/faq.md","heading":"Who are your investors?","url":"https://nodely.io/faq/","text":"We have no investors. The team pays all the bills."}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Enterprise Algorand & Post-Quantum Infrastructure","url":"https://nodely.io/","text":"[**Click for use case**Traffic enforcement  \non a hybrid network](https://nodely.io/#use-case)\n\nENTERPRISE ALGORAND INFRASTRUCTURE"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Your network.  ","url":"https://nodely.io/","text":"Your control.  \nReady for what’s next.\n\nBuild your future on Algorand. Private and hybrid networks, enterprise infrastructure, and a clear path to post-quantum readiness.\n\n[Discuss your deployment ↗](https://nodely.io/contact)[Explore network options ↓](https://nodely.io/#networks)\n\nPrivate by designOpen-source foundationsExpert operations\n\nSUPPORTING BUILDERS ACROSS THE ALGORAND ECOSYSTEM\n\n[![GoPlausible](https://nodely.io/_astro/goplausible.KYgeTvpK_Z1RbrWJ.webp)](https://goplausible.com/)[![Folks Finance](https://nodely.io/_astro/folks-finance.B6yk7k05_ZSixbY.webp)](https://folks.finance/)[![HesabPay](https://nodely.io/_astro/hesabpay.CASgc6J-_1OvU08.webp)](https://hesab.com/)[![agrotoken](https://nodely.io/_astro/agrotoken.Dp_-LGAU_ZuPgjO.webp)](https://www.agrotoken.com/)[![Algorand Foundation](https://nodely.io/_astro/af.C3m6ADlm_1Ozvl.webp)](https://algorand.foundation/)[![Pera Wallet](https://nodely.io/_astro/pera.D2ZC4gUo_1aczRY.webp)](https://perawallet.app/)\n\n01 / PROTOCOLS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Public chains.  ","url":"https://nodely.io/","text":"Production-grade nodes.\n\nStart on free public endpoints. Move to commercial, dedicated or whitelabel service when you scale.\n\nAVM CHAINS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Algorand","url":"https://nodely.io/","text":"Archival node and indexer APIs for Algorand mainnet, testnet and betanet, plus Voi. Free public endpoints, Boost and Unlimited plans, and dedicated clusters.\n\n`mainnet-api.4160.nodely.dev`[Algorand docs↗](https://nodely.io/docs/free/start)\n\nETHEREUM L2"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Base","url":"https://nodely.io/","text":"JSON-RPC and WebSocket for Base mainnet with Flashblocks pending state, from our own nodes in Finland and Germany with automatic failover. Recent data, no keys.\n\n`base.nodely.dev`[Base docs↗](https://nodely.io/docs/base)\n\nFOR RPC BRANDS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Whitelabel RPC","url":"https://nodely.io/","text":"Sell RPC under your brand on our nodes. Unlimited requests for a flat monthly fee, on your own domain.\n\n`rpc.your-brand.com`[Whitelabel details↗](https://nodely.io/docs/whitelabel)\n\n02 / NETWORKS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"The right architecture.  ","url":"https://nodely.io/","text":"On your terms.\n\nStart with your business requirements. Choose the level of control, connectivity, and operational support your network needs.\n\n01\n\nCONTROL YOUR ENVIRONMENT"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Private networks","url":"https://nodely.io/","text":"A dedicated Algorand network with participation and access defined by your organization. Build around your data, governance, and operational requirements.\n\n-   ↗Permissioned participation\n-   ↗Dedicated nodes, APIs & explorer\n-   ↗Deployment tailored to your organization\n\n[Discuss a private network↗](https://nodely.io/contact)\n\n02\n\nCONNECT ON YOUR TERMS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Hybrid networks","url":"https://nodely.io/","text":"Combine a private operating environment with selected public-network interactions. Define what stays internal, what is shared, and how systems connect.\n\n-   ↗Private and public network architecture\n-   ↗Explicit data and integration boundaries\n-   ↗Managed or jointly operated infrastructure\n\n[Explore a hybrid architecture↗](https://nodely.io/contact)\n\n03\n\nBUILD ON ALGORAND"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Public infrastructure","url":"https://nodely.io/","text":"Bring applications to the public Algorand network with managed node APIs, indexers, and data services backed by experienced infrastructure engineers.\n\n-   ↗Dedicated API & indexer services\n-   ↗SQL access & blockchain analytics\n-   ↗Public endpoints to get started\n\n[Explore infrastructure plans↗](https://nodely.io/pricing)\n\n03 / IN PRACTICE\n\n**Government**"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Public services.  ","url":"https://nodely.io/","text":"Private data.  \nVerifiable by everyone.\n\nTraffic enforcement on a hybrid Algorand network. Evidence and personal data stay on a sovereign private chain, while citizens verify and settle fines on the public network.\n\n-   ↗Sovereign private chain for evidence and personal data\n-   ↗Smart-contract fine issuance with a full audit trail\n-   ↗One-way, encrypted proofs to the public network\n-   ↗Instant stablecoin settlement from standard wallets\n\n[Discuss a public-sector deployment ↗](https://nodely.io/contact)\n\nCASE STUDY · TRAFFIC ENFORCEMENTHYBRID\n\nA roadside camera records a vehicle at 87 km/h in a 60 zone.Evidence is fingerprinted and stored on the government’s own private chain, built for 50,000 events per second.A smart contract verifies the evidence and issues the fine. Every step is signed and auditable.Only an encrypted proof crosses a one-way bridge to the public network. Personal data never leaves.The driver verifies the evidence against the public chain and pays in stablecoin from a standard wallet.One platform for many public services, each running on its own sovereign chain.\n\nAnimated example of a hybrid government network: A roadside camera records a vehicle at 87 km/h in a 60 zone. Evidence is fingerprinted and stored on the government’s own private chain, built for 50,000 events per second. A smart contract verifies the evidence and issues the fine. Every step is signed and auditable. Only an encrypted proof crosses a one-way bridge to the public network. Personal data never leaves. The driver verifies the evidence against the public chain and pays in stablecoin from a standard wallet. One platform for many public services, each running on its own sovereign chain.\n\n**Pharma supply chain**"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"One supply chain.  ","url":"https://nodely.io/","text":"Private terms.  \nEvery pack verifiable.\n\nEU FMD serialisation on a consortium Algorand network. Manufacturers, distributors, pharmacies and the regulator share one custody record, while patients verify packs on the public network.\n\n-   ↗Consortium chain run by the supply-chain members\n-   ↗Signed custody handovers with cold-chain readings\n-   ↗Per-pack authenticity proofs on public Algorand\n-   ↗Cloned serials caught at the point of scan\n\n[Discuss a consortium network ↗](https://nodely.io/contact)\n\nCASE STUDY · PHARMA SUPPLY CHAINCONSORTIUM\n\nEvery pack gets a unique EU FMD serial number at the factory.The batch is registered and signed on a chain shared by the whole supply network.Every handover is signed by both sides, with cold-chain readings. The regulator sees it live.Only a per-pack proof goes public. Commercial terms never leave the consortium.Patients verify any pack in seconds, and a cloned serial is caught the moment it is scanned again.Competitors share one source of truth without sharing their business.\n\nAnimated example of a pharmaceutical supply-chain consortium network: Every pack gets a unique EU FMD serial number at the factory. The batch is registered and signed on a chain shared by the whole supply network. Every handover is signed by both sides, with cold-chain readings. The regulator sees it live. Only a per-pack proof goes public. Commercial terms never leave the consortium. Patients verify any pack in seconds, and a cloned serial is caught the moment it is scanned again. Competitors share one source of truth without sharing their business.\n\n**Trade finance**"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Paperless trade.  ","url":"https://nodely.io/","text":"Private terms.  \nPaid while at sea.\n\nMLETR-compliant electronic bills of lading on a consortium Algorand network. Title, letters of credit and tokenised-deposit settlement stay between members, while a public document registry stops double financing.\n\n-   ↗Electronic bills of lading as unique title tokens\n-   ↗Letters of credit that settle atomically on presentation\n-   ↗Public document registry against double financing\n-   ↗Cargo released on arrival with no paperwork\n\n[Discuss a trade network ↗](https://nodely.io/contact)\n\nCASE STUDY · TRADE FINANCECONSORTIUM\n\nThe carrier issues an electronic bill of lading: a digital, MLETR-recognised title to the cargo.The importer’s bank opens a letter of credit as a smart contract, with tokenised deposits locked in escrow.Documents are checked automatically and paid in one atomic step, while the ship is still at sea.Only document fingerprints go public, so no invoice or title can be financed twice.On arrival, the importer surrenders the digital title and collects the cargo. No courier, no delay.A shared trade network where every document is unique and every payment is final.\n\nAnimated example of a trade-finance consortium network: The carrier issues an electronic bill of lading: a digital, MLETR-recognised title to the cargo. The importer’s bank opens a letter of credit as a smart contract, with tokenised deposits locked in escrow. Documents are checked automatically and paid in one atomic step, while the ship is still at sea. Only document fingerprints go public, so no invoice or title can be financed twice. On arrival, the importer surrenders the digital title and collects the cargo. No courier, no delay. A shared trade network where every document is unique and every payment is final.\n\n**ESG & energy**"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Green claims.  ","url":"https://nodely.io/","text":"Private data.  \nProvable by anyone.\n\nHourly EU Guarantees of Origin on a hybrid Algorand network. Meter data stays with producers and grid operators, while certificates are issued, traded and retired on the public network, ready for CSRD reporting.\n\n-   ↗Signed, grid-verified meter readings on a consortium chain\n-   ↗Hourly certificates for 24/7 clean-energy matching\n-   ↗Atomic stablecoin purchase of certificates\n-   ↗Public retirement that blocks double counting\n\n[Discuss an energy network ↗](https://nodely.io/contact)\n\nCASE STUDY · RENEWABLE ENERGY CERTIFICATESHYBRID\n\nA wind farm’s smart meters record every hour of clean generation.Each reading is signed by the producer and confirmed by the grid operator. Raw data stays private.Every verified hour becomes a unique EU Guarantee of Origin on the public network.A data centre buys certificates matched to the hours it actually used power, paid in stablecoin.Retired certificates can never be resold or claimed twice, and auditors verify in seconds.One trusted record from turbine to sustainability report.\n\nAnimated example of renewable energy certificates on a hybrid network: A wind farm’s smart meters record every hour of clean generation. Each reading is signed by the producer and confirmed by the grid operator. Raw data stays private. Every verified hour becomes a unique EU Guarantee of Origin on the public network. A data centre buys certificates matched to the hours it actually used power, paid in stablecoin. Retired certificates can never be resold or claimed twice, and auditors verify in seconds. One trusted record from turbine to sustainability report.\n\n04 / OPEN BY DESIGN"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"No lock-in.  ","url":"https://nodely.io/","text":"Open at every layer.  \nYours to keep.\n\nEvery component is open source, so your network runs with Nodely, in your own data centre or with any other operator. Software vendors add ledger features to the systems you already use through open SDKs, with no backend to build or run.\n\n-   ↗Open-source node, indexer, SDKs and explorer\n-   ↗Official SDKs for JS/TS, Python, Go and Java, plus community Rust, .NET and Swift\n-   ↗The same SDKs for private networks and permissionless public Algorand\n-   ↗\n    \n    [Bubls' by Allo](https://allo.info/chat): ask the ledger by voice or chat, then drag charts and tables onto dashboards. From chat to dashboard in hours.\n    \n\n[Talk to our engineers ↗](https://nodely.io/contact)\n\nPLATFORM · NO VENDOR LOCK-INOPEN SOURCE\n\nNo black boxes. Every layer of the stack is open source.Run it with us, on your own servers, or with any other operator. Your network moves with you.ISVs add ledger features to the software you already use, through open SDKs.No backend to build or run. The ledger is the shared, always-on record.Ask the ledger in plain language with Bubls' by Allo, then drag the answers onto a dashboard: hours, not months.Everything you build stays yours.\n\nAnimated overview of an open, lock-in-free platform: No black boxes. Every layer of the stack is open source. Run it with us, on your own servers, or with any other operator. Your network moves with you. ISVs add ledger features to the software you already use, through open SDKs. No backend to build or run. The ledger is the shared, always-on record. Ask the ledger in plain language with Bubls' by Allo, then drag the answers onto a dashboard: hours, not months. Everything you build stays yours.\n\n05 / POST-QUANTUM READINESS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Plan beyond  ","url":"https://nodely.io/","text":"today’s security.\n\nLong-lived assets need a long-term security strategy. Make post-quantum readiness part of your network architecture from the start.\n\n[Start a technical conversation ↗](https://nodely.io/contact)\n\n01"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"A foundation in post-quantum cryptography","url":"https://nodely.io/","text":"Algorand uses Falcon signatures for State Proofs and supports Falcon-based post-quantum accounts. Build on these capabilities with a deployment plan that fits your use case.\n\n02"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Readiness across your architecture","url":"https://nodely.io/","text":"Account signing is one part of the picture. Include key management, application dependencies, integrations, and network operations in your migration plan.\n\n03"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"A deliberate path to production","url":"https://nodely.io/","text":"Discuss protocol compatibility, deployment requirements, and an upgrade strategy with Nodely before moving critical workloads.\n\n[Explore Algorand’s post-quantum technology ↗](https://algorand.co/technology/post-quantum)\n\n06 / ENTERPRISE OPERATIONS"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"From architecture  ","url":"https://nodely.io/","text":"to everyday operations.\n\nWork with the team behind AlgoNode. Infrastructure expertise for the entire lifecycle of your Algorand deployment.\n\n01"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Dedicated infrastructure","url":"https://nodely.io/","text":"Node and indexer services sized for your workload, with deployment options aligned to your operating model.\n\n02"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Data that works with your systems","url":"https://nodely.io/","text":"Connect blockchain activity to existing applications, reporting, and analytics through APIs, SQL Direct, and data warehouse services.\n\n03"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Operational visibility","url":"https://nodely.io/","text":"Understand network health and service behavior with telemetry, monitoring, and access to experienced infrastructure engineers.\n\n04"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Open-source foundations","url":"https://nodely.io/","text":"Build on standard Algorand APIs and open-source tooling. Keep a clear path to operating your own infrastructure as your needs evolve.\n\nLET’S BUILD YOUR NEXT NETWORK"}
{"id":"/","title":"Enterprise Algorand & Post-Quantum Infrastructure","markdownUrl":"https://nodely.io/index.md","heading":"Enterprise requirements.  ","url":"https://nodely.io/","text":"An engineering conversation.\n\nTell us about your use case, operating environment, and timeline.  \nWe’ll help you define the next step.\n\n[Talk to our team ↗](https://nodely.io/contact)[sales@nodely.io](mailto:sales@nodely.io)\n\nBuilding on Algorand, Ethereum or Base?[Algorand free API ↗](https://nodely.io/docs/free/start)[Ethereum RPC ↗](https://nodely.io/docs/ethereum)[Base RPC ↗](https://nodely.io/docs/base)[Read the documentation ↗](https://nodely.io/docs)"}
{"id":"/ipfs-gateway/","title":"IPFS-Gateway","markdownUrl":"https://nodely.io/ipfs-gateway.md","heading":"IPFS-Gateway","url":"https://nodely.io/ipfs-gateway/","text":"![IPFS Gateway Hero Image](https://nodely.io/_astro/ipfs-gateway.CAO-SG5H_Z2d1k9q.webp)"}
{"id":"/ipfs-gateway/","title":"IPFS-Gateway","markdownUrl":"https://nodely.io/ipfs-gateway.md","heading":"Public Algorand IPFS gateway","url":"https://nodely.io/ipfs-gateway/","text":"Nodely provides free distributed IPFS for all Algorand mainnet assets.\n\nNOTE\n\nOnly whitelisted domains / IP addresses are allowed.  \nOnly image/video/audio/JSON public IPFS content is available.  \nFree: 1 verified site authorized in the portal, within the free daily quota.  \nBoost: 1 verified site whitelisted automatically; extra sites $2 / month each.  \nUnlimited and Enterprise: 5 verified sites per organization; public goods: 1.  \nIPFS pinning: Boost 100 MB / 25 files free plus add-ons, Unlimited 256 GB / 64,000 files included; IPFS pinning +1 TB add-on $16 / month (1.256 TB / 314,000 files in total), Enterprise 256 GB / 64,000 files included; +1 TB (1.256 TB / 314,000 files in total) on your contract: see [pricing](https://nodely.io/pricing#compare)."}
{"id":"/ipfs-gateway/","title":"IPFS-Gateway","markdownUrl":"https://nodely.io/ipfs-gateway.md","heading":"Example usage:","url":"https://nodely.io/ipfs-gateway/","text":"`[https://ipfs.algonode.xyz/ipfs/QmZUkUUGFvsFdRTKAJUA7QQhF411KdEyWY99vedxaXMHqo?optimizer=image&width=75](https://ipfs.algonode.xyz/ipfs/QmZUkUUGFvsFdRTKAJUA7QQhF411KdEyWY99vedxaXMHqo?optimizer=image&width=75)`"}
{"id":"/ipfs-gateway/","title":"IPFS-Gateway","markdownUrl":"https://nodely.io/ipfs-gateway.md","heading":"Limits:","url":"https://nodely.io/ipfs-gateway/","text":"-   100 rps per IP address.\n-   10 rps for IPFS objects not related to Algorand mainnet\n-   Bandwidth is not restricted but counts towards daily free API tier limit\n-   🚫 Executable, ZIP/TAR, PDF, HTML, JS content is restricted\n\n![About Nodely](https://nodely.io/_astro/ipfs.C7du4vSt_1SxC1V.png)\n\nIPFS GATEWAY\n\nAlgorand NFT Permacache\n\n[Documentation](https://nodely.io/docs/public/ipfs)"}
{"id":"/ipfs-gateway/","title":"IPFS-Gateway","markdownUrl":"https://nodely.io/ipfs-gateway.md","heading":"What is being cached","url":"https://nodely.io/ipfs-gateway/","text":"Nodely IPFS gateway uses realtime block streaming pipeline to fetch all IPFS cids referenced in all new ASAs (NFTs).\n\nReferenced objects are downloaded using ARC19 standard and recursively parsed using ARC3 to precache and gather metadata on all referenced objects:\n\n-   json files\n-   audio / video / images"}
{"id":"/legal/cookies/","title":"No cookies policy","markdownUrl":"https://nodely.io/legal/cookies.md","heading":"No cookies policy","url":"https://nodely.io/legal/cookies/","text":"Last Updated: 2024-12-28"}
{"id":"/legal/cookies/","title":"No cookies policy","markdownUrl":"https://nodely.io/legal/cookies.md","heading":"NO COOKIES POLICY","url":"https://nodely.io/legal/cookies/#no-cookies-policy","text":"Cookies are small data files that are placed on your computer or mobile device when you visit a website. Cookies are widely used by website owners to make their websites work, as well as to provide reporting information. If you’d like to learn more about cookies, you can check out [https://www.allaboutcookies.org](https://www.allaboutcookies.org/).\n\n**We do not use cookies**. We have designed our website to provide information and services without the need for cookies. This means:\n\n1.  No Persistent Cookies: We do not store any persistent cookies on your device.\n2.  No Session Cookies: We do not use temporary cookies that expire after a browsing session.\n3.  No Third-Party Cookies: We do not allow third-party services to store cookies on your device through our website. Our decision not to use cookies is part of our commitment to protect your privacy and ensure a seamless user experience. We respect your right to privacy and aim to maintain the integrity of your online experience without the need for tracking or identifying individual visitors."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"Privacy policy","url":"https://nodely.io/legal/privacy-policy/","text":"Last Updated: 2024-12-28"}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"NODELY PRIVACY POLICY","url":"https://nodely.io/legal/privacy-policy/#nodely-privacy-policy","text":"This Privacy Policy (“Policy”) explains how we handle the personal data of our services users. We want you to know that we take your privacy seriously. We make sure that your personal data is processed in line with the rules set out in the GDPR (Regulation (EU) 2016/679) and the Personal Data Protection Act of 10 May 2018, along with other data protection laws. When you use our services, we may need to process some information about you, including personal data. We only collect and use the personal data that’s necessary to provide and improve our services."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"IDENTITY OF THE CONTROLLER","url":"https://nodely.io/legal/privacy-policy/#identity-of-the-controller","text":"The Controller of your personal data is: Nodely sp. z o.o. a company incorporated in Poland, with its registered office in Warsaw at Żwanowiecka 53, 04-846, entered in the Register of Entrepreneurs by District Court for the City of Warsaw in Warsaw, XIV Commercial Division of the National Court Register under KRS number 0001061171, with NIP (tax identification number): 9522246503, share capital of PLN 50,000 (“Nodely”, “we”, “us”, “our”)."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"CONTACT WITH THE CONTOLLER","url":"https://nodely.io/legal/privacy-policy/#contact-with-the-contoller","text":"You can contact us in the following ways:\n\n-   address: Nodely sp. z o.o. ul. Żwanowiecka 53, 04-846, Warsaw, Poland.\n-   email: [support@nodely.io](mailto:support@nodely.io)."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"SCOPE OF DATA","url":"https://nodely.io/legal/privacy-policy/#scope-of-data","text":"We may collect and process the personal data which you provide us. When you use our services and/or sent a query via contact form, we may process certain information, including things like your \\[name (if you decide to provide it), email address, business name, payment card number, name and surname of payment card holder, billing address including country of origin or residence, address of cryptocurrency wallet (if you pay for services by USDC or EUROC stable coins), tax identification number, phone number (if you contact us by call) and other data provided when contacting us\\].\n\nFor operational and security purposes, we create and store logs that may contain IP addresses. However, these IP addresses are anonymized to prevent any personal identification."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"PURPOSES AND LEGAL BASIS FOR DATA PROCESSING","url":"https://nodely.io/legal/privacy-policy/#purposes-and-legal-basis-for-data-processing","text":"Your personal data will be processed for the following purposes:"}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"Provision of services","url":"https://nodely.io/legal/privacy-policy/#provision-of-services","text":"We will process your personal data to provide electronic services detailed in the Terms of Service, including in particular in connection with access to technologies selected by you and your payment of a subscription fee, and our managing of service-related matters (based on Article 6(1)(b) of the GDPR)."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"Compliance with legal obligations","url":"https://nodely.io/legal/privacy-policy/#compliance-with-legal-obligations","text":"We will process your personal data to fulfil legal and tax obligations imposed on us such as the payment of income tax, etc. (Article 6(1)(c) of the GDPR)."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"Our legitimate interests","url":"https://nodely.io/legal/privacy-policy/#our-legitimate-interests","text":"We will process your personal data to protect ourselves against potential claims, answer your queries sent via contact form and/or handling requests related to technical issues with the website or services we provide (Article 6(1)(f) of the GDPR).\n\nYour data may also be processed based on your consent (Article 6(1)(a) of the GDPR). In such cases, at the time you grant consent, we will inform you of the purposes of the processing. If you provide consent, you have the right to withdraw it at any time. However, the withdrawal of consent will not affect the lawfulness of processing carried out based on consent before its withdrawal."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"CATEGORIES OF RECIPIENTS","url":"https://nodely.io/legal/privacy-policy/#categories-of-recipients","text":"We share and/or entrust your personal data with trusted entities that provide services essential to our operations, including:\n\n1.  accounting, legal and tax advisors who assist with compliance and regulatory matters;\n2.  software developers as well as other employees and contractors that we collaborate with to provide services to you and that support our infrastructure.\n\nYour personal data may be shared with private or public entities if required by law or other official judicial or administrative decisions."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"THIRD PARTY LINKS","url":"https://nodely.io/legal/privacy-policy/#third-party-links","text":"Our website may contain links to other sites that are not operated by us. If you click on a third-party link, you will be directed to that third party’s site. The specific rules about how your personal data is handled by those platforms can be found in their privacy policies, which are available on their websites and apps. We encourage you to check them out for more details.\n\nWe have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"DATA RETENTION PERIOD","url":"https://nodely.io/legal/privacy-policy/#data-retention-period","text":"Your personal data will be processed for as long as you use our services. We may process your personal data after the termination of the Terms of Services if it is required by decisions of state authorities or applicable laws such as tax regulations (this will typically be a period of 6 years after the termination of the Terms of Services). The data processing period may be extended if processing is necessary to protect our legitimate interest such as pursuing or defending against legal claims for the period specified by the statute of limitations for claims under the Terms of Service. After the processing period expires, personal data is irreversibly deleted or anonymized."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"YOUR RIGHTS","url":"https://nodely.io/legal/privacy-policy/#your-rights","text":"In relation to the processing of your personal data, you have the following rights:\n\n1.  Access Your Data: You have the right to access the content of your data (Article 15 of the GDPR).\n2.  Rectify Your Data: You can request corrections if your data is inaccurate or incomplete (Article 16 of the GDPR).\n3.  Delete Your Data: You may request the deletion of your data (Article 17 of the GDPR).\n4.  Restrict Processing: You have the right to limit the processing of your data (Article 18 GDPR).\n5.  Transfer Your Data: You can request to receive your data in a structured, commonly used format, or ask us to transfer it to another controller (Article 20 of the GDPR).\n6.  Object to Processing: You may object to the processing of your data (Article 21 of the GDPR).\n7.  Avoid Automated Decisions: You have the right not to be subject to decisions based solely on automated processing, including profiling (Article of the 22 GDPR). Please note, however, that your data is not used for profiling. Providing your data is voluntary but essential for us to conclude the Terms of Service with you and provide services to you and/or contact you. If you do not provide it, we may be unable to conclude the Terms of Service with you and/or deliver the services and/or answer on your queries sent via contact form."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"NO COOKIES POLICY","url":"https://nodely.io/legal/privacy-policy/#no-cookies-policy","text":"Cookies are small data files that are placed on your computer or mobile device when you visit a website. Cookies are widely used by website owners to make their websites work, as well as to provide reporting information. If you’d like to learn more about cookies, you can check out [https://www.allaboutcookies.org](https://www.allaboutcookies.org/).\n\n**We do not use cookies**. We have designed our website to provide information and services without the need for cookies. This means:\n\n1.  No Persistent Cookies: We do not store any persistent cookies on your device.\n2.  No Session Cookies: We do not use temporary cookies that expire after a browsing session.\n3.  No Third-Party Cookies: We do not allow third-party services to store cookies on your device through our website. Our decision not to use cookies is part of our commitment to protect your privacy and ensure a seamless user experience. We respect your right to privacy and aim to maintain the integrity of your online experience without the need for tracking or identifying individual visitors."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"TRANSFER OF DATA OUTSIDE THE EUROPEAN ECONOMIC AREA","url":"https://nodely.io/legal/privacy-policy/#transfer-of-data-outside-the-european-economic-area","text":"Your personal data will not be transferred outside the territory of the European Economic Area.\n\nDue to the nature of our business, we may use the services of entities located outside the European Economic Area (EEA) such as: Stripe Payments, Amazon Web Services, Google LLC. When we transfer data to a recipient outside the EEA, the transfer is based on the Standard Contractual Clauses (Commission Implementing Decision (EU) 2021/914 of 4 June 2021 on standard contractual clauses for the transfer of personal data to third countries pursuant to Regulation (EU) 2016/679 of the European Parliament and of the Council), where the data recipient is an entity processing personal data on our behalf. The content of these clauses is publicly accessible on EUR-lex, the EU’s database for legal instruments ([https://eur-lex.europa.eu/legal-](https://eur-lex.europa.eu/legal-) content/EN/TXT/?uri=CELEX%3A32021D0914). Please note that privacy laws outside the EEA may not offer the same level of protection as the GDPR. Therefore, we implement safeguards to protect your data during transfer, including encryption and, wherever possible, anonymization to maintain confidentiality. Additionally, we limit the information provided to such entities as necessary for service delivery.\n\nIf you would like more information about these data transfers and the specific safeguards we employ, please feel free to contact us for further details."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"AUTOMATED DECISION – MAKING","url":"https://nodely.io/legal/privacy-policy/#automated-decision--making","text":"Your personal data is not subject to automated decision-making, including profiling."}
{"id":"/legal/privacy-policy/","title":"Privacy policy","markdownUrl":"https://nodely.io/legal/privacy-policy.md","heading":"RIGHT TO LODGE A COMPLAINT","url":"https://nodely.io/legal/privacy-policy/#right-to-lodge-a-complaint","text":"If you consider that the processing of your data is unlawful, you have the right to file a complaint with the supervisory authority, the President of the Office for the Protection of Personal Data in Poland. However, we recommend that you first contact us directly before you do so. We respect you and your information, so we will try to find a solution to satisfy you.\n\n* * *\n\nWe may update the rules outlined in this Policy as needed due to new technological or legal developments. If we make any changes, we’ll publish the changes on our website and/or send a notification to your email address.\n\nThis Privacy Policy is effective as of: 2024-12-28"}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Terms of Service","url":"https://nodely.io/legal/terms-of-service/","text":"Last Updated: 2024-12-28"}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"NODELY TERMS OF SERVICE","url":"https://nodely.io/legal/terms-of-service/#nodely-terms-of-service","text":"Welcome to Nodely. Our mission is to provide seamless integration and reliable API access to Algorand's AVM-compatible public and hybrid networks and provide other services relating to Algorand’s networks.\n\nThese Terms of Service **(“ToS”)** outline the framework governing your use of Nodely's various services rendered by Nodely sp. z o.o. with its registered office in Warsaw, Poland (“Nodely”, “we”, “us”, “our”), ensuring a smooth and secure experience as you leverage our cutting-edge solutions. Please read carefully these ToS before you start using our Services.\n\nBy accessing and using our Services, you agree to the ToS and agree to be by bound by these ToS and our Privacy Policy. The ToS constitutes a binding obligation between you and Nodely (as defined herein).\n\nPlease be informed that we provide our Services to business only. By entering into this ToS, you declare that the Services we provide You are directly related to your business activity and are of a professional nature resulting from the subject of the activity you perform.\n\nNodely sp. z o.o. is a company incorporated in Poland, with its registered office in Warsaw at Żwanowiecka St 53, 04-846, entered in the Register of Entrepreneurs run by District Court for the City of Warsaw in Warsaw, XIV Commercial Division of the National Court Register under KRS number 0001061171, with NIP (tax identification number): 9522246503, share capital of PLN 50,000."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"General Information","url":"https://nodely.io/legal/terms-of-service/#general-information","text":"Nodely provides you with the following services (“Services”):\n\n1.  Access to API (as defined below);\n2.  Access to SQL Direct (as defined below);\n3.  Access to Data Warehouse (as defined below).\n\nYou can find detailed technical information about our Services, including features, tools, specs, and materials, right on our website. By using our Services, you confirm that you have reviewed that information about the Services of your choose.\n\nYou can access our Services directly through our website without creating an account. Nodely owns and manages the website. We do not use cookies or create logs of your activity. It is advisable to use antivirus software to minimize the risk of harmful code infecting your computer.\n\nIt is important to note that we do not have access to or view any data that you share, connect, or store as part of the Services.\n\nNodely does not offer any services other than those expressly described in these ToS. **It’s important to note that we provide access to technology and technology only. Nodely does not offer any financial services or services related to crypto-assets.** In particular, we do not:\n\n1.  hold, manage, provide custody or administration, or otherwise control any crypto-asset for you or on your behalf;\n2.  provide any service that involves exchanging crypto-assets for other funds or exchanging funds for crypto-assets;\n3.  receive, transfer or execute any orders for crypto-assets for or on your behalf;\n4.  provide any services relating to placing crypto-assets;\n5.  provide any advisory and/or portfolio management services in relating to crypto- assets; and/or\n6.  provide any services that involve transfer of crypto-assets for or on your behalf. Using our Services may require specific equipment. Before choosing a Service, you should ensure that your equipment meets the minimum technical requirements outlined in Appendix 2. We are not responsible for any inability to use the Service caused by your equipment failing to meet these technical requirements."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"API Services","url":"https://nodely.io/legal/terms-of-service/#api-services","text":"Nodely may provide you with the access to hosted RESTful application programming interfaces that include the Algorand Algod and Indexer APIs, branded as \"Nodely\" (\"**API**\"). The scope and the performance of API is defined in Appendix 1.\n\nWe offer these Services in four packages: Free Tier, Boost, Unlimited and Enterprise."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Free Tier","url":"https://nodely.io/legal/terms-of-service/#free-tier","text":"The access to Free Tier API is available to all users. By using the Free Tier, you acknowledge that the Free Tier may have limitations such as usage quotas, reduced data speeds, or limited access to features available in paid tiers. These limitations are subject to change at our discretion. For more information, check out our website.\n\nWe reserve the right to modify the terms of use for the Free Tier at any time. These modifications may include changes to features, usage limits, or availability. We will notify users of significant changes via our website or, if possible, through direct communication. Continued use of the Free Tier after such changes will constitute acceptance of the updated terms.\n\nWe reserve the right to suspend or terminate your access to the Free Tier at any time, without notice, for any reason, including but not limited to breach of these ToS.\n\nThe Free Tier is provided “as is” and “as available” without any warranties, express or implied, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, or non-infringement."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Boost package","url":"https://nodely.io/legal/terms-of-service/#boost-package","text":"The Boost package is a self-serve paid package with a daily usage quota and the limits described on our website (pricing page). You order it, and pay its Subscription Fee, in the Nodely portal. Add-ons and overages of the Boost package (for example extra daily requests or extra whitelisted sites) are monthly subscriptions ordered and billed in the Nodely portal together with it.\n\n**One Boost per customer.** Each customer may hold only one Boost subscription. A customer is the business that uses the Services, whatever the number of its accounts, organizations, e-mail addresses or payment cards: one VAT ID, company e-mail domain or address is treated as one customer. Spreading one customer's traffic over several Boost subscriptions or organizations (for example, to multiply the daily quota) breaches these ToS. In that case Nodely may refuse a further Boost subscription, merge the subscriptions concerned, suspend them, or terminate them with immediate effect, without refunding the Subscription Fee. A customer who needs more than one Boost quota should choose the Unlimited or Enterprise package; separate businesses that share an address or a domain may ask us at [support@nodely.io](mailto:support@nodely.io) to allow a separate Boost subscription."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Unlimited package","url":"https://nodely.io/legal/terms-of-service/#unlimited-package","text":"You can pay for the Unlimited package directly on our website. If you're interested, just fill out the form on our site with your email and credit card details. Once you submit the form and pay the Subscription Fee, we'll send you an email confirming your subscription to the package you selected, along with your API key.\n\nPayments are processed by third-party providers, and you can find their terms on the website when you're making the payment.\n\nWe offer a 7-day free trial so you can check out our Services. You can cancel our Services during the trial period by letting us know via email, and we won't charge you the Subscription Fee.\n\nThis package includes technical support. Terms and conditions of our support you can find in Appendix 3."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Enterprise package","url":"https://nodely.io/legal/terms-of-service/#enterprise-package","text":"This package is designed to be tailored to your business needs. Before you make your choice, we’d like to learn more about your requirements so we can customize the features to perfectly suit your business. To order this package, simply get in touch with us through the contact form."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"SQL Direct Services","url":"https://nodely.io/legal/terms-of-service/#sql-direct-services","text":"We may provide you with the access to software that enables direct access to archival SQL blockchain databases in Algorand network, allowing users to query and retrieve historical blockchain data stored in SQL (“SQL Direct”). This service is available in a variety of configurations to suit your needs. Contact us via the contact form, and we will tailor the appropriate setup to meet your requirements."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"Data Warehouse Services","url":"https://nodely.io/legal/terms-of-service/#data-warehouse-services","text":"We may provide you with access to software that enables the use of a self-service data warehouse containing blockchain data in Algorand protocol, allowing users to independently retrieve, analyze, and manage blockchain-related information through an interface (“Data Warehouse”).\n\nIf you are interested in this Service, contact us via contract form and we will tailor the appropriate setup to meet your requirement."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"OUR RIGHTS AND OBLIGATIONS","url":"https://nodely.io/legal/terms-of-service/#our-rights-and-obligations","text":"We undertake to provide Services on the terms and conditions set out in these ToS.\n\nNodely can:\n\n1.  temporarily suspend the availability of any Service due to technical reasons, including, without limitation, maintenance, renovation, updating, or upgrading of the website or the Services;\n2.  communicate with the you, including via e-mail, in connection with the Services; terminate the Service in the event of a lack of payment of the Subscription Fee;\n3.  terminate the Service for convenience;\n4.  change the specifications and functionalities of the Services through changing these ToS;\n5.  change the Subscription Fee for the Services through changing these ToS.\n\nWe intend to update, develop and maintain the Services in a manner that will enable you to make the best use of our Services.\n\nNotwithstanding the above, we may immediately suspend (**“Suspension”**) all or part of your use of the Services if:\n\n1.  we become aware that your use of the Services violates the ToS or that any of your warranties are untrue, and you do not remedy the violation within 7 days of receiving our notice;\n2.  we reasonable believe that suspension is needed to protect Services, our infrastructures or any other our client, for instance due to attack or risk of attack;\n3.  we reasonably believe that unauthorized person obtained access to the Services;\n4.  we reasonably believe that suspension is needed to comply with laws;\n5.  judicial or administrative authorities request to do so."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"YOUR RIGHTS AND RESPONSIBILITIES","url":"https://nodely.io/legal/terms-of-service/#your-rights-and-responsibilities","text":"From the moment you start using our Services, you should:\n\n1.  use the website and the Services in accordance with its purpose and the ToS;\n2.  conduct reasonably actions to prevent any unauthorized use of and/or access to the Services and promptly inform us about such unauthorized use of and/or access;\n3.  refrain from actions that could negatively affect the website or the Services or make any interference in the Services;\n4.  refrain from conducting hacking attempts or attacks;\n5.  refrain from providing and/or uploading any unlawful content to the website and/or to the Nodely in connection with the Services;\n6.  comply with generally applicable laws;\n7.  not modify, remove, copy, alter, or otherwise manipulate the security, coding, any part of the Services in any way;\n8.  refrain from engaging in any activities that require a permit, authorization, or license, as required by applicable law for both Nodely and yourself;\n9.  refrain from misusing the Services, including but not limited to engaging in illegal activities, including, without limitation, infringing on intellectual property rights, or conducting any activity that disrupts or interferes with the operation of the Services.\n\nBy using the Services you may save, host, store, operate, use and/or disclose your data, including information, software, procedures, files, tools, systems, applications, infrastructure and any other items (“**Your Data**”)."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"TERMS AND FEE","url":"https://nodely.io/legal/terms-of-service/#terms-and-fee","text":"We offer all our Services in a monthly subscription model (“Subscription Term”). You will gain access to the particular Services upon payment of the applicable fee (“Subscription Fee”).\n\nThe use of API Free Tier is free of charge.\n\nInformation about the current Subscription Fees is available on the website.\n\nFor the use of API Unlimited package, the Subscription Fee will be charged automatically at the end of the Subscription Term.\n\nThe method and payment terms for the provision of other Services will be agreed upon by the Parties in a separate agreement.\n\nNodely accepts payments in USD or EUR currency via Wire Transfer to an EU Bank Account or via equivalent transfer of USDC or EUROC stable coins issued by Circle Internet Financial Limited."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"LIABILITY","url":"https://nodely.io/legal/terms-of-service/#liability","text":"Although the highest security standards are implemented, Nodely is not liable for any temporary and unexpected malfunctions of the website, or the Services caused by cyber- attacks, accidental circumstances, natural disasters, force majeure, or other circumstances beyond our control.\n\nSubject to applicable law, Nodely shall not be liable for interruptions or errors in the operation of our website or the Services including, but not limited to, the following:\n\n1.  breach of the ToS by you or any person acting for or on your behalf through whom you use the Services;\n2.  technical reasons attributable to you, including, in particular, failures of the devices which you use, as well as if you use the Services through devices or software that are incompatible with the website or the Services;\n3.  overloads of the website, independent of Nodely due to a computer system or network service, including in particular DoS (Denial of Service), DDoS (Distributed DenialofService) or Brute Force;\n4.  causes attributable to third parties for which Nodely is not responsible for, including the third-party service providers, in particular delays or interruptions in access to the Internet (data transmission);\n5.  planned activities related to the change, addition, ongoing maintenance of the website or the Services to the extent necessary to carry them out;\n6.  during the Suspension.\n\nNodely should not be liable for damages consisting of loss, damage, or leakage of data in connection with the use of the Services or website by you and any persons acting for you or on yours behalf.\n\nThe exclusion of Nodely's liability applies in particular to any damages incurred by you, as well as any lost profits, in connection with the use of the Services.\n\nRegardless of the above, Nodely's total liability to you for any damages, regardless of their legal basis, is limited to the Subscription Fee which you pay for the Subscription Term when the damage occurred.\n\nYou should, at your own expense, indemnify, and hold Nodely harmless against all claims, liabilities, accusations and actions that arise from or relate to your use of the Services. If such claims are raised and/or pursued against Nodely, you will pay (i) any amounts (including, in particular, any litigation costs and costs of legal services) awarded to a third party in an enforceable judgement and/or fines imposed by authorities or courts, (ii) all amounts payable to a third party and/or authorities and/or courts pursuant to a settlement concluded with such third party or authority, and (iii) compensation for damages suffered by Nodely. You should promptly inform us if such claim occurs and provide Nodely with all necessary information so that Nodely can act effectively to dismiss the claim or accusations."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"INTELECTUAL PROPERTY","url":"https://nodely.io/legal/terms-of-service/#intelectual-property","text":"Unless Nodely and you have agreed otherwise, upon the receipt of Subscription Fee or providing you with key to access the Services, whichever occurs later, Nodely grants you a limited, non-exclusive, non-sublicensable, non-transferable, without territorial restrictions, license to use the Services (“License”) in accordance with its functionality, exclusively in the form of the executable (binary) code for the purpose of displaying, and applying its functions.\n\nWe grant you the Licence for the Subscription Term. The License will expire automatically upon termination or expiration of the ToS. The License will automatically renew for another Subscription Term whenever you pay the Subscription Fee.\n\nNodely and you agree that you retain all rights in Your Data and Nodely retain all rights to the Services.\n\nContent posted by Nodely on the website or provided with the Services, including in particular trademarks and other distinctive signs, is the subject of intellectual property rights of Nodely or entities other than Nodely, which permit Nodely to use such content under separate arrangements. The use of the content posted on the website or provided with the Services in any way other than for the purpose of using the Services, including, in particular, copying or distributing it, requires the prior consent of Nodely.\n\nYou should, at your own expense, indemnify, and hold Nodely harmless against all claims and actions brought by any third party alleging that Your Data infringe any of their intellectual property rights (including but not limited to rights in the registration of patents, industrial designs, and/or copyrights). If such claims are raised and/or pursued against Nodely, you will pay (i) any amounts (including, in particular, any litigation costs and costs of legal services) awarded to a third party in an enforceable judgement, (ii) all amounts payable to a third party pursuant to a settlement concluded with such third party, and (iii) compensation for damages suffered by Nodely. You should promptly inform us if such claim occurs and provide Nodely with all necessary information so that Nodely can act effectively to dismiss the claim."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"PRIVACY AND DATA PROTECTON","url":"https://nodely.io/legal/terms-of-service/#privacy-and-data-protecton","text":"Your privacy and its protection are a top priority for us. That's why we make every effort to ensure the highest standards of security for the protection of the information you provide to us, guided by the principles of responsibility and integrity and maintaining the requirements set forth in applicable laws.\n\nThe rules for the processing of your personal data, which is administered by Nodely, are set forth in the Privacy Policy, which you can find on our website."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"CHANGE OF ToS","url":"https://nodely.io/legal/terms-of-service/#change-of-tos","text":"We may change these ToS and the Services, its functionalities, at any time, at our sole discretion. If we do so, we will use commercially reasonable efforts to communicate such a change to you by posting the updated ToS on our website and through your e-mail address. It is important that you review these ToS on our website for any changes, including when you use the Services.\n\nFor example, we may change these ToS in the event of the occurrence of:\n\n1.  organizational and legal changes of Nodely;\n2.  changes in applicable laws applicable to these ToSs;\n3.  changes to the functionality of the Services or website provided that changes to the ToS are aimed at adapting the content of the ToS to their functionality;\n4.  changes in the specifications of the relevant Service;\n5.  changes in the amount of the Subscription Fee for the Service.\n\nWithin 30 days from the date of publishing the changes on our website or sending a notification to your email address, whichever occurs later, you may reject the proposed changes to the ToS by replying via email. If you do not response within this period and you continue to use the Services after this period, you agree that you accept the proposed changes. In such a case, the changes will take effect on the date specified in the notification, but no earlier than 30 days after we inform you about the change. If you reject the changes, the ToS will terminate after 30 days from the date we inform you of the change.\n\nIn the case of ordering Services other than those currently provided, the new ToS will apply."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"TERMINATION","url":"https://nodely.io/legal/terms-of-service/#termination","text":"Both Nodely and you have the right to terminate the ToS at any time. You agree that we will send the termination of the ToS to the email address you provide when contacting us or paying the Subscription Fee.\n\nYou can submit termination notice of the ToS to the following e-mail address: [sales@nodely.io](mailto:sales@nodely.io)\n\nThe notice period is 1 month and will expire at the end of a calendar month.\n\nNodely may terminate the ToS with immediate effect if you violate material provisions of these ToS, including, without limitation, YOUR RIGHTS AND OBLIGATIONS clause and/or INTELLECTUAL PROPERTY clause, and/or the “One Boost per customer” rule of the Boost package, and/or if you are in delay with payment of the Subscription Fee for at least 14 days.\n\nNodely will not return you the Subscription Fee if we terminate the ToS with immediate effect.\n\nThe termination or expiration of the ToS means that we will cease providing Services to you, resulting in the loss of your access to the Services."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"WARRANTIES","url":"https://nodely.io/legal/terms-of-service/#warranties","text":"By using our Services, you warrant that: (1) you are lawfully able to enter into this ToS; (2) you are not listed on any sanctions lists or designated as a prohibited or restricted party by authorities, including but not limited to the United Nations Security Council, the U.S. Government, the European Union and its Member States, the United Kingdom, or any other applicable governing body."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"DISPUTE RESOLUTION","url":"https://nodely.io/legal/terms-of-service/#dispute-resolution","text":"You have the right to use out-of-court complaint handling and claiming. However, we encourage you to contact us first. If the Services do not comply with the ToS, you can file a complaint by sending an email to our address within 14 days from the date the non- compliance occurs. We will respond to your complaint within 30 days at the latest.\n\nAny dispute or claim arising out of or in connection with these ToS or Services shall be governed by and construed in accordance with the law of Poland. The disputes shall be submitted to the exclusive jurisdiction of the common court for the area of Nodely’s registered office."}
{"id":"/legal/terms-of-service/","title":"Terms of Service","markdownUrl":"https://nodely.io/legal/terms-of-service.md","heading":"FINAL PROVISIONS","url":"https://nodely.io/legal/terms-of-service/#final-provisions","text":"The ToS shall be binding between Nodely and you from the moment you start using the Services.\n\nThe ToS are available on our website under the “Terms of Service” tab. You familiarize yourself with them before starting using the Services. In addition, you can view, acquire, record and print the ToS at the time you choose.\n\nIf you have any questions about the rules set forth in the ToS or your rights and obligations, or the offerings of our Services, you may contact us at telephone number: +48 690 145 547 or via email at: [support@nodely.io](mailto:support@nodely.io) . We will do our best to answer all your questions as soon as possible, and we will send the answers to the e-mail address you have given us.\n\nAny costs arising from your attempt to contact us will be borne by you in accordance with the rates of the telecommunications operator whose services you use.\n\nIn the event that any of the provisions of the ToS prove to be invalid, ineffective, illegal, or unenforceable in whole or in part, this circumstance will not affect the validity of the remaining provisions of the ToS.\n\nTo matters not covered by the ToS, the provisions of Polish law shall apply.\n\nUsing the website and the Services via Internet may involve the cost of connection to the Internet (data transfer fee) per the tariff package of your service provider."}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Pricing","url":"https://nodely.io/pricing/","text":"PRICING"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Algorand APIs.  ","url":"https://nodely.io/pricing/","text":"Start free. Scale when you need to.\n\nUse the public endpoints without a key. Add a token, analytics and a daily quota with Boost, or drop the quota with Unlimited. Dedicated infrastructure and private networks are scoped with our team.\n\nJan'27\n\nNO ACCOUNT, NO KEY"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Free","url":"https://nodely.io/pricing/","text":"**$0**forever\n\nArchival Algorand node and indexer APIs for prototypes, dApps and light backends.\n\n-   ✓No sign-up, no API key\n-   ✓128k requests or 2 GB a day\n-   ✓30 req/s, 10 concurrent calls\n-   ✓Bot traffic: 5 req/s\n-   ✓50 ms+ added latency for backends and bots\n-   ✓Testnet time travel\n-   ✓Mainnet, testnet, betanet, FNet and Voi\n-   ✓IPFS gateway for 1 site\n-   ✓Public usage dashboard\n\n[Start without a key ↗](https://nodely.io/docs/access/)[Fair usage policy →](https://nodely.io/docs/free/policy/)\n\nDec'26\n\nNEW · SELF-SERVE"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Boost","url":"https://nodely.io/pricing/","text":"**$32**/ month, excl. VAT\\*\n\nA key, analytics and a daily quota for apps that outgrow the free tier.\n\n-   ✓API token or whitelisted site\n-   ✓256k requests and 4 GB a day\n-   ✓120 req/s\n-   ✓50 ms+ added latency for backends and bots\n-   ✓99.5 % SLO on Algorand endpoints\n-   ✓Ethereum, Base and Arc\n-   ✓2 tokens · 1 site · no IPs\n-   ✓Basic time travel\n-   ✓7-day usage analytics\n-   ✓1 user per account\n-   ✓IPFS gateway for 1 site\n-   ✓One Boost per customer\n\nAdd-ons\n\n-   IPFS pinning up to 256 GB$8 / month\n-   AI 125B-A6B, no quota$16 / month\n-   [✦Ariadne Light✦✦](https://nodely.io/ariadne)$16 / month\n-   All features bundle$24 / month\n\nOverages\n\n-   Extra 256k requests and 4 GB a day$32 / month\n-   Extra site$2 / month\n\nSign-up opens Dec'26\n\nPRODUCTION"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Unlimited","url":"https://nodely.io/pricing/","text":"**$256**/ month, excl. VAT\\*\n\n**$212**/ month, excl. VAT\\*\n\nBilled annually: $2,544 / year, save 17 %\n\nFor production workloads, with no daily quota and low-latency commercial endpoints.\n\n-   ✓No daily quota\n-   ✓No added latency\n-   ✓API token, whitelisted site or IP\n-   ✓600 req/s\n-   ✓3 tokens · 3 IPs · 5 sites\n-   ✓Ethereum, Base and Arc\n-   ✓Full time travel\n-   ✓99.99 % SLO on Algorand\n-   ✓Usage analytics\n-   ✓Admin and viewer roles\n-   ✓IPFS gateway for any CID\n-   ✓IPFS pinning 256 GB\n-   ✓AI models, 256k context\n-   ✓[✦Ariadne✦✦](https://nodely.io/ariadne)\n\nAdd-ons\n\n-   AI Throughput ×2$16 / month\n\nOverages\n\n-   IPFS pinning +1 TB$16 / month\n\n[Sign up ↗](https://portal.nodely.io/register)[Upgrade in the portal →](https://portal.nodely.io/billing)\n\nCUSTOM"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Enterprise","url":"https://nodely.io/pricing/","text":"from**$512**/ month, excl. VAT\\*\n\nSLAs, custom limits and dedicated capacity for teams that run critical workloads.\n\n-   ✓Everything in Unlimited\n-   ✓No API rate limits\n-   ✓SLA, 10x reimbursement\n-   ✓Support within 4 h\n-   ✓Custom limits\n-   ✓Shared or dedicated infrastructure\n-   ✓Fee abstraction in USD\n-   ✓Validator node service\n-   ✓[✦Ariadne Enterprise✦✦](https://nodely.io/ariadne)\n-   ✓Phone support, Net30 invoicing\n\n[Contact us ↗](https://nodely.io/contact)[sales@nodely.io →](mailto:sales@nodely.io)\n\n-   Ribbons mark when new terms start: Free Jan'27 (1 January 2027), Boost Dec'26, when its sign-up opens.\n-   Daily quotas reset at 00:00 UTC.\n-   \\* Prices are net: + 23 % VAT for buyers in Poland and EU consumers; no VAT for EU businesses with a valid VAT ID (reverse charge) and outside the EU.\n-   Prices in USD. Monthly: no commitment, cancel any time. Annual: paid up front for 12 months.\n-   Upgrades and billing in the portal are open to organization admins.\n-   Open-source public goods projects can apply for free Unlimited access (1 whitelisted site); their support is in the community channels.\n-   Support response targets are calendar hours (weekends and holidays included), counted to our first reply.\n-   One Boost subscription per customer: spreading one customer's traffic over several Boost organizations breaches the Terms of Service.\n\nCOMPARE PLANS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"What each plan includes.","url":"https://nodely.io/pricing/#compare-title","text":"An endpoint is a project in the portal, with its own tokens, whitelisted sites and IPs, usage analytics and, on Boost, its own daily quota.\n\n| Plan | Free | Boost | Unlimited | Enterprise |\n| --- | --- | --- | --- | --- |\n| Price | $0 | $32 / month, excl. VAT$32 / month, excl. VAT (no annual price) | $256 / month, excl. VAT$212 / month, billed annually ($2,544), excl. VAT | From $512 / month, excl. VAT |\n| Access | No key | Token or site | Token, site or IP | Token, site, IP or dedicated |\n| API hosts | Public \\*.4160.nodely.dev | Public \\*.4160.nodely.dev | Commercial \\*.4160.nodely.io | Commercial, dedicated or your domain |\n| Daily quota | 128k requests or 2 GB per IP and per site | 256k requests and 4 GB per endpoint | No daily quota | No daily quota |\n| At the quota | 403, more requests dropped at random as usage nears the quota | 429 with a JSON body until 00:00 UTC | – | – |\n| Request rate | 30 req/s per IP, 1000 req/s per site; bot traffic 5 req/s per IP | 120 req/s per client IP, split across the region's edges | 600 req/s per client IP, split across the region's edges | No API rate limit |\n| Added latency | 50 ms added to backend and bot requests; browser apps none | 50 ms added to backend and bot requests; browser apps none | 0 ms added | 0 ms added |\n| Endpoints · tokens · sites · IPs | – | 1 endpoint · 2 tokens · 1 site · no IPs | 3 endpoints · 3 tokens · 3 IPs · 5 sites per organization | Custom; 5 sites per organization |\n| Usage analytics | Public dashboard | Portal, per endpoint, last 7 days | Portal, per endpoint | Portal, 180-day log analytics |\n| Team members | – | 1 user per account | Admin and viewer roles | Admin and viewer roles |\n| Archival node and indexer | ✓ | ✓ | ✓ | ✓ |\n| Time travel (state at a past round) | Testnet time travel | Basic time travel (mainnet and testnet) | Full time travel (mainnet and testnet) | Full time travel (mainnet and testnet) |\n| IPFS gateway | 1 verified site authorized in the portal, within the free daily quota | 1 verified site whitelisted automatically; extra sites $2 / month each | Any CID, 5 verified sites per organization whitelisted automatically | Any CID, 5 verified sites per organization whitelisted automatically |\n| IPFS pinning | – | 100 MB / 25 files free; add-on: 256 GB $8, 1 TB $16 / month | 256 GB / 64,000 files included; IPFS pinning +1 TB add-on $16 / month (1.256 TB / 314,000 files in total) | 256 GB / 64,000 files included; +1 TB (1.256 TB / 314,000 files in total) on your contract |\n| AI models | Not included | Add-on: AI 125B-A6B, no quota $16 / month, the Unlimited limits with 32k chat context | Included: embeddings and a 125B-parameter chat model with web search, 256k context. Hourly budgets, no token quota | Included: embeddings and a 125B-parameter chat model with web search, 256k context. Hourly budgets, no token quota |\n| Ariadne | – | Ariadne Light add-on, $16 / month | Ariadne | Ariadne Enterprise |\n| Service level | 99.95 % SLO | 99.5 % SLO on Algorand endpoints | 99.99 % SLO on Algorand | SLA, 10x reimbursement |\n| Support response | Best effort | Best effort | First response within 24 hours | First response within 4 hours |\n| R&D support | Best effort | Best effort | 1 h / month | Agreed per contract |\n| Billing | – | Card (Stripe), monthly | Card (Stripe), or invoice: wire, SEPA, USDC | Invoice, Net30 |\n|  | [Start without a key ↗](https://nodely.io/docs/access/) | Sign-up opens Dec'26 | [Sign up ↗](https://portal.nodely.io/register) | [Contact us ↗](https://nodely.io/contact) |\n\nHow tokens, whitelisted sites, quotas and the 403 / 429 responses work: [API access docs](https://nodely.io/docs/access/). Past-round queries: [time travel](https://nodely.io/docs/access/time-travel/). AI models: [models and rate limits](https://nodely.io/docs/access/ai-models/).\n\n**AI models on Unlimited and Enterprise.** Nodely-hosted, OpenAI-compatible models with your endpoint token: text embeddings, image and text embeddings, and a 125B-parameter chat model with built-in web search and page reading. No token quota: each endpoint has an hourly budget per model, refilled continuously, with a burst and an in-flight limit. Unlimited and Enterprise, per endpoint: text embeddings 10,000 req/h (3,000,000 input tokens/h), burst 600/min, 4 in flight; image and text embeddings 2,000 req/h, burst 120/min, 2 in flight; chat 300 req/h (1,500,000 input, 300,000 output tokens/h), burst 30/min, 2 in flight, 256k context.\n\n**AI add-ons.** Boost: AI 125B-A6B, no quota ($16 / month): every model at the Unlimited limits. Unlimited and Enterprise: AI Throughput ×2 ($16 / month, limited availability): twice the hourly budgets and burst of the embedding models, chat excluded.\n\n**Web tools.** Web search and page reading are built into the chat model and covered by fair use. An endpoint that searches or reads far more than usual may find them unavailable for a while; the request still gets an answer.\n\n**Fair use.** There is no token quota: each endpoint has per-model hourly budgets, a burst limit and an in-flight limit instead. Use the models for your own products and workloads. Reselling raw model access, bulk dataset generation (for example to train other models) and abuse are not allowed. Built-in web search and page reading are fair use and are for answering requests, not for crawling sites or collecting data in bulk: pages are condensed to their main text and robots.txt is respected. For bulk search or scraping use the x402 search and scrape APIs. The models run on shared GPUs. Nodely may throttle endpoints whose traffic is far above other customers'; we contact you first when we can. The gateway logs each request's endpoint, model, status, timing and token counts, not its prompts or outputs. Models, their versions and the limits may change; the model names stay stable.\n\nBOOST ADD-ONS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Add what your app needs.","url":"https://nodely.io/pricing/#addons-title","text":"Optional monthly add-ons for a Boost subscription, added and removed in the portal.\n\n| Add-on | Price, excl. VAT\\* | What you get |\n| --- | --- | --- |\n| Extra 256k requests and 4 GB a day | $32 / month | 256k more requests and 4 GB more response bytes a day on top of the Boost daily quota (overage; up to 7 blocks, above that Unlimited costs less). |\n| Extra whitelisted site | $2 / month per site | One more verified site, beyond the 1 included with Boost, whitelisted for both the API (Referer) and the IPFS gateway. |\n| IPFS pinning 256 GB | $8 / month | Pin up to 256 GB of IPFS content, served by the gateway to your whitelisted sites. |\n| IPFS pinning 1 TB | $16 / month | Pin up to 1 TB of IPFS content, served by the gateway to your whitelisted sites. |\n| AI 125B-A6B, no quota | $16 / month | Every model at the Unlimited plan's hourly limits: text embeddings, image and text embeddings and the 125B-parameter chat model with built-in web search and page reading (fair use), with a 32k chat context (Unlimited: 256k). |\n| Ariadne Light | $16 / month | Ariadne, Nodely's AI-assisted workspace for Algorand investigations, threat intel and the DeFi radar, in its light edition. |\n| All features bundle | $24 / month | Every add-on above at its starter size: IPFS pinning 256 GB, AI 125B-A6B, no quota, Ariadne Light. $40 / month one by one. |\n\nAdd-ons are billed monthly with the Boost subscription and can be changed or removed in the portal by organization admins.\n\nIPFS gateway traffic of Boost sites counts toward the Boost daily quota.\n\nPinning: Hard cap with no overage billing, no pay-as-you-go. One pinning size at a time: switch up or down in the portal. Without an add-on, Boost includes 100 MB / 25 files free. Every pinning quota also caps the number of pinned files: 1 file per 4 MB of quota, per organization.\n\n\\* Prices are net: + 23 % VAT for buyers in Poland and EU consumers; no VAT for EU businesses with a valid VAT ID (reverse charge) and outside the EU.\n\nDEDICATED & DATA SERVICES"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"When shared  ","url":"https://nodely.io/pricing/","text":"infrastructure is not enough.\n\nDedicated clusters, analytics and private networks, sized and priced with our engineers.\n\nDEDICATED INFRASTRUCTURE"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Dedicated","url":"https://nodely.io/pricing/","text":"**$1,024**/ month per region\n\nDedicated node and indexer infrastructure in NA, EMEA, APAC or LATAM.\n\n-   ✓Vanity endpoints on your own domains\n-   ✓180-day log analytics\n-   ✓Unlimited egress\n-   ✓2 h of R&D support per month\n-   ✓Exclusive fastlane relay access\n-   ✓99.95 % SLA across 3 regions, 10x reimbursement\n-   ✓Bare-metal performance\n\n[Contact us ↗](https://nodely.io/contact)[What's inside →](https://nodely.io/docs/solutions/dedicated/)\n\nDATA"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Analytics DB","url":"https://nodely.io/pricing/","text":"**$2,048**/ month\n\nShared ClickHouse with Algorand mainnet data and self-service BI.\n\n-   ✓Superset BI\n-   ✓HTTP analytics API\n-   ✓Time travel to any block height\n-   ✓A billion rows per second\n\n[Contact us ↗](https://nodely.io/contact)[What's inside →](https://nodely.io/docs/solutions/clickhouse/)\n\nPRIVATE & HYBRID NETWORKS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"App chain","url":"https://nodely.io/pricing/","text":"**$4,096**/ month per network\n\nDedicated Algorand networks designed for your governance, connectivity and operations.\n\n-   ✓Hosted, hybrid or managed nodes with defined participant access\n-   ✓Public, consortium or private network configurations\n-   ✓Operational support and service levels agreed for your deployment\n-   ✓Public or private API access and network explorer\n-   ✓Dedicated SecOps team and real-time monitoring\n\n[Discuss your network ↗](https://nodely.io/contact)[Network options →](https://nodely.io/#networks)\n\nENTERPRISE NETWORKS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Private or hybrid. Built around your requirements.","url":"https://nodely.io/pricing/","text":"Discuss network architecture, deployment scope, operational support, and post-quantum readiness with our team. We’ll define a proposal for your environment.\n\n[Discuss your deployment ↗](https://nodely.io/contact)\n\nMORE FROM NODELY"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Gateways, agents  ","url":"https://nodely.io/pricing/","text":"and partners.\n\nServices that come with a plan, are paid per call, or are built for partners and public goods.\n\nFOR ALGORAND PROJECTS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"IPFS gateway","url":"https://nodely.io/pricing/","text":"A distributed IPFS gateway for Algorand assets, on every plan. Free: 1 verified site, authorized in the portal. Boost includes 1 verified site, more at $2 / month each. Unlimited and Enterprise sites are whitelisted once verified and can fetch any CID (5 sites per organization). Pinning: Unlimited and Enterprise include 256 GB / 64,000 files, +1 TB for $16 / month on Unlimited (Enterprise: on its contract).\n\n[Gateway details↗](https://nodely.io/ipfs-gateway)\n\nPAY PER CALL"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"x402 APIs","url":"https://nodely.io/pricing/","text":"Web search, page scrape and DEX prices for AI agents. No account and no key: each call is paid in USDC with x402.\n\n[x402 APIs↗](https://nodely.io/docs/x402/)\n\nFOR RPC BRANDS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Whitelabel RPC","url":"https://nodely.io/pricing/","text":"Sell RPC under your brand on our nodes. Unlimited requests for a flat monthly fee, on your own domain.\n\n[Whitelabel details↗](https://nodely.io/docs/whitelabel/)\n\nFOR OPEN-SOURCE PROJECTS"}
{"id":"/pricing/","title":"Pricing","markdownUrl":"https://nodely.io/pricing.md","heading":"Public goods","url":"https://nodely.io/pricing/","text":"Open-source, permissionless projects without tokens, such as xGov grantees, can apply for the Unlimited tier for free.\n\n[Check if you qualify↗](https://nodely.io/docs/unlimited/public-goods-projects/)\n\nBuilding on Ethereum, Base, Arc, Gno.land or Monero? Public RPC, no keys.[Ethereum ↗](https://nodely.io/docs/ethereum)[Base ↗](https://nodely.io/docs/base)[Arc ↗](https://nodely.io/docs/arc)[Gno.land ↗](https://nodely.io/docs/gno)[Monero ↗](https://nodely.io/docs/monero)[FAQ ↗](https://nodely.io/faq)"}
{"id":"/tags/","title":"Tags","markdownUrl":"https://nodely.io/tags.md","heading":"Tags","url":"https://nodely.io/tags/","text":"[All posts](https://nodely.io/blog)[Categories](https://nodely.io/categories)[Tags](https://nodely.io/tags)\n\n-   [API](https://nodely.io/tags/API \"View posts with the tag: API\")\n-   [Algorand](https://nodely.io/tags/Algorand \"View posts with the tag: Algorand\")\n-   [dt-algorand](https://nodely.io/tags/dt-algorand \"View posts with the tag: dt-algorand\")\n-   [time-travel](https://nodely.io/tags/time-travel \"View posts with the tag: time-travel\")\n-   [simulate](https://nodely.io/tags/simulate \"View posts with the tag: simulate\")\n-   [guide](https://nodely.io/tags/guide \"View posts with the tag: guide\")\n-   [node](https://nodely.io/tags/node \"View posts with the tag: node\")\n-   [incentives](https://nodely.io/tags/incentives \"View posts with the tag: incentives\")\n-   [staking](https://nodely.io/tags/staking \"View posts with the tag: staking\")\n-   [article](https://nodely.io/tags/article \"View posts with the tag: article\")\n-   [network](https://nodely.io/tags/network \"View posts with the tag: network\")\n-   [statistics](https://nodely.io/tags/statistics \"View posts with the tag: statistics\")\n-   [FAQ](https://nodely.io/tags/FAQ \"View posts with the tag: FAQ\")\n-   [tps](https://nodely.io/tags/tps \"View posts with the tag: tps\")\n-   [performance](https://nodely.io/tags/performance \"View posts with the tag: performance\")\n-   [Ariadne](https://nodely.io/tags/Ariadne \"View posts with the tag: Ariadne\")\n-   [QTScan](https://nodely.io/tags/QTScan \"View posts with the tag: QTScan\")\n-   [security](https://nodely.io/tags/security \"View posts with the tag: security\")\n-   [investigation](https://nodely.io/tags/investigation \"View posts with the tag: investigation\")\n-   [AVAIL](https://nodely.io/tags/AVAIL \"View posts with the tag: AVAIL\")\n-   [validator](https://nodely.io/tags/validator \"View posts with the tag: validator\")\n-   [consensus](https://nodely.io/tags/consensus \"View posts with the tag: consensus\")\n-   [participation keys](https://nodely.io/tags/participation-keys \"View posts with the tag: participation keys\")\n-   [sql](https://nodely.io/tags/sql \"View posts with the tag: sql\")\n-   [balances](https://nodely.io/tags/balances \"View posts with the tag: balances\")\n-   [self-service BI](https://nodely.io/tags/self-service-BI \"View posts with the tag: self-service BI\")\n-   [free tier](https://nodely.io/tags/free-tier \"View posts with the tag: free tier\")\n-   [pricing](https://nodely.io/tags/pricing \"View posts with the tag: pricing\")\n-   [tokens](https://nodely.io/tags/tokens \"View posts with the tag: tokens\")\n-   [decentralization](https://nodely.io/tags/decentralization \"View posts with the tag: decentralization\")"}
