---
title: "Monthly value moved through an address, per token"
method: POST
path: "/v1/address-flows"
tags: ["Graph"]
---

# Monthly value moved through an address, per token

`POST /v1/address-flows`

## Request

- Base URL: `https://intelapi.publicaml.org`
- URL: `https://intelapi.publicaml.org/v1/address-flows`
- Auth: one of:
  - API key in header `X-API-Key`
  - none

Turnover per month per token — how much moved through, in and out.

**This is not a balance and cannot be used to derive one.** Sums of movement do not reconcile to holdings.

ethereum only: the monthly aggregate is built and validated for that chain and other chains are rejected rather than answered approximately.

## Request body

- object
  - `address` string, required: The address to look up, in its normal display form. * bitcoin — base58 (`1…`, `3…`) or bech32/bech32m (`bc1…`, `bc1p…`). Case is SIGNIFICANT for base58; do not lowercase it. A 64-character lowercase TRANSACTION HASH is also accepted here: on bitcoin the graph is bipartite (address → transaction → address), so a transaction is a node with its own neighbours and its own findings. CoinJoin is classified on the transaction, not on the participants, and this is how you read it. * ethereum, bsc — `0x` + 40 hex characters, any case. * tron — base58 (`T…`, 34 characters); the `0x` 20-byte form is accepted too and is what the API stores and echoes.
  - `chain` 'ethereum', required: ethereum only. Other chains are a 400.
  - `since` union: Default: the last 12 months.
    - integer
    - string
  - `until` union
    - integer
    - string
  - `granularity` 'month'
  - `token` string
  - `top_tokens` integer: Ranked by movement count.
  - `include_native` boolean: Native ETH movement, with the caveat the response attaches.

## Response `200`

Monthly turnover per token.

- object

## Other responses

- `400`: Malformed request. A numeric parameter that is not a number answers `invalid_parameters`: `invalid[]` names every bad field with the reason and the accepted range, and `limits` lists the ranges of all numeric fields of this endpoint. A number OUTSIDE its range is not an error: it is pinned to the range and named in `clamped` (where the response has one).
- `429`: One of two things, told apart by `error`: * `rate limit exceeded` — your hourly quota (anonymous callers, and keys issued with a quota of their own). Wait `retry_after` seconds; authenticating removes the limit. * `server_busy` — this endpoint is a graph walk or a range scan, and the server is already running as many of those at once as it admits. Nothing was charged for the work. Retry the SAME request after `Retry-After` seconds (a few); do not split it into smaller calls, that multiplies the load that caused the refusal.
- `500`: Server error.

---

[API](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api.md) · [All operations](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api/revisions/7c0c6315088c?raw)
