Skip to main content

Queries

  1. Check to_block in the response: near the head, or for ranges over 50,000 blocks, the response covers less than you asked for. Continue from next_block.
  2. Check your topic filters: an address in a topic must be padded to 32 bytes.
  3. Check address: events are emitted by the contract that runs the code. For a proxy, that’s the proxy’s address.
  4. ERC-20 Transfer and ERC-721 Transfer share a topic0; check which you want.
A response never splits a block. It stops at the end of the block where the count reached maxObjects, so a busy block can push it well past.
  • Is fromBlock past the head? Then to_block is lower than from_block, and next_block equals your fromBlock. Wait for the chain to get there.
  • Is it the right chain? https://api.bloklake.com/v1/chains/eth/… vs …/rh/….
  • Hex values are case-insensitive, so case isn’t the problem.
Check unavailable_fields: the chain might not have that field (for example withdrawals on Robinhood Chain). Otherwise the field doesn’t apply to those rows (baseFeePerGas before London, to on contract creations).
Add the chain: https://api.bloklake.com/v1/chains/eth/query, or use https://eth.api.bloklake.com/query.
You filtered logs but selected no fields.log. Select at least one log field.
Prepared queries expire 30 minutes after their last use, and live on one chain. Send the full filter again; it re-registers under the same id.
A reorg replaced those blocks. Only rows at or below finalized_block are final. See Finality and reorgs.
Not on the server. Only address/topic0–topic3 (logs) and from/to/sighash/status (transactions) are indexed. Filter as narrowly as those allow, then filter the rest in your code.
No. Bloklake serves blocks, transactions (with receipts) and logs.

Reading responses

A response with several row types is several Arrow streams back to back. Open a new stream reader on the same body after the first one ends. See Reading Arrow, or use a client library, which handles it.
apache-arrow returns UInt64 as bigint. Use Number(x) for block numbers and timestamps.
It’s a big-endian unsigned integer: int.from_bytes(b, "big") in Python, BigInt("0x" + hex) in JavaScript. See Data types.
The server closes responses that aren’t read for 60 seconds, or are read slower than 50 KB/s. Read the response fully before processing it, or use smaller pages.

Keys and billing

Send Authorization: Bearer <key>. Keys in the URL aren’t accepted.
Keys are shown once. Rotate it on API keys to get a new one.
Your pay-as-you-go balance is used up. Top up on Billing; requests work again as soon as the payment settles.
Your subscription used its included data plus its overage limit this period. An admin can raise the limit on Billing, effective immediately.
Every chain counts toward the same requests-per-second limit, and so does every process using the key. On pay-as-you-go the limit is 1 per second.
Requests rejected by validation (400, 404 unknown_set) are billed the 10 KB minimum, like any other processed request. Server errors, rate-limited and refused requests are free. See How billing works.
No: the API doesn’t send CORS headers, and a key in a browser would be public. Call it from your backend.

Still stuck?

Email [email protected] with the request body, the response status and body, and the X-Request-Id.