camp

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

Skip the endpoints. Write the query.

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.

examples
+ to run

Want the full-page version with a bigger editor? /explore/sql.

v1 · stable · queries

Parameterised SQL behind each endpoint.

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.

GET/v1/status

Latest indexed block plus indexed-block count. Cheap, cached at the edge for 5 seconds.

curl https://engine.camp/v1/status
GET/v1/signatures

Reference table of well-known event topic0 hashes → human-readable names. Useful for decoding without an ABI.

curl https://engine.camp/v1/signatures
GET/v1/transfers?token=0x…&from_block=N&to_block=M&limit=100

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"
GET/v1/events?address=0x…&topic0=0x…&from_block=N&to_block=M&limit=100

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

Look it up by block, hash, or address.

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.

GET/v1/block/{n}

Block header, every transaction in it, every log emitted — one request, three parallel queries.

curl https://engine.camp/v1/block/466862035
GET/v1/tx/{hash}

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
GET/v1/address/{a}/tx?from_block=N&to_block=M&direction=from|to|all&limit=100

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"
GET/v1/address/{a}/transfers?from_block=N&to_block=M&direction=in|out|all&token=0x…

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

Time-bucketed counts and stats.

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.

GET/v1/gas/blocks?from_block=N&to_block=M&bucket=minute|hour|day

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"
GET/v1/contract/{a}/activity?from_block=N&to_block=M&bucket=minute|hour|day

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

Edge cache in front, real engine behind.

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

What you can ask, in numbers.

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.

ChainArbitrum One
Tables exposedblocks · transactions · logs
Max block span per request100,000
Max rows per response1,000
Server-side query timeout8 seconds
Rate limit per IP30 / min · 500 / hour
Edge cache1 h finalized · 5 s near tip

scope

What it does, and what it doesn't.

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

  • Raw POST /v1/sql for arbitrary SELECTs
  • Event history for any contract, any block range
  • Transaction lookups by hash, sender, or recipient
  • Topic-indexed filtering (sender, recipient, token IDs)
  • Decoded Transfer events for ERC-20 and ERC-721
  • Block headers, gas, base fee, blob fields

out of scope

  • Token balances (events, not state)
  • USD prices — bring your own oracle
  • Decoded calldata / 4byte resolution
  • Pre-genesis history
  • Chains other than Arbitrum One

use it well

A community service. Be a good citizen.

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.