A Stellar indexer for wallets: every transaction, operation and balance change for every account, plus current balances for every asset and token, served over GraphQL.
- Run it against your own stellar-rpc and PostgreSQL. One process ingests the ledger, another serves the API.
- Ask for an account and get its transactions, operations, state changes and balances with cursor pagination.
- Balances cover XLM, classic assets, Stellar Asset Contracts, SEP-41 tokens and liquidity pool shares.
Docs on main describe unreleased behavior. For the version you run, read the docs at its tag: https://github.com/stellar/wallet-backend/tree/<TAG>/docs.
| Component | Version |
|---|---|
| PostgreSQL with the TimescaleDB extension | 17 with TimescaleDB 2.28 or newer |
| stellar-rpc for the same network | 28.x or 29.x |
| Container image | public.ecr.aws/stellar/wallet-backend:<TAG> |
| Go (source builds only) | see go.mod |
| Hardware | runbook: 4 CPU / 16 GiB for the pubnet ingester, 8 CPU / 32 GiB and 1 TB SSD for a year of pubnet history in PostgreSQL; a fraction of that for testnet |
Testnet, one machine, the published image. Needs Docker with Compose v2.
git clone https://github.com/stellar/wallet-backend.git
cd wallet-backend
docker compose upCompose starts TimescaleDB, a testnet stellar-rpc, runs the migrations, then starts ingestion and the API. The first start downloads a checkpoint from the history archive and loads balances before ingesting live ledgers; watch the ingest logs. Ingestion is healthy when this returns {"status":"ok", ...}:
curl -s localhost:8002/healthQuery the API:
curl -s -X POST localhost:8001/graphql/query \
-H 'Content-Type: application/json' \
-d '{"query":"{ accountByAddress(address: \"GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H\") { address balances(first: 5) { edges { node { __typename } } } } }"}'Pin a release with WALLET_BACKEND_VERSION=v1.0.0 docker compose up. For mainnet and real deployments, read Deploying wallet-backend.
| I want to | Read |
|---|---|
| Try it end to end on testnet | Getting started |
| Deploy it: database, ingestion, protocols, API, backfill | Deploying wallet-backend |
| Fill SEP-41 balances and history, or add a protocol on upgrade | Protocols |
| Upgrade between releases | Upgrading |
| Operate it: sizing, alerts, failures | Runbook, Observability |
| Look up a flag or environment variable | Configuration reference |
| Query the API | GraphQL guide, schema reference |
| Sign requests from any language | Request authentication |
| Use the Go client | Go client |
| Understand how it works | Architecture |
| Contribute | CONTRIBUTING, contributor docs |
| See every page | Docs index |
Releases follow semantic versioning from v1.0.0. Within a major version:
- A GraphQL field or enum value is removed only after it has been marked
@deprecatedfor at least one minor release. - Flag and environment variable names do not change.
- Database migrations are forward-only; upgrading is
migrate upwith the new binary.
Release notes list the stellar-rpc, protocol, PostgreSQL and TimescaleDB versions each release was tested with. See Releasing for the cadence.
Bugs and feature requests: GitHub Issues. Questions: see SUPPORT.md.