# 답은 어떤 것일 수 있습니까? REST, A2A, MCP의 모든 상태와 코드

REST API · 접근 경로마다 봉투 하나. 스캐너가 응답할 수 있는 모든 코드, 그 의미, 그리고 다음에 할 일

*에이전트용 · 10분 · 고급 · 개발자 · 코드*

봉투는 세 가지입니다. REST: HTTP 상태와 JSON `error`이며, 그 `code`는 OpenAPI 설명이 열거하는 35개 값 중 하나이고, `message`에는 수정 방법이 담겨 있습니다. 상태가 아니라 코드에 따라 분기하십시오. A2A: 응답이 있는 모든 요청은 JSON-RPC `result` 또는 `error`가 담긴 HTTP 200이며, 코드는 모두 열두 개입니다. 알림(notification)의 `204`, 요청 한도에 따른 `429`, 그리고 `GET`만 JSON-RPC 밖에 있습니다. `id`가 없는 요청은 알림이며, 아무것도 실행하지 않고 `204`로 응답합니다. MCP: 전송 계층의 거부에는 일반 텍스트 HTTP 상태, 세션·알 수 없는 메서드·알 수 없는 도구에만 JSON-RPC 오류, 그리고 입력과 읽기에 관한 모든 것은 `isError: true`인 도구 결과로 돌아오며 그 텍스트가 해야 할 일을 밝힙니다. 아래의 모든 코드는 OpenAPI 설명, 설명서, 그리고 2026-10-13에 읽은 응답에서 메시지와 함께 가져온 것입니다.

## 어떤 답이든 읽는 방법

접근 경로는 세 가지, 습관은 하나입니다. **코드를 읽고, 그다음 메시지를 읽고, 그다음 행동하십시오**. 메시지는 보여 주고 그에 따라 행동하도록 쓰여 있습니다. 입력에는 *고쳐서 다시 보내기*, 기한 초과에는 *기다렸다가 한 번 다시 시도*, 일부를 잃은 읽기에는 *다시 요청*입니다. 세 가지 봉투는 다음과 같습니다.

**REST** — HTTP 상태와 `{"error": {"code": "<one of 35>", "message": "<what to fix, where there is a fix>", "request_id": "…"}}`. [openapi.json](https://stablescan.achivx.com/openapi.json)의 `Error` 스키마는 이를 한 줄로 말합니다. *Machine-readable reason. Branch on this, not on the HTTP status.*(기계가 읽을 수 있는 사유. HTTP 상태가 아니라 이것에 따라 분기하십시오.) 모든 오류 응답은 `Cache-Control: no-store`이며 `X-Request-Id`가 붙습니다. **A2A** — `id`가 있는 모든 요청에 HTTP 200. `{"jsonrpc": "2.0", "error": {"code": <number>, "message": "…", "data": {…}}, "id": <yours, or null when it could not be read>}`. `id` 멤버가 없는 요청은 JSON-RPC 알림입니다. 서버는 빈 본문과 함께 HTTP `204`로 응답하고 아무것도 실행하지 않습니다. 항상 `id`를 보내십시오. **MCP** — 세 가지 형태가 있습니다. 한 줄짜리 본문이 있는 일반 텍스트 HTTP 상태(전송 계층의 거부), 세션과 호출 자체에 대한 JSON-RPC 오류, 그리고 텍스트가 유형이 정해진 메시지인 `isError: true` 도구 결과입니다.

## REST, 상태별

모든 `400`은 메시지에 수정 방법을 담고 있습니다. 메시지가 지목한 매개변수를 고쳐서 다시 보내십시오.

| 상태 | 코드 | 메시지와 그것이 요구하는 것 |
|---|---|---|
| `200` | — | 답입니다. 결론을 내리기 전에 그 자체의 필드(`unknown`, `null`, `[]`, `no-store`)를 읽으십시오 |
| `201` | — | `POST /v1/watchlists`: 규칙이 생성되었습니다 |
| `202` | — | `/v1/addresses/{a}/graph`: `{"status": "building", "retry_after_seconds": 5, "note": "…", "request_id": "…"}`와 `Retry-After: 5`, `no-store` — 그래프도 오류도 아닙니다. 기다린 뒤 같은 요청을 반복하십시오 |
| `301` | — | `/.well-known/agent.json` → 에이전트 카드 |
| `304` | — | `If-None-Match`가 `ETag`와 일치했습니다. 본문은 이미 가지고 있는 것입니다 |
| `400` | `invalid_chain` | 허용되는 표기가 메시지에 나열됩니다(`chain: unrecognised value "0x1"` *— pass a chain id (-1, 1, 10, 56, 8453, 42161, 728126428), the same id as a string, a network slug … or a CAIP-2 id …*(체인 id(-1, 1, 10, 56, 8453, 42161, 728126428), 같은 id의 문자열, 네트워크 슬러그 … 또는 CAIP-2 id …를 넘기십시오)). `/v1/freezes?tx=`, `/v1/freezes/proposals`, `/v1/freezes/guide`에서는 짧은 형식 `chain must be a valid chain id`. 조치 기록부에서는 `chain is empty: name a network (id, slug or CAIP-2), or leave the parameter off`. `unknown chain id — see GET /v1/networks for the chains this deployment serves` — `/v1/stats/home`이 보기를 가지고 있지 않은 네트워크에 대한 `/v1/stats/home?chain=`의 응답이기도 합니다 |
| `400` | `invalid_address` | 표기에서 무엇을 파싱할 수 없었는지 파서의 말로 밝힙니다. 조치 기록부에서는 *address is empty: name the address the act names, or leave the parameter off*(address가 비어 있음: 조치가 지목한 주소를 지정하거나, 매개변수를 생략하십시오). 솔라나(Solana)에 대해 `0x…` 또는 `T…` 주소를 요청하면 *invalid address for chain -1 (Solana): a Solana address is a 32-byte base58 public key, and this one is `<n>` bytes — ask with the chain it belongs to, or omit chain to let its spelling choose*(체인 -1(솔라나)에 대해 잘못된 주소: 솔라나 주소는 32바이트 base58 공개 키인데 이것은 `<n>`바이트입니다 — 주소가 속한 체인으로 요청하거나, chain을 생략해 표기가 고르게 하십시오) |
| `400` | `invalid_limit` | `limit must be 1..200`([제안](https://achivx.kr/academy/guides/issuer-freezes/) 목록은 대신 값을 보정합니다. 1–500 밖의 값은 100으로 읽습니다) |
| `400` | `unknown_param` | `/v1/transfers`, `/v1/freezes/acts`, `/v1/freezes/proposals`에서 `unknown query parameter "x" — accepted filters: …`. `/v1/verify`에서는 `… — accepted: tx (every indexed network is searched; to look on one network use /v1/transfers?tx=&chain=)`. 그 밖의 곳에서는 알 수 없는 매개변수를 무시합니다 |
| `400` | `invalid_cursor` | *invalid pagination cursor*(잘못된 페이지 커서). [제안](https://achivx.kr/academy/guides/issuer-freezes/) 목록에서는 *cursor is empty: pass the next_cursor of the previous page, or leave the parameter off for the newest one*(cursor가 비어 있음: 이전 페이지의 next_cursor를 넘기거나, 가장 최근 페이지를 원하면 매개변수를 생략하십시오), 조치 기록부에서는 *cursor is empty: name the next_cursor of the previous page, or leave the parameter off*(cursor가 비어 있음: 이전 페이지의 next_cursor를 지정하거나, 매개변수를 생략하십시오). `cursor and tx cannot be combined: a transaction's proposals are one complete answer, and the listing is what pages` |
| `400` | `invalid_tx` | *tx is required: the transaction hash (0x-hex on EVM chains, bare hex on Tron, base58 signature on Solana)*(tx가 필요합니다: 거래 해시(EVM 체인에서는 0x-hex, 트론에서는 접두사 없는 hex, 솔라나에서는 base58 서명)). [제안](https://achivx.kr/academy/guides/issuer-freezes/) 목록에서는 *tx is empty: … or leave the parameter off entirely for the whole listing*(tx가 비어 있음: … 또는 전체 목록을 원하면 매개변수를 아예 생략하십시오). `/v1/verify`에서는 *tx is not a transaction id on any indexed network: 32-byte hex (0x-prefixed or bare) on the EVM networks and Tron, a 64-byte base58 signature on Solana*(tx는 인덱싱된 어느 네트워크의 거래 id도 아닙니다: EVM 네트워크와 트론에서는 32바이트 hex(0x 접두사 있음 또는 없음), 솔라나에서는 64바이트 base58 서명) |
| `400` | `invalid_token`, `unknown_token` | `token is empty: name a token symbol or contract address, or leave the parameter off`; `token not enabled on this chain` |
| `400` | `invalid_kind`, `invalid_status`, `invalid_finality` | `kind must be one of freeze, unfreeze, seize — the values of a row's action`. 조치 기록부에서 빈 값은 `kind is empty: name freeze, unfreeze or seize, or leave the parameter off`. `status must be one of pending, executed, failed, revoked, superseded, stale`; `finality must be 'final' or 'pending'` |
| `400` | `invalid_dir` | [피드](https://achivx.kr/academy/courses/following-the-stablecoins/following-the-stablecoins-01-settlement-tables/)에서는 `dir must be 'older' or 'newer'`. [제안](https://achivx.kr/academy/guides/issuer-freezes/) 목록에서는 `dir must be older (toward older proposals, the default) or newer (toward newer ones); dir=newer with no cursor is the oldest page`와 `dir and tx cannot be combined: a transaction's proposals are one complete answer, and the listing is what pages` |
| `400` | `invalid_window` | 경로마다 다릅니다. 토큰별 순위는 `window must be 24h, 7d or 30d`, `/v1/stats/home`은 `window must be one of 24h, 7d, 30d`, [탐색](https://achivx.kr/academy/reference/glossary/#g-walk)은 `invalid window "x" (use 1h\|24h\|7d\|30d\|90d\|1y\|all)`(그래프는 같은 텍스트를 `bad_request`로 응답합니다) |
| `400` | `invalid_days`, `invalid_block` | `days must be an integer in 1..3650`; `block must be a positive block number` |
| `400` | `invalid_hops`, `invalid_frontier_cap` | [탐색](https://achivx.kr/academy/reference/glossary/#g-walk)의 깊이와 폭: *hops must be an integer 0-4*(hops는 0-4의 정수여야 합니다); *frontier_cap must be an integer 1-500*(frontier_cap은 1-500의 정수여야 합니다) |
| `400` | `invalid_stop_at_attributed`, `invalid_stop_on_sanctioned` | [탐색](https://achivx.kr/academy/reference/glossary/#g-walk)의 두 스위치: `stop_at_attributed must be true\|false`; `stop_on_sanctioned must be true\|false` |
| `400` | `invalid_query`, `invalid_per_chain` | `/v1/search`: *q must be 2..64 characters*(q는 2..64자여야 합니다). 토큰별 순위(`/v1/tokens/{token}/addresses`, `…/routes`): *per_chain must be 1-50*(per_chain은 1-50이어야 합니다) |
| `400` | `invalid_body`, `invalid_rule` | 두 `POST` 경로: *invalid JSON body*(잘못된 JSON 본문), *malformed JSON*(형식이 잘못된 JSON), *body is not valid JSON*(본문이 유효한 JSON이 아님), *body and attestation are required*(body와 attestation이 필요함). 검증에 실패한 [관심 목록(watchlist)](https://achivx.kr/academy/guides/watchlists-and-alerts/) 규칙은 그 사유와 함께 |
| `400` | `invalid_public_key`, `no_key` | `/v1/verify-attestation`: *public_key must be a base64url raw Ed25519 key*(public_key는 base64url 원시 Ed25519 키여야 합니다); *no public_key supplied and this deployment has no signing key*(public_key가 제공되지 않았고 이 배포에는 서명 키가 없습니다) |
| `400` | `bad_request` | 자체적인 말로 입력을 거부하는 읽기 — `token "USDC" is not indexed on chain 728126428`, `unknown token "X"`, 그래프의 `invalid window "x" (use 1h\|24h\|7d\|30d\|90d\|1y\|all)` — 메시지가 곧 수정 방법입니다 |
| `401` | `unauthorized` | *valid bearer service key required*(유효한 bearer 서비스 키 필요) — 키가 설정된 호스트의 [관심 목록](https://achivx.kr/academy/guides/watchlists-and-alerts/). 운영자에게서 키를 받으십시오 |
| `404` | `not_found` | *no route for GET /v1/…. The /v1 surface is described in …/agents.md.*(GET /v1/…에 대한 경로 없음. /v1 영역은 …/agents.md에 설명되어 있습니다.) (실제 경로에는 없는 끝 슬래시가 경로에 있으면 *Without the trailing slash it is GET /v1/…*(끝 슬래시를 빼면 GET /v1/…입니다)라는 힌트가 붙거나, 가까운 실제 읽기를 지목합니다). `DELETE /v1/watchlists/{id}`에서는 *rule not found*(규칙 없음). 데이터 읽기에서는 *not found*(없음). [MCP](https://stablescan.achivx.com/mcp) 엔드포인트가 설정되지 않은 곳의 서버 카드 별칭 `/.well-known/mcp/server-card.json`과 `/.well-known/mcp.json`에서는 *this deployment serves no MCP endpoint*(이 배포는 MCP 엔드포인트를 제공하지 않습니다) |
| `405` | `method_not_allowed` | 실제 `/v1` 경로에 잘못된 메서드 — `<METHOD> is not served on /v1/…; it answers GET, HEAD`(2026-10-14의 `DELETE /v1/networks`) — 그리고 `Allow` 헤더가 올바른 메서드를 밝힙니다 |
| `429` | `rate_limited` | *too many requests*(요청이 너무 많음) — 분당 1,200건 한도(초당 20건, 버스트 40). `Retry-After`에 따라 간격을 두고, 쉬지 않고 반복하지 마십시오 |
| `500` | `internal` | *internal error*(내부 오류)([`/openapi.json`](https://stablescan.achivx.com/openapi.json)에서는 *OpenAPI document unavailable*(OpenAPI 문서를 사용할 수 없음)) — 스캐너 자체의 문제입니다. 보고할 때 `request_id`를 인용하십시오 |
| `503` | `timeout` | *the read behind GET /v1/… did not finish within the 5s request deadline; retrying may succeed*(GET /v1/… 뒤의 읽기가 5초 요청 기한 안에 끝나지 않았습니다. 다시 시도하면 성공할 수 있습니다)(또는 *within its time budget*(시간 예산 안에)), `Retry-After: 5` — 기다렸다가 한 번 다시 시도하십시오. 쓰기의 경우: *the request behind POST … did not finish within …; it may or may not have been applied — check its effect before repeating it*(POST … 뒤의 요청이 … 안에 끝나지 않았습니다. 적용되었을 수도 있고 아닐 수도 있습니다 — 반복하기 전에 결과를 확인하십시오), `Retry-After` 없음 |
| `503` | `snapshot_pending` | *this view has not been assembled yet — the landing snapshot is built by a batch, retry shortly*(이 보기는 아직 만들어지지 않았습니다 — 랜딩 스냅샷은 배치로 만들어지므로 잠시 후 다시 시도하십시오), `Retry-After: 60` — 배치가 아직 만들지 않은 보기에 대한 `/v1/stats/home` |
| `503` | `not_ready` | *database unavailable*(데이터베이스를 사용할 수 없음) — `GET /ready`에서만 |
| `503` | `disabled` | *watchlist/alerts API is disabled (no service key configured)*(관심 목록/알림 API가 비활성화됨(서비스 키가 설정되지 않음)) — 그 [배포](https://achivx.kr/academy/reference/glossary/#g-deployment)에는 [관심 목록](https://achivx.kr/academy/guides/watchlists-and-alerts/) 서비스가 없습니다. 다른 경우는 `401`입니다 |
| 봉투 없는 `5xx` | — | 스캐너가 아니라 엣지(Cloudflare)입니다. `request_id`가 없고 `Retry-After: 120`입니다. 대상에 대해서는 아무것도 말하지 않습니다 — 간격을 두고 다시 시도하되, 결코 비어 있는 것으로 읽지 마십시오 |

서른다섯 개 코드가 `Error` 스키마의 enum입니다. 각 경로 자체의 목록과, §6이 말하듯 어느 경로든 응답할 수 있는 다섯 개 `internal`, `method_not_allowed`, `not_found`, `rate_limited`, `timeout`입니다. 이 페이지에 인용한 메시지는 [접근 경로](https://achivx.kr/academy/courses/the-scanner-for-machines/the-scanner-for-machines-01-the-doors/)가 실제로 응답하는 것이며, 2026-10-13에 확인했습니다.

## A2A, 오류 코드별(id가 있으면 항상 HTTP 200)

`-32602`는 항상 메시지에 수정 방법을 담고 있으며, 같은 실수는 REST에서는 코드가 붙은 `400`, [MCP](https://stablescan.achivx.com/mcp)에서는 도구 오류로 응답합니다. 범위는 접근 경로마다 다를 수 있습니다(REST의 `hops`는 0–4, A2A는 `>= 0`만). 세 가지 응답은 JSON-RPC 밖에 있습니다. 알림의 `204`(표의 첫 행), `429`는 JSON-RPC가 아니라 `Retry-After`가 붙은 REST 봉투(`code: rate_limited`)이므로 §6이 말하듯 헤더에 따라 간격을 두십시오. 그리고 `GET /a2a`는 `Allow: POST`와 평평한 본문 `{"error": "method_not_allowed", "use": "POST", "see": "…/.well-known/agent-card.json"}`이 붙은 `405`입니다. 여기서 `error`는 REST 객체가 아니라 문자열입니다. 그러니 POST하십시오.

| 코드 | 이름과 메시지 | 언제, 그리고 무엇을 할지 |
|---|---|---|
| `204` (HTTP) | — | 요청에 `id` 멤버가 없습니다. 알림이므로 아무것도 실행되지 않고 아무것도 응답되지 않습니다 — `id`를 추가하십시오 |
| `-32700` | *Parse error*(파싱 오류) | 본문이 JSON이 아닙니다 — JSON을 보내십시오 |
| `-32600` | *Invalid Request: …*(잘못된 요청: …) | *jsonrpc must be 2.0*(jsonrpc는 2.0이어야 함, 맨 `{"method": …}`); *method required*(method 필요); *id must be a string, number or null*(id는 문자열, 숫자 또는 null이어야 함); *body exceeds 1 MiB*(본문이 1 MiB를 초과함); *batch requests are not supported — send one request per call*(배치 요청은 지원되지 않음 — 호출당 요청 하나를 보내십시오) — 봉투를 고치십시오 |
| `-32601` | `Method not found: <name>` | 스킬 id도 A2A 1.0 핵심 작업도 아닌 모든 메서드 — `message/stream` 같은 0.3 시대의 슬래시 이름 포함. 스킬 id 여덟 개는 카드의 `methods`입니다 |
| `-32602` | *Invalid params: …*(잘못된 매개변수: …) | *address required*(address 필요); 체인 표기, 또는 `unknown chain id — this scanner indexes the chains listed in the agent card's networks[]`; *invalid cursor*(잘못된 커서); `limit must be 1..200`; 파싱되지 않는 `payer` 또는 `recipient` 필터(파서의 사유와 함께); 잘못된 JSON 유형의 매개변수, `<field> expects <kind>`(또는 `params do not match the expected shape`); `token`이 없는 [탐색](https://achivx.kr/academy/reference/glossary/#g-walk), 또는 *window must be one of 1h, 24h, 7d, 30d, 90d, 1y, all*(window는 1h, 24h, 7d, 30d, 90d, 1y, all 중 하나여야 함), *hops must be >= 0*(hops는 >= 0이어야 함), *frontier_cap must be >= 0*(frontier_cap은 >= 0이어야 함); `GetTask`/`CancelTask`에서 *id required*(id 필요); `SendMessage`에서: *message required*(message 필요), *message.messageId required (creator-generated, e.g. a UUID)*(message.messageId 필요(작성자가 생성, 예: UUID)), `message.role must be "ROLE_USER"`, *message.parts must contain at least one part*(message.parts에 파트가 하나 이상 있어야 함), *send exactly one data part per message (one skill invocation per SendMessage)*(메시지당 데이터 파트를 정확히 하나 보내십시오(SendMessage당 스킬 호출 하나)), *the data part must be `{"skill": "<id>", "params": {…}}`; skills: …*(데이터 파트는 `{"skill": "<id>", "params": {…}}`여야 함; 스킬: …), `unknown skill "x"; skills: …` — 고쳐서 다시 보내십시오 |
| `-32001` | *TaskNotFoundError: …* | `GetTask` / `CancelTask`(작업은 존재하지 않습니다 — `ListTasks`는 빈 페이지로 응답합니다), 그리고 `taskId`를 지정한 `SendMessage`: 그것 없이 메시지를 보내십시오 |
| `-32003` | *PushNotificationNotSupportedError: push notifications are not supported (capabilities.pushNotifications=false); every SendMessage answers immediately, so there is nothing to notify about*(푸시 알림은 지원되지 않습니다(capabilities.pushNotifications=false). 모든 SendMessage는 즉시 응답하므로 알릴 것이 없습니다) | 네 가지 푸시 알림 설정 작업 |
| `-32004` | *UnsupportedOperationError: streaming is not supported (the agent card declares capabilities.streaming=false); use SendMessage — every answer is immediate*(스트리밍은 지원되지 않습니다(에이전트 카드가 capabilities.streaming=false를 선언함). SendMessage를 사용하십시오 — 모든 답은 즉시 옵니다); *… no extended agent card (the public card at /.well-known/agent-card.json is the complete card; everything here is public and unauthenticated)*(… 확장 에이전트 카드 없음(/.well-known/agent-card.json의 공개 카드가 완전한 카드입니다. 여기의 모든 것은 공개되어 있으며 인증이 없습니다)) | `SendStreamingMessage`, `SubscribeToTask`, `GetExtendedAgentCard` |
| `-32005` | *ContentTypeNotSupportedError: file parts are not accepted — send a data part `{"skill": "<id>", "params": {…}}` or a text part*(파일 파트는 받지 않습니다 — 데이터 파트 `{"skill": "<id>", "params": {…}}` 또는 텍스트 파트를 보내십시오) | 메시지 안의 파일 파트 |
| `-32009` | *VersionNotSupportedError: …*, `data.supportedVersions: ["1.0"]` | 헤더 없는 핵심 작업(`missing A2A-Version header is interpreted as protocol 0.3 (spec §3.6.2), which this interface does not serve — send 'A2A-Version: 1.0'`), 서로 다른 값이 여러 개인 경우, 또는 1.0이 아닌 버전 — `A2A-Version: 1.0`을 정확히 하나 보내십시오 |
| `-32050` | *deadline exceeded*(기한 초과), `data: {"reason": "timeout", "retryable": true, "read": "<skill>"}` | 스킬 메서드와 `SendMessage` 모두에서 읽기가 요청 기한을 넘겼습니다 — 기다렸다가 한 번 다시 시도하십시오 |
| `-32603` | *internal error*(내부 오류) | `SendMessage`의 그 밖의 모든 경우 — `X-Request-Id`를 인용하십시오 |
| `-32000` | *internal error*(내부 오류) | 스킬 메서드의 그 밖의 모든 경우 — `X-Request-Id`를 인용하십시오 |

## MCP

**일반 HTTP로 — 한 줄짜리 텍스트 본문, 봉투 없음.** `Retry-After`가 붙은 `429` `too many requests` — [MCP](https://stablescan.achivx.com/mcp)는 REST와 같은 속도의 자체 예산을 가지고 있습니다. 헤더에 따라 간격을 두십시오. `500` `internal error` — 요청 id를 인용하십시오. `404` `session not found` — 보낸 `Mcp-Session-Id`를 더 이상 알 수 없습니다. 예를 들어 직접 `DELETE /mcp`로 닫은 뒤입니다. `initialize`를 다시 보내고 새 헤더를 사용하십시오. `400` `Bad Request: Unsupported protocol version (supported versions: …)` — 서버 카드가 나열하는 네 가지 중 하나를 보내십시오. `415` `Content-Type must be 'application/json'`; `400` `Accept must contain both 'application/json' and 'text/event-stream'`(`GET`에서는 `Accept must contain 'text/event-stream' for GET requests`); `400` `Bad Request: GET requires an Mcp-Session-Id header`(`DELETE`에서는 같은 줄에 `DELETE`) — `/mcp`를 여는 브라우저에는 대신 연결 방법이 표시됩니다. 본문이 JSON이 아닌 `POST`는 `400` `malformed payload: …`(JSON-RPC `-32700`이 아닙니다 — 담을 봉투가 없기 때문입니다); `400` `POST requires a non-empty body`; 배치 배열에는 `400` `JSON-RPC batching is not supported in 2025-06-18 and later (request version: …)` — 호출당 요청 하나, 그리고 모든 호출에 협상된 `MCP-Protocol-Version`을 보내십시오. 그 밖의 메서드에는 `Allow: GET, POST, DELETE`가 붙은 `405` `Method Not Allowed`. 이 중 어느 것에도 `error.code`가 없습니다. 상태와 그 한 줄을 읽으십시오.

**JSON-RPC 오류로.** `initialize` 전의 호출, 또는 `Mcp-Session-Id` 헤더 없는 호출은 `method "<name>" is invalid during session initialization`과 함께 `code: 0`으로 응답합니다(2026-10-13에 `tools/list`로 확인). 먼저 `initialize`를 보내고, 그것이 반환하는 헤더를 보관해 이후의 모든 호출에 보내십시오. 여덟 개 중 하나가 아닌 도구를 지정한 `tools/call`은 `unknown tool "<name>"`과 함께 `-32602`로 응답합니다. 이름은 스킬 id 여덟 개에서 하이픈을 밑줄로 바꾼 것입니다. 프로토콜에 없는 메서드 이름은 `-32601`로 응답합니다.

**`isError: true`인 도구 결과로 — 텍스트가 해야 할 일을 밝힙니다.** 도구가 읽을 수 없는 입력은 결코 JSON-RPC 오류가 아니라 이 방식으로 돌아옵니다. *unknown chain id — this scanner does not index it; pass one of the chains the chain argument lists*(알 수 없는 체인 id — 이 스캐너는 이것을 인덱싱하지 않습니다. chain 인수가 나열하는 체인 중 하나를 넘기십시오); [레지스트리](https://achivx.kr/academy/reference/glossary/#g-registry)가 모르는 `chain` 표기(허용되는 형식이 텍스트에 포함됨); 파싱되지 않는 주소(파서의 말로), 그리고 위의 REST 표에 인용한 솔라나 거부; `get_wallet_graph_walk`에서 `token is required — this tool does not guess which stablecoin you mean; enabled on this chain: …. Each asset hub page names its own token (e.g. /usdt-explorer → token "USDT")`(점 자리에는 활성화된 심볼이 나열됨); *limit must be 1..200*(limit은 1..200이어야 함); *invalid cursor*(잘못된 커서); 그리고 인수의 유형이 잘못되었을 때 `validating "arguments": …`. 읽기 자체는 다음과 같이 응답할 수 있습니다. *busy: too many concurrent reads on this server; retry shortly*(busy: 이 서버에 동시 읽기가 너무 많습니다. 잠시 후 다시 시도하십시오) — 아무것도 읽지 않았습니다. 잠시 후 다시 시도하십시오. *timeout: the read did not finish within the deadline; retrying may succeed*(timeout: 읽기가 기한 안에 끝나지 않았습니다. 다시 시도하면 성공할 수 있습니다) — 기다렸다가 한 번 다시 시도하십시오. *cancelled: the call was cancelled before the read finished*(cancelled: 읽기가 끝나기 전에 호출이 취소되었습니다) — 직접 취소한 것이므로 할 일이 없습니다. *internal error*(내부 오류) — `X-Request-Id`를 인용하십시오. `get_address_risk`와 `get_address_exposure`는 판정을 최대 60초(`time_budget` 중단 뒤에는 10초) 동안 재사용하므로, 그 시간 안에 반복하면 같은 `computed_at`으로 응답합니다. 중단은 `incomplete_reasons`에 밝혀집니다.

## 거부가 아닌 답, 그리고 각각이 요구하는 단계

- `202` *building* — `retry_after_seconds`만큼 기다렸다가 같은 요청을 반복하십시오.
- `304` — 가지고 있는 본문을 유지하십시오.
- 등급 또는 `exposure`가 `unknown` — `incomplete_reasons`를 읽으십시오. *어느 쪽으로도 판단 결과 없음*으로 보고하십시오. `time_budget` 뒤에는 반복하기 전에 간격을 두십시오.
- 주소 또는 동기화 응답의 `null`, `"total": null`, `degraded_reason`이 있는 `/graph`, `/v1/verify`의 `found: null` — `no-store`로 제공됩니다. 다시 요청하십시오.
- `/v1/stats/home` 또는 `/v1/stats/overview`에서 `organic_unavailable_reason` 옆의 `null` — 배치의 상태입니다. 다시 요청해도 채워지지 않습니다.
- `freeze: []`, `frozen_elsewhere: []`, `freeze_proposals: []` — 목록을 있는 그대로 읽으십시오. 어느 것도 깨끗하다는 증명이 아닙니다.
- 솔라나의 `coverage_status` `pending` 또는 `partial` — `pending`: 나중에 다시 요청하십시오. 답이 늘어날 수 있습니다. `partial`: 채우기가 문서화된 경계에서 멈췄고 나중에 다시 채워집니다. 최종이 아니며, 답은 여전히 늘어날 수 있습니다. *둘 다 `unknown`의 형제로 취급하십시오*.

[정직성 계약이란 무엇입니까?](https://achivx.kr/academy/for-agents/what-is-the-honesty-contract/)에서 각각의 의미를 자세히 설명합니다.

## Stablecoin scanner ACHIVX에서

[openapi.json 열기 ↗](https://stablescan.achivx.com/openapi.json)

- `Error` 스키마의 enum으로 된 REST 코드 35개: [/openapi.json](https://stablescan.achivx.com/openapi.json). §6의 세 가지 접근 경로의 거부: [/agents.md](https://stablescan.achivx.com/agents.md).
- 메시지에 표기가 담긴 실제 `400 invalid_chain`: [/v1/addresses/0x098B716B8Aaf21512996dC57EB0615e2383E2f96?chain=0x1](https://stablescan.achivx.com/v1/addresses/0x098B716B8Aaf21512996dC57EB0615e2383E2f96?chain=0x1). 설명서를 가리키는 실제 `404 not_found`: [/v1/nothing-here](https://stablescan.achivx.com/v1/nothing-here).

## 출처

- [REST 영역의 OpenAPI 3.1 설명(API 1.4.0)](https://stablescan.achivx.com/openapi.json)
- [에이전트 설명서 — agents.md(버전 2026-10-05)](https://stablescan.achivx.com/agents.md)
- [GET /v1/addresses/{address}?chain=0x1(2026-10-13에 읽음)](https://stablescan.achivx.com/v1/addresses/0x098B716B8Aaf21512996dC57EB0615e2383E2f96?chain=0x1)
- [GET /v1/nothing-here(2026-10-13에 읽음)](https://stablescan.achivx.com/v1/nothing-here)

## 더 알아보기

- [한도는 무엇이며, 거부는 어떤 모습입니까?](https://achivx.kr/academy/for-agents/what-are-the-limits-and-refusals/)
- [정직성 계약이란 무엇입니까?](https://achivx.kr/academy/for-agents/what-is-the-honesty-contract/)
- [레슨: 하나의 질문, 세 가지 접근 경로](https://achivx.kr/academy/courses/the-scanner-for-agents/the-scanner-for-agents-02-one-question-three-doors/)

## 관련 질문

- [에이전트 카드는 무엇을 선언하며, A2A로 스킬을 어떻게 호출합니까?](https://achivx.kr/academy/for-agents/what-the-agent-card-declares/)
- [Stablecoin scanner ACHIVX MCP 서버는 어떻게 연결합니까?](https://achivx.kr/academy/for-agents/how-to-connect-the-mcp-server/)
- [한도는 무엇이며, 거부는 어떤 모습입니까?](https://achivx.kr/academy/for-agents/what-are-the-limits-and-refusals/)

REST API · 코드 · 2026-10-13 작성, 스캐너 자체의 기계용 문서와 그날 읽은 실시간 응답을 바탕으로 했습니다. 형태는 인용이며, 수치는 날짜가 붙어 있고 인덱스와 함께 바뀝니다.

---

출처: https://achivx.kr/academy/for-agents/every-answer-code-on-every-door/ · 영어 원문: https://achivx.com/academy/for-agents/every-answer-code-on-every-door.html
