정산 피드를 읽고 주소, 토큰, 블록으로 필터링하려면 어떻게 합니까?
전송과 거래 · 스캐너가 정산한 모든 스테이블코인 전송을 최신순으로, 지급자, 수신자, 토큰, 블록, 확정성으로 필터링
- API 가이드
- 9분
- 중급
- 개발자
- GET /v1/transfers
GET /v1/transfers?chain=이 피드입니다. 한 네트워크의 스테이블코인 전송을 최신순으로, 한 페이지에 50개씩(1–200) 제공하며, 각 행에는 tx_hash, block_number, block_time, payer, recipient, decimals가 포함된 amount 객체, token 컨트랙트, finality, 양쪽 끝의 라벨이 있습니다. payer=, recipient=, token=, block=, finality=로 필터링하고, cursor=로 페이지를 넘깁니다. 이 주소가 관련된 필터는 없습니다 — payer와 recipient를 따로 조회해 합치십시오. 첫 페이지에는 total(25,000에서 상한)과 hot_window_start가 있습니다. 더 오래된 행은 없는 것이 아니라 보관 처리된 것입니다.
요청
curl -s 'https://stablescan.achivx.com/v1/transfers?chain=1&limit=3'이더리움(Ethereum), 2026-10-24 10:45 UTC:
{
"items": [
{"tx_hash": "0x2b3252e52889309dcf91d8b24034d28a01d247e6229189e05e16409a1eb12ac3", "log_index": 483,
"block_number": 26261992, "block_time": "2026-10-24T10:45:23Z",
"payer": "0x4299e0cc76db02763a5dd5b737d8bcbc878e6ccb",
"recipient": "0x6872b6630a3afcd3117191a8403c2002e13df7de", "recipient_name": "Unidentified custodial service 0x6872b663",
"recipient_category": "custodial", "recipient_is_service": true,
"amount": {"amount": "1047600000", "decimals": 6, "token": "USDC"},
"token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"finality": "pending",
"usd_amount": 1047.6},
{"tx_hash": "0xb050f766…0e6c", "log_index": 454, "block_number": 26261992, "block_time": "2026-10-24T10:45:23Z",
"payer": "0x10a456be…9db5", "recipient": "0xad33886c…169a",
"amount": {"amount": "3000000000", "decimals": 6, "token": "USDT"}, "token": "0xdac17f95…1ec7", "finality": "pending"},
{"…": "…"}
],
"next_cursor": "MTc5MjgzODcyMzAwMDAwMDAwMDo0NDc6NzFkOGU5ODli…",
"total": 25000,
"capped": true,
"hot_window_start": "2026-10-22T00:00:00Z"
}첫 번째 요청의 헬퍼 세 개로 한 같은 호출:
Python
page = scan("/v1/transfers", chain=1, recipient=addr, token="USDC", limit=50)
for row in page["items"]:
units = int(row["amount"]["amount"]); dec = row["amount"]["decimals"]
print(row["block_time"], row["payer"], "->", row["recipient"], units / 10**dec, row["amount"]["token"], row["finality"])
print("matching rows:", page.get("total"), "archived before:", page.get("hot_window_start"))Go
type transfer struct {
TxHash string `json:"tx_hash"`
BlockNumber int64 `json:"block_number"`
BlockTime time.Time `json:"block_time"`
Payer string `json:"payer"`
Recipient string `json:"recipient"`
Amount struct {
Amount string `json:"amount"`
Decimals int `json:"decimals"`
Token string `json:"token"`
} `json:"amount"`
Finality string `json:"finality"`
}
var page struct {
Items []transfer `json:"items"`
NextCursor string `json:"next_cursor"`
Total *int64 `json:"total"`
HotWindowStart string `json:"hot_window_start"`
}
q := url.Values{"chain": {"1"}, "recipient": {addr}, "token": {"USDC"}, "limit": {"50"}}
if err := get("/v1/transfers", q, &page); err != nil {
return err
}TypeScript
type Transfer = {
tx_hash: string; log_index: number; block_number: number; block_time: string;
payer: string; recipient: string; payer_name?: string; recipient_name?: string;
amount: { amount: string; decimals: number; token: string }; token: string;
finality: "final" | "pending"; usd_amount?: number;
};
type Page = { items: Transfer[]; next_cursor?: string; prev_cursor?: string; total?: number | null; total_unavailable_reason?: string; capped?: boolean; hot_window_start?: string };
const page = await scan<Page>("/v1/transfers", { chain: 1, recipient: addr, token: "USDC", limit: 50 });필드별 설명
items[] — 거래당이 아니라 전송당 한 행입니다. 스테이블코인 전송이 두 개인 거래는 tx_hash가 같고 log_index가 다른 두 행입니다(2026-10-24의 솔라나 페이지가 정확히 그랬습니다). payer와 recipient는 네트워크의 표기 방식을 따릅니다. 라벨 목록(label book)이 그 끝에 이름을 붙인 경우 payer_name, payer_category, payer_is_service와 그 수신자 쪽 짝이 나타납니다. amount.amount는 최소 단위 문자열이며 amount.decimals와 함께, 심볼은 amount.token에 있습니다. 그 옆의 token은 컨트랙트 주소입니다. usd_amount는 표시용으로 같은 전송을 일반 십진수로 나타낸 것이며, 페그가 신뢰할 만할 때 있습니다. finality는 final 또는 pending입니다.
next_cursor, prev_cursor — 불투명한 값입니다. 같은 필터와 함께 cursor=로 되돌려 보내십시오. total은 첫 페이지(커서 없음)에만 있습니다. 일치하는 행의 개수이며, 일치하는 것이 없으면 0, 집계가 거기서 멈추면 "capped": true와 함께 25000, 끝나지 않으면 total_unavailable_reason: "timeout"과 함께 null입니다 — 행은 실제이므로 계속 페이지를 넘기십시오. 그 페이지는 no-store입니다.
hot_window_start — 그 이전의 원시 전송이 콜드 아카이브로 옮겨진 시점입니다(그날은 2026-10-22T00:00:00Z: 이더리움에서 약 이틀 분량의 핫 행). 더 오래된 쪽으로 페이지를 넘기다 행이 떨어지면 기록의 끝이 아니라 아카이브 경계입니다. 빈 응답을 받은 ?tx= 조회는 이보다 오래된 거래와 일어나지 않은 거래를 구별할 수 없으므로, unknown으로 취급하십시오.
필터
| 매개변수 | 기능 | 참고 |
|---|---|---|
chain | 네트워크 | 넘기십시오. 없으면 피드는 베이스(Base)의 것입니다 |
payer, recipient | 한쪽 끝, 네트워크의 표기 방식으로 | 결합 필터 없음: 둘 다 조회해 tx_hash + log_index로 합치십시오 |
token | 심볼 또는 컨트랙트 주소 | USDT는 USDT0이 아닙니다 |
tx | 한 거래의 전송 | 응답에 chain_id와 chain_source가 설정됩니다. 거래 찾기를 참고하십시오 |
block | 한 블록의 전송 | 양의 블록 번호. 이 경우 total은 정확합니다(블록 26261992에서 31행) |
finality | final 또는 pending | 기본적으로 둘 다 나열됩니다 |
dir | older(기본값) 또는 newer | 커서와 함께 newer를 쓰면 앞으로 페이지를 넘깁니다 |
limit | 1–200, 기본값 50 | 그 외의 값은 400 invalid_limit |
cursor | 이전 페이지의 next_cursor | 같은 필터와 함께, 아니면 400 invalid_cursor |
offset | 기존 오프셋 페이지 이동 | cursor를 권장합니다 |
이것이 전부입니다. 다른 매개변수는 모두 400 unknown_param이며, 메시지에 허용되는 매개변수가 나열됩니다.
캐시
Cache-Control: public, max-age=15 — 피드는 15초 단위로 최신입니다. EVM 네트워크의 가장 최근 행은 몇 블록 동안 pending입니다. 정산 결정에는 finality: "final"이 필요하거나, 네트워크의 확정성 이후 한 번 더 확인해야 합니다(그 시각 이더리움의 확정된 블록은 헤드보다 74블록 뒤처져 있었으며, 동기화 상태가 그 차이를 알려 줍니다).
Stablecoin scanner ACHIVX에서
- 실시간 피드: /v1/transfers?chain=1&limit=5. 바이낸스(Binance) 핫월렛이 지급한 것으로 필터링: &payer=0x28C6…1d60.
- 막대, 필터, 페이지 이동기가 있는 페이지로 본 같은 행: /transactions.
출처
- REST 인터페이스의 OpenAPI 3.1 명세(API 1.4.0)
- 에이전트 매뉴얼 — agents.md(버전 2026-10-05)
- GET /v1/transfers?chain=1&limit=3(2026-10-24 조회)
더 알아보기
관련 질문
- 코드에서 피드를 페이지 단위로 읽고 응답을 캐시하려면 어떻게 합니까?
- 해시로 거래를 찾으려면 어떻게 합니까: /v1/verify 또는 /v1/transfers?tx=?
- 레시피: 결제가 도착했고 동결되지 않았는지 확인하기
전송과 거래 · GET /v1/transfers · 2026-10-24 작성, openapi.json, agents.md 및 당일 실제 호출 기반. 구조는 인용한 것이며, 수치는 날짜 기준이고 인덱스에 따라 바뀝니다.
이 페이지는 ACHIVX Academy 영어 원문을 한국어로 옮긴 것입니다. 번역과 원문이 다르면 영어 원문이 기준입니다.