Skip to main content
Follow everything a Soroban contract emits, such as a lending pool’s deposits and borrows, with the Activity API. You read the contract’s events from a start ledger, remember the last ledger scanned, and ask again from the next ledger. To see only the events that name one user, filter by topic instead. Set these once in your terminal. The sample values are real Testnet data, so the read examples return real results.
This recipe uses a busy Testnet lending pool, one of its borrowers and a recent ledger:

Read events from a ledger

Contract activity needs a start ledger (since_ledger). Ascending order reads oldest first:
The route also returns the contract’s token movements (kind token_transfer) when the contract is a token. type is the event name (topic 0), topics and data are decoded from XDR, and the exact topics_xdr and data_xdr are included too.

Keep following new events

The follower starts at the current tip and polls. A request whose since_ledger is past the newest published ledger returns an empty, complete page whose scanned_through_ledger is that newest ledger, so one cheap call finds where “now” is.
Save scanned after each round in your database, as in Sync history to a database, so a restart continues where it stopped. Deduplicate on (network, id). get retries rate_limited, busy, index_not_ready and unavailable after Retry-After, at most 5 times. It stops on a Retry-After over 60 seconds (the daily Testnet cap, which resets at 00:00 UTC) and on query_timeout, which must not be repeated unchanged: lower limit and restart from the saved ledger.

Only events that name an address

Pass topic1, topic2 or topic3 with a G..., C..., B... or L... address to get only the contract’s events with that address at that topic position, from the whole history and without a start ledger. Add name to match one event name. In this pool the user is topic 3:
Use one topicN per request. To find an address’s events across every contract, use GET /accounts/{id}/contract-events. The follower above works with a topic filter too: add the same parameters to each request.

Credits

On Testnet the follower is free: it costs 0 credits, and its 2,880 requests a day (one poll every 30 seconds) count toward your daily Testnet cap of 10,000 requests. On Mainnet: Polling every 30 seconds costs at least 14,400 credits a day on plain contract activity, about 432,000 a month. That is more than the Free plan’s 250,000 (used up in about 17 days, then 402), and fits Starter. With a topic filter the same follower costs about 86,400 a month. To spend less, poll less often or use a webhook with contract_addr, which pushes each event for 1 credit per delivered event. See Limits and credits.

Next