Latest indexed block plus indexed-block count. Cheap, cached at the edge for 5 seconds.
curl https://engine.camp/v1/status
A community Amp node for Arbitrum One. Read blocks, transactions, and decoded events through a small REST API — free, no signup, no API key. Indexed at chain tip; query latency under a second on typical filters.
History rebuilds forward from 2026-05-27. The usable window grows by ~24 h every calendar day; eventually a rolling ~30 d view.
Live depth: —
live · sql · in your browser
Direct DataFusion-flavoured SQL against the indexed Arbitrum One tables. Same engine the endpoints below sit on top of — one example loaded for you, hit ⌘ + ↩ to run. Read-only, single-statement, must reference block_num so the scan stays bounded.
Want the full-page version with a bigger editor? /explore/sql.
v1 · stable · queries
Every request maps to a single bounded query against the indexed parquet tables. Block range, address, and topic filters are enforced server-side so the chain stays the bottleneck, not the gateway.
Latest indexed block plus indexed-block count. Cheap, cached at the edge for 5 seconds.
curl https://engine.camp/v1/status
Reference table of well-known event topic0 hashes → human-readable names. Useful for decoding without an ABI.
curl https://engine.camp/v1/signatures
All Transfer events for an ERC-20 or ERC-721 token in a block range, decoded into from / to / amount_hex.
# USDC transfers in a 200-block window curl "https://engine.camp/v1/transfers\ ?token=0xaf88d065e77c8cc2239327c5edb3a432268e5831\ &from_block=466835663&to_block=466835863&limit=10"
Generic log filter. topic0 is optional; add topic1/topic2/topic3 to narrow on indexed parameters such as from and to.
# HorizonStaking events in last 1000 blocks curl "https://engine.camp/v1/events\ ?address=0x00669a4cf01450b64e8a2a20e9b1fcb71e61ef03\ &from_block=466834863&to_block=466835863&limit=20"
v1 · stable · lookups
The wallet-explorer side of things. Same engine, same caps, shaped queries instead of generic filters. Defaults to a 100 k block window when no range is given.
Block header, every transaction in it, every log emitted — one request, three parallel queries.
curl https://engine.camp/v1/block/466862035
Transaction + receipt + emitted logs. Searches the last 100 k blocks by default; override with from_block / to_block.
curl https://engine.camp/v1/tx/0x7b73bf8545d992e6ee95bcb082e2fc1628413c42cfca2302da2cc649a51a7481
Every transaction where the address is from or to, in a block range. Direction defaults to all.
# Outbound txs for an address in the last ~hour curl "https://engine.camp/v1/address/0xe8d294f3fff2a5cb34d15ecdef34a53b01f5a462/tx\ ?from_block=466840000&to_block=466856000&direction=from&limit=25"
Token movements in and out of an address (any ERC-20/721), decoded. Optionally scope to a single token contract.
# Inbound USDC transfers to a wallet curl "https://engine.camp/v1/address/0xe8d294f3fff2a5cb34d15ecdef34a53b01f5a462/transfers\ ?token=0xaf88d065e77c8cc2239327c5edb3a432268e5831\ &from_block=466840000&to_block=466856000&direction=in&limit=25"
v1 · stable · aggregates
Group-by queries baked into endpoints, so the engine does the fanout once and you get a series back. Buckets: minute · hour · day. Max 1,000 buckets per response.
Per-bucket block stats: count, total / average gas_used, and min / average / max base_fee_per_gas. Cheap because the blocks table is small.
# Hourly gas stats over a 24h window curl "https://engine.camp/v1/gas/blocks\ ?from_block=466583000&to_block=466928000&bucket=hour"
Log count per bucket for a contract address. Useful for “is this protocol busy?” charts without pulling every event.
# USDC log activity, hour buckets curl "https://engine.camp/v1/contract/0xaf88d065e77c8cc2239327c5edb3a432268e5831/activity\ ?from_block=466583000&to_block=466928000&bucket=hour"
how it's served
Requests land at the edge for TLS and DDoS, traverse a Cloudflare tunnel to the origin, hit nginx for auth and rate limiting, then query an Amp node indexing Arbitrum One. Compacted parquet on local SSD keeps narrow queries sub-second.
client │ ▼ edge ─ TLS · DDoS · CDN · response cache │ ▼ cloudflare tunnel ─ private link to origin │ ▼ nginx ─ shared-secret + per-IP rate limit (Redis) │ ▼ ampd ─ parquet on local SSD, compactor active │ ▼ arbitrum one rpc
contract
Limits are the same for every caller. They're calibrated so the typical wallet, dashboard, or bot has plenty of headroom while bad actors hit the wall first.
scope
camp serves raw, indexed event history. A few things are deliberately out of scope — call them out so you can plan around them.
in scope
POST /v1/sql for arbitrary SELECTsout of scope
use it well
camp is offered free of charge with no SLA. The endpoints are cached aggressively and rate-limited per IP — work with that rather than around it.
If you're building something that depends on chain data being available at a specific latency, run your own Amp node. The dataset manifest, indexer config, and gateway code are all open — clone, point at your own RPC, you're done in an afternoon.
Bug reports and feature requests: github.com/lodestar-team/camp/issues.