Choose which blockchain data you want to provide.
Already registered as a provider? Skip to Sentinel Setup โ
Configure your blockchain node and sentinel.
Your sentinel needs access to the Arkeo blockchain to verify subscriber contracts and process payments. Choose how to connect:
REST API endpoint of your Arkeo node (typically port 1317). A pruned node works fine.
๐ Automatic failover: If your selected endpoint goes down, your sentinel config will include all healthy endpoints as fallbacks.
This is your node's RPC endpoint โ where the sentinel sends requests to get blockchain data.
Your RPC URL depends on where your node runs relative to the sentinel:
| Same server | http://localhost:PORT | Most common setup |
| Different server | http://INTERNAL_IP:PORT | Use your node's internal/private IP |
| Docker | http://host.docker.internal:PORT | If sentinel runs in Docker |
Common default ports by chain:
๐ Check your node's config: For Cosmos chains, look in config.toml under [rpc] โ laddr
The sentinel is a lightweight proxy that handles authentication and payments. You'll set it up after registration โ we'll generate a ready-to-use config and walk you through the install in a later step.
Set your pricing and provider metadata.
Set your pay-as-you-go rate. This is what subscribers pay per request to your node.
Competitor pricing for reference:
| Infura | Free tier + $50/mo for 100k req/day |
| Alchemy | Free tier + $49/mo for 50M compute units |
| QuickNode | $49/mo for 15M API credits |
Tips: Start competitive to attract subscribers. You can adjust your rate anytime by updating your provider config on-chain.
Protect your node from being overwhelmed. Your sentinel will automatically reject requests that exceed these limits.
Each subscriber's contract is capped at this rate. Prevents any single user from hogging your resources.
Set how long subscribers can open contracts with you. ~4 seconds per block.
The maximum length of time a subscriber can lock in a contract with you.
The minimum commitment required for subscribers. Prevents spam contracts.
This is how you'll appear in the marketplace. Your sentinel will serve this info automatically.
Sign two transactions to bond and configure your provider.
Your provider is now registered on the Arkeo network.
One command installs everything. Then come back here to verify.
A domain gives you free HTTPS. No domain? No problem โ the installer will use your server's IP address.
my-arkeo-node)my-arkeo-node.duckdns.org)The installer handles SSL/HTTPS automatically. Total cost: $0.
SSH into your server and paste this single command. It installs Docker, configures your sentinel, sets up HTTPS, and starts everything.
After the installer finishes, enter your sentinel URL below and we'll confirm it's working.
The installer will show this URL when it finishes.
If you're using a community Arkeo endpoint, this script auto-switches to a backup if it goes down.
# Download and install the failover monitor curl -o /usr/local/bin/arkeo-failover.sh \ https://raw.githubusercontent.com/rbechtold69/arkeo-data-engine-v2/main/docs/scripts/arkeo-endpoint-monitor.sh chmod +x /usr/local/bin/arkeo-failover.sh # Run every 2 minutes via cron (crontab -l 2>/dev/null; echo "*/2 * * * * /usr/local/bin/arkeo-failover.sh ~/.arkeo/config.yaml >> /var/log/arkeo-failover.log 2>&1") | crontab -
โน๏ธ Not needed if you run your own Arkeo node.
Subscribers can now find you in the marketplace and open contracts to query your node.
The Arkeo sentinel automatically enforces QPM (Queries Per Minute) limits per contract. Each contract has a queries_per_minute field โ the sentinel will reject requests that exceed the contracted rate. No extra configuration needed on your end for per-contract enforcement.
Place Nginx in front of your sentinel for additional rate limiting, TLS termination, and DDoS mitigation:
# /etc/nginx/conf.d/arkeo-sentinel.conf
# Rate limit zone: 100 requests/min per IP
limit_req_zone $binary_remote_addr zone=sentinel:10m rate=100r/m;
server {
listen 443 ssl http2;
server_name your-provider.example.com;
ssl_certificate /etc/letsencrypt/live/your-provider.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-provider.example.com/privkey.pem;
location / {
limit_req zone=sentinel burst=20 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:3636;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw allow 443/tcp # HTTPS (Nginx) sudo ufw allow 3636/tcp # Sentinel (if no Nginx proxy) sudo ufw enable
sudo apt install fail2ban sudo systemctl enable fail2ban # Default config bans after 5 failed SSH attempts
QPM is set per contract when a user opens a contract with you. To decide your per-contract QPM limit:
Accept USDC micropayments via Arkeo's centralized x402 proxy (optional)
The x402 proxy needs an active ARKEO contract to bill against. This contract backs your x402 endpoint.
Minimum 0.01 ARKEO. This will be consumed as clients make requests via x402.
This delegate key allows the x402 proxy to sign requests on your behalf.
Share this endpoint with clients. The centralized x402 proxy handles payments automatically.
/x402/, collects USDC via the x402 protocol, then routes authenticated queries through your ARKEO contract.
x402 is Coinbase's open HTTP payment standard. It lets clients pay per request with USDC โ no accounts, no KYC. Add x402 middleware to your sentinel to accept micropayments from AI agents and developers on Base network (low fees).
npm install @x402/express @x402/core @x402/evm
import express from "express"; import { paymentMiddleware } from "@x402/express"; import { createVerifier } from "@x402/evm"; const app = express(); // Your wallet address to receive USDC payments const WALLET_ADDRESS = "0xYourWalletAddress"; // Configure x402 payment verification const verifier = createVerifier({ network: "base", // Base network for low fees }); // Protect your RPC endpoint with x402 app.use("/rpc", paymentMiddleware(verifier, { recipient: WALLET_ADDRESS, amount: "0.0001", // $0.0001 USDC per request asset: "USDC", })); // Proxy to your node app.post("/rpc", async (req, res) => { const response = await fetch("http://localhost:26657", { method: "POST", body: JSON.stringify(req.body), }); res.json(await response.json()); }); app.listen(3637);