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.

v1 · stable

Four endpoints, parameterised SQL behind each.

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://camp.cargopete.com/v1/status
GET/v1/signatures

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

curl https://camp.cargopete.com/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://camp.cargopete.com/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://camp.cargopete.com/v1/events\
?address=0x00669a4cf01450b64e8a2a20e9b1fcb71e61ef03\
&from_block=466834863&to_block=466835863&limit=20"

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

  • 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

  • Raw SQL — write your own indexer for that
  • 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.