# สิ่งที่ไม่คิดค่าบริการ: รหัสข้อผิดพลาดและกฎการเรียกเก็บเงิน

> Source: https://docs.blockvectra.com/th/guides/billing-rules/

BlockVectra วัดปริมาณคำขอในหน่วย Compute Units (CU) โดยการเรียก JSON-RPC และ Data API จะถูกคิดค่าบริการหลังจากได้รับคำตอบกลับแล้วเท่านั้น คู่มือนี้สรุปกฎการพิจารณาการเรียกเก็บเงินตามรหัสสถานะ HTTP, การเรียก JSON-RPC และ Data API พร้อมการดำเนินการที่แนะนำสำหรับนักพัฒนา

## รหัสสถานะ HTTP และกฎการเรียกเก็บเงิน

กฎการพิจารณาการเรียกเก็บเงินและการจัดการสำหรับการตอบกลับในระดับ HTTP มีดังนี้:

| สถานะ HTTP | บอดีการตอบกลับ                                                                                                                     | สถานการณ์                                                                                                                                                                                                                 | คิดค่าบริการหรือไม่?                                                                  | การดำเนินการที่แนะนำ                                                                                                                                                                                                                                                    |
| ---------: | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|        200 | การตอบกลับ JSON-RPC (เดี่ยวหรือแบบชุด)                                                                                             | การตอบกลับปกติ; ข้อผิดพลาดในระดับชั้น JSON-RPC ทั้งหมด (ข้อผิดพลาดการแจงส่วน, การปฏิเสธเมธอด, อัปสตรีมล้มเหลว, ข้อผิดพลาดของโหนด) ก็เป็น 200 เช่นกัน                                                                      | ประเมินแยกตามการเรียก                                                                 | ตรวจสอบ `result` หรือ `error` ในแต่ละการเรียก; หากส่งคืนข้อผิดพลาด โปรดดูการจัดการข้อผิดพลาด JSON-RPC ด้านล่าง                                                                                                                                                          |
|        204 | ว่างเปล่า                                                                                                                          | ทุกการเรียกในคำขอเป็นการแจ้งเตือน (notifications)                                                                                                                                                                         | การแจ้งเตือนจะถูกคิดค่าบริการตามปกติ                                                  | ไม่ต้องดำเนินการเพิ่มเติม                                                                                                                                                                                                                                               |
|        400 | ว่างเปล่า                                                                                                                          | ข้อความ HTTP มีรูปแบบไม่ถูกต้อง (ไม่สามารถแจงส่วนบรรทัดคำขอหรือส่วนหัวได้, การเข้ารหัส chunked ไม่ถูกต้อง) หรือระยะเวลาระหว่างการอ่านบอดีคำขอสองครั้งเกิน 10 วินาที                                                       | ไม่                                                                                   | ตรวจสอบไวยากรณ์คำขอ HTTP, ส่วนหัว และความต่อเนื่องของการส่งข้อมูล                                                                                                                                                                                                       |
|        402 | JSON, `-32020`                                                                                                                     | ยอดคงเหลือไม่เพียงพอ, โควตาหมดลง; เมื่อทราบยอดคงเหลือ `error.data` จะรวม `balance_units` และ `balance_cu`                                                                                                                 | ไม่                                                                                   | ตรวจสอบยอดคงเหลือของคุณใน [หน้า Billing](https://console.blockvectra.com/billing/) ของคอนโซล หรือผ่าน `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); เติมเงินบนเชนไปยังที่อยู่เฉพาะของบัญชีคุณ (ดู [คู่มือการเติมเงินของ Agent](https://docs.blockvectra.com/en/guides/agent-topup/)) |
|        403 | ว่างเปล่า                                                                                                                          | เมธอดอื่นนอกเหนือจาก `POST` หรือ `OPTIONS` บน `/v1/{chain}` หรือ `/v1/{chain}/{api_key}` (ไม่ว่าชื่อเชนจะเป็นที่รู้จักหรือไม่ก็ตาม)                                                                                       | ไม่                                                                                   | เปลี่ยนเมธอดคำขอ HTTP เป็น `POST` (หรือ cross-origin `OPTIONS` preflight)                                                                                                                                                                                               |
|        401 | JSON, `-32024` (`missing_api_key` หรือ `invalid_api_key`)                                                                          | ไม่มีคีย์บนเชนที่รู้จัก, คีย์ไม่รู้จัก หรือถูกปิดใช้งาน                                                                                                                                                                   | ไม่                                                                                   | ส่ง API key ที่ใช้งานได้ในส่วนหัว `x-api-key` (คีย์ที่สร้างใหม่หรือเพิ่งหมุนเวียนต้องใช้เวลาสองสามวินาทีจึงจะมีผล; ให้รอสักครู่แล้วลองใหม่)                                                                                                                             |
|        404 | JSON, `-32600` (`reason = unknown_chain`)                                                                                          | `POST` ไปยัง `{chain}` ที่ไม่รู้จัก                                                                                                                                                                                       | ไม่                                                                                   | ตรวจสอบชื่อเชนใน URL เทียบกับ [เชนที่รองรับ](https://docs.blockvectra.com/en/chains/) (ต้องเป็นสลักตัวพิมพ์เล็กตรงกันทุกประการ)                                                                                                                                                                     |
|        404 | บอดีว่างเปล่า (empty body)                                                                                                         | พาธไม่ตรงกัน (เช่น `POST /v1`, `/v1/`, `POST /v1/{chain}/`)                                                                                                                                                               | ไม่                                                                                   | ใส่เชนใน URL (`/v1/{chain}`)                                                                                                                                                                                                                                            |
|        408 | ว่างเปล่า                                                                                                                          | ใช้เวลาเกิน 35 วินาทีจากการอ่านส่วนหัวคำขอจนถึงการส่งคืนการตอบกลับ                                                                                                                                                        | **เป็นไปได้**: การเรียกที่ส่งต่อไปยังโหนดแล้วจะถูกคิดค่าบริการตามปกติเมื่อโหนดตอบกลับ | อย่าลองใหม่สำหรับการเรียกที่เปลี่ยนสถานะ (เช่น `eth_sendRawTransaction`) โดยไม่มีเงื่อนไข; การตัดการเชื่อมต่อของไคลเอนต์ไม่ได้ยกเลิกการเรียกที่ส่งต่อไปแล้ว                                                                                                             |
|        413 | ว่างเปล่า                                                                                                                          | บอดีคำขอ > 2 MiB (2,097,152 ไบต์)                                                                                                                                                                                         | ไม่                                                                                   | ควบคุมบอดีคำขอให้ต่ำกว่า 2 MiB; แยกชุดคำขอออกเป็นคำขอย่อยๆ                                                                                                                                                                                                              |
|  414 / 431 | ว่างเปล่า                                                                                                                          | URI ยาวเกินไป (414) หรือส่วนหัวคำขอมีขนาดใหญ่เกินไป (431)                                                                                                                                                                 | ไม่                                                                                   | ย่อ URI คำขอให้สั้นลง หรือตัดส่วนหัวคำขอ HTTP                                                                                                                                                                                                                           |
|        429 | JSON, `-32005` หรือ `-32022`; มี `Retry-After` สำหรับการจำกัดอัตรา (`-32005`); ขีดจำกัด burst/ขนาดชุด (`-32022`) จะไม่มีส่วนหัวนี้ | ยอดคงเหลือในบักเก็ตหมด → `-32005`; CU คำขอเดี่ยวเกินความจุ burst → `-32022`; ขีดจำกัดอัตราการเรียกของบัญชีหมด → `-32005`; จำนวนการเรียกในคำขอเดี่ยวเกินขีดจำกัด → `-32022`                                                | ไม่                                                                                   | สำหรับ `-32005` ที่มี `Retry-After` ให้รอตามจำนวนวินาทีที่ระบุก่อนลองใหม่; สำหรับ `-32022` ให้แยกคำขอหรือลดขนาดชุด (การลองใหม่โดยไม่แก้ไขจะไม่มีทางสำเร็จ)                                                                                                              |
|        503 | JSON, `-32021` พร้อม `Retry-After`                                                                                                 | ข้อมูลการเรียกเก็บเงินไม่พร้อมใช้งานชั่วคราว; เซิร์ฟเวอร์ปฏิเสธคำขอชั่วคราว (ไม่ใช่ปัญหายอดคงเหลือ ไม่จำเป็นต้องเติมเงิน); คีย์ที่สร้างใหม่จะส่งคืนค่านี้จนกว่าข้อมูลการเรียกเก็บเงินจะซิงค์ (โดยปกติใช้เวลาสองสามวินาที) | ไม่                                                                                   | ไม่ใช่ปัญหายอดคงเหลือ ไม่จำเป็นต้องเติมเงิน; รอตามจำนวนวินาทีที่ระบุใน `Retry-After` แล้วลองใหม่                                                                                                                                                                        |

> หมายเหตุ: เมื่อเข้าถึงผ่าน Cloudflare ทาง Cloudflare อาจส่งคืนหน้าข้อผิดพลาด 52x หรือ 1015 ซึ่งไม่ได้สร้างขึ้นโดยบริการ

> **ส่วนหัวการตอบกลับสำหรับการคิดค่าบริการและยอดคงเหลือ**: เมื่อส่ง `x-bv-meter: 1` ในคำขอ HTTP (ใช้ได้ทั้ง JSON-RPC และ Data API) การตอบกลับที่มีการคิดค่าบริการอย่างน้อยหนึ่งการเรียกจะส่งคืน `x-bv-cu-charged` (Compute Units ที่คิดค่าบริการสำหรับคำขอนี้ หรือผลรวมของการเรียกที่คิดค่าบริการในชุด) และ `x-bv-balance-units` (หน่วยยอดคงเหลือที่เหลืออยู่ในบัญชีทันทีหลังจากการคิดค่าบริการนี้ ซึ่งอาจติดลบได้หากใช้เกิน; จะละเว้นหากไม่ทราบยอดคงเหลือ) คำขอที่ไม่มี `x-bv-meter: 1`, การตอบกลับที่ไม่มีการคิดค่าบริการใดๆ และการตอบกลับข้อผิดพลาด 402, 403, 429 หรือ 503 จะละเว้นส่วนหัวทั้งสองนี้ ส่วนหัวการตอบกลับเหล่านี้สามารถเข้าถึงได้โดยสคริปต์เบราว์เซอร์ผ่าน CORS ในขณะที่ WebSocket จะไม่ใช้ส่วนหัวเหล่านี้ ยอดคงเหลือจะหักการใช้งานที่ยังไม่ได้ชำระทั้งหมดโดยปัดเศษขึ้นเป็นหน่วยเต็มหนึ่งครั้ง; การสรุปยอดรายชั่วโมงจะปัดเศษลง ดังนั้นยอดคงเหลือที่รายงานอาจเพิ่มขึ้นสูงสุดหนึ่งหน่วยหลังจากการสรุปยอด

## รหัสข้อผิดพลาด JSON-RPC และกฎการเรียกเก็บเงิน

รหัสข้อผิดพลาดเดียวกันอาจมาจากแพลตฟอร์มหรือโหนด และ**การเรียกเก็บเงินจะแตกต่างกัน**:

* **ข้อผิดพลาดที่สร้างขึ้นโดยตัวแพลตฟอร์มเอง**: จะไม่คิดค่าบริการเสมอ
* **ข้อผิดพลาดที่ส่งคืนโดยโหนด**: จะถูกส่งต่อตามที่เป็นและคิดค่าบริการตามน้ำหนักของเมธอด โดยมีข้อยกเว้นเฉพาะรหัสข้อผิดพลาดของโหนดที่ระบุด้านล่างเท่านั้น

### รายละเอียดกฎ

* **ข้อผิดพลาดของโหนดที่ไม่คิดค่าบริการ**: `-32002` (batch timeout), `-32003` (batch response too large) และ `-32600` (batch rejected as a whole) ของโหนด บ่งชี้ว่าโหนดละทิ้งการเรียกก่อนกำหนด; ข้อผิดพลาดเหล่านี้รวมถึงการแจ้งเตือน (notifications) ใดๆ ในชุดเดียวกันจะไม่ถูกคิดค่าบริการ ส่วน `-32601` (exposed method not implemented) และ `-32603` (node internal failure) ของโหนด จะไม่คิดค่าบริการผ่าน HTTP หรือ WebSocket และไม่ส่งผลกระทบต่อการเรียกหรือการแจ้งเตือนอื่นๆ ในชุด นอกจากนี้ `4444` (pruned block) และ `-32000` (สถานะย้อนหลังอยู่นอกหน้าต่างประวัติสถานะของโหนด ซึ่งกำหนดโดย `state_window_blocks` ใน `GET /v1/chains`) จะไม่คิดค่าบริการและไม่ส่งผลต่อการเรียกอื่นๆ ในชุด
* **ข้อผิดพลาดของโหนดที่คิดค่าบริการ**: ข้อผิดพลาดอื่นๆ ที่ส่งคืนโดยโหนดจะถูกคิดค่าบริการตามน้ำหนักของเมธอดเมื่อเป็นการรายงานผลลัพธ์ของเชน เช่น `execution reverted` (`-32000` หรือ `3` พร้อม `data`), `-32602 invalid argument` ของตัวโหนดเอง
* **การยอมรับยอดคงเหลือและการซิงค์**: `-32020` ระบุว่ายอดคงเหลือในบัญชีไม่เพียงพอและจำเป็นต้องเติมเงิน; เมื่อทราบยอดคงเหลือ `error.data.balance_units` และ `error.data.balance_cu` จะระบุจำนวนที่เหลืออยู่ (อาจติดลบได้) คีย์ที่สร้างใหม่อาจส่งคืน `-32021` (503) เป็นเวลาสองสามวินาที; ให้รอตาม `Retry-After` แล้วลองใหม่
* **ความล้มเหลวของอัปสตรีม**: `-32603` ที่สร้างโดยแพลตฟอร์มเนื่องจากการสื่อสารกับอัปสตรีมล้มเหลวหรือการตอบกลับมีรูปแบบไม่ถูกต้อง (`upstream unavailable`, `no response from upstream`, `malformed upstream response`) จะมี `data.reason: upstream_unavailable`
* **การคิดค่าบริการการแจ้งเตือน**: การแจ้งเตือน (Notifications 204) จะถูกคิดค่าบริการตามน้ำหนักของเมธอด

### ตารางรหัสข้อผิดพลาด JSON-RPC

|   รหัส | แหล่งที่มา  | HTTP | ข้อความ                                                                        | เหตุผล                                                                                                             | คิดค่าบริการหรือไม่?                  | การดำเนินการที่แนะนำ                                                                                                                                                                                                                                                    |
| -----: | ----------- | ---: | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -32700 | BlockVectra |  200 | `parse error`                                                                  | -                                                                                                                  | ไม่ (ใช้ 1 CU โทเค็นจำกัดอัตรา)       | แก้ไขไวยากรณ์ JSON ของคำขอ                                                                                                                                                                                                                                              |
| -32600 | BlockVectra |  200 | `invalid request`                                                              | `invalid_request`                                                                                                  | ไม่ (ใช้ 1 CU โทเค็นจำกัดอัตรา)       | แก้ไขไวยากรณ์และโครงสร้างคำขอ JSON-RPC                                                                                                                                                                                                                                  |
| -32600 | BlockVectra |  200 | `batch too large: max <N> calls`                                               | `batch_too_large` (+max)                                                                                           | ไม่                                   | แยกชุดคำขอให้มีจำนวนการเรียกต่ำกว่าขีดจำกัด (ขีดจำกัดชุดมาตรฐานคือ 100)                                                                                                                                                                                                 |
| -32600 | BlockVectra |  200 | `invalid request: ambiguous member name`                                       | `invalid_request`                                                                                                  | ไม่                                   | ลบชื่อสมาชิกที่ซ้ำกันหรือไม่ชัดเจนในออบเจกต์ JSON                                                                                                                                                                                                                       |
| -32601 | BlockVectra |  200 | `method not available: <method>`                                               | -                                                                                                                  | ไม่                                   | เรียกใช้เฉพาะเมธอดที่อนุญาตสำหรับเชนนี้เท่านั้น (ดู [เชนที่รองรับ](https://docs.blockvectra.com/en/chains/))                                                                                                                                                                                        |
| -32600 | BlockVectra |  404 | `unknown chain`                                                                | `unknown_chain`                                                                                                    | ไม่                                   | ตรวจสอบชื่อเชนใน URL                                                                                                                                                                                                                                                    |
| -32602 | BlockVectra |  200 | `eth_getLogs block range too large: max <N> blocks`                            | -                                                                                                                  | ไม่                                   | ย่อช่วงบล็อกของ `eth_getLogs` ให้แคบลง (ขีดจำกัดกำหนดแยกตามเชน เช่น 1000 บล็อก)                                                                                                                                                                                         |
| -32602 | BlockVectra |  200 | `tracer not allowed`                                                           | -                                                                                                                  | ไม่                                   | ใช้ native tracer ที่ได้รับอนุญาต (`callTracer`, `flatCallTracer`, `prestateTracer`, `4byteTracer`, `noopTracer` หรือละเว้น)                                                                                                                                            |
| -32602 | BlockVectra |  200 | `trace timeout not allowed`                                                    | -                                                                                                                  | ไม่                                   | กำหนดสตริง Go duration ที่ถูกต้องโดยมี timeout ≤ 30s                                                                                                                                                                                                                    |
| -32010 | BlockVectra |  200 | `node is syncing; calls are temporarily unavailable`                           | -                                                                                                                  | ไม่                                   | โหนดกำลังซิงค์ ลองใหม่ในภายหลัง (ยกเว้น `eth_chainId`)                                                                                                                                                                                                                  |
| -32011 | BlockVectra |  200 | `historical state is not available beyond the most recent <N> blocks`          | -                                                                                                                  | ไม่                                   | สืบค้นบล็อกที่เป็นปัจจุบันมากขึ้น (บล็อกเป้าหมายต้องอยู่ภายในหน้าต่างสถานะ; หลีกเลี่ยงแท็ก safe/finalized/earliest)                                                                                                                                                     |
| -32000 | BlockVectra |  200 | `transaction not found`                                                        | `not_found`                                                                                                        | ไม่                                   | ตรวจสอบแฮชธุรกรรม (`0x` + 64 อักขระฐานสิบหก)                                                                                                                                                                                                                            |
| -32000 | BlockVectra |  200 | `block not found`                                                              | `not_found`                                                                                                        | ไม่                                   | ตรวจสอบแฮชหรือหมายเลขบล็อก                                                                                                                                                                                                                                              |
| -32000 | BlockVectra |  200 | `upstream response too large`                                                  | `response_too_large`                                                                                               | ไม่                                   | จำกัดขอบเขตการสืบค้นให้แคบลงหรือแยกคำขอ                                                                                                                                                                                                                                 |
| -32005 | BlockVectra |  200 | -                                                                              | `overloaded`                                                                                                       | ไม่                                   | เซิร์ฟเวอร์ทำงานหนักเกินไปชั่วคราว ลองใหม่ในภายหลัง                                                                                                                                                                                                                     |
| -32005 | BlockVectra |  429 | `rate limit exceeded`                                                          | `key_rate_limit` / `free_plan_call_limit` / `concurrency_limit`                                                    | ไม่                                   | ลดความถี่ของคำขอ; ปฏิบัติตาม `Retry-After` เมื่อมีระบุ                                                                                                                                                                                                                  |
| -32022 | BlockVectra |  429 | `request cost <N> CU exceeds burst capacity <M> CU`                            | `request_exceeds_burst`                                                                                            | ไม่                                   | แยกคำขอหรือชุดคำขอเพื่อให้ CU ของคำขอเดี่ยวต่ำกว่าความจุ burst                                                                                                                                                                                                          |
| -32022 | BlockVectra |  429 | `request has <N> calls, exceeding the free-plan limit of <M> calls per second` | `free_plan_batch_too_large` (+max)                                                                                 | ไม่                                   | แยกชุดคำขอให้อยู่ภายใต้ขีดจำกัดต่อวินาที หรืออัปเกรดเป็นแพ็กเกจชำระเงิน                                                                                                                                                                                                 |
| -32603 | BlockVectra |  200 | `upstream unavailable`                                                         | `upstream_unavailable`                                                                                             | ไม่                                   | การสื่อสารกับอัปสตรีมล้มเหลว ลองใหม่ในภายหลัง                                                                                                                                                                                                                           |
| -32603 | BlockVectra |  200 | `no response from upstream`                                                    | `upstream_unavailable`                                                                                             | ไม่                                   | อัปสตรีมไม่ตอบสนอง ลองใหม่ในภายหลัง                                                                                                                                                                                                                                     |
| -32603 | BlockVectra |  200 | `malformed upstream response`                                                  | `upstream_unavailable`                                                                                             | ไม่                                   | การตอบกลับของอัปสตรีมมีรูปแบบไม่ถูกต้อง ลองใหม่ในภายหลัง                                                                                                                                                                                                                |
| -32603 | BlockVectra |  200 | -                                                                              | -                                                                                                                  | ไม่                                   | ข้อผิดพลาดภายในที่เกิดขึ้นไม่บ่อย ลองใหม่ในภายหลัง                                                                                                                                                                                                                      |
| -32020 | BlockVectra |  402 | `insufficient balance`                                                         | `balance_exhausted` / `free_grant_exhausted` (+topup\_url และ +`balance_units` / `balance_cu` เมื่อทราบยอดคงเหลือ) | ไม่                                   | ตรวจสอบยอดคงเหลือของคุณใน [หน้า Billing](https://console.blockvectra.com/billing/) ของคอนโซล หรือผ่าน `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); เติมเงินบนเชนไปยังที่อยู่เฉพาะของบัญชีคุณ (ดู [คู่มือการเติมเงินของ Agent](https://docs.blockvectra.com/en/guides/agent-topup/)) |
| -32021 | BlockVectra |  503 | `billing data temporarily unavailable`                                         | -                                                                                                                  | ไม่                                   | ข้อมูลการเรียกเก็บเงินกำลังซิงค์ (ไม่ใช่ปัญหายอดคงเหลือ); รอตามวินาทีของ `Retry-After` แล้วลองใหม่                                                                                                                                                                      |
|   4444 | Node        |  200 | `pruned history unavailable`                                                   | -                                                                                                                  | ไม่                                   | บล็อกที่ร้องขอถูกตัดตอน (pruned) โดยโหนด; ไม่คิดค่าบริการ; ไม่ส่งผลต่อชุดคำขอ                                                                                                                                                                                           |
| -32000 | Node        |  200 | `historical state ... is not available`                                        | -                                                                                                                  | ไม่                                   | อยู่นอกหน้าต่างประวัติสถานะของโหนด; ไม่คิดค่าบริการ; ไม่ส่งผลต่อชุดคำขอ                                                                                                                                                                                                 |
| -32000 | Node        |  200 | `old data not available due to pruning...`                                     | -                                                                                                                  | ไม่                                   | อยู่นอกหน้าต่างประวัติของโหนด (หน้าต่างกำหนดโดย `state_window_blocks`); ไม่คิดค่าบริการ; ไม่ส่งผลต่อชุดคำขอ                                                                                                                                                             |
| -32002 | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | ไม่                                   | โหนดหมดเวลาในชุดคำขอและละทิ้งการเรียก; ไม่คิดค่าบริการ; การแจ้งเตือนในชุดก็ไม่คิดค่าบริการเช่นกัน                                                                                                                                                                       |
| -32003 | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | ไม่                                   | การตอบกลับชุดคำขอของโหนดมีขนาดใหญ่เกินไปและถูกละทิ้ง; ไม่คิดค่าบริการ; การแจ้งเตือนในชุดก็ไม่คิดค่าบริการเช่นกัน                                                                                                                                                        |
| -32601 | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | ไม่                                   | เมธอดที่เปิดเผยไม่ได้ถูกนำไปใช้งานโดยโหนด; ให้ใช้เมธอดอื่นที่รองรับ                                                                                                                                                                                                     |
| -32603 | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | ไม่                                   | ความล้มเหลวภายในของโหนด; ให้ลองใหม่พร้อม backoff                                                                                                                                                                                                                        |
| -32600 | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | ไม่                                   | ทั้งชุดคำขอถูกปฏิเสธโดยโหนด; ไม่คิดค่าบริการ; การแจ้งเตือนในชุดก็ไม่คิดค่าบริการเช่นกัน                                                                                                                                                                                 |
|  อื่นๆ | Node        |  200 | `<node message>`                                                               | -                                                                                                                  | **คิดค่าบริการ** (ตามน้ำหนักของเมธอด) | ผลลัพธ์ของเชน (เช่น `execution reverted`, `-32602` ของโหนด); ตรวจสอบพารามิเตอร์การเรียกสัญญา                                                                                                                                                                            |

## กฎการเรียกเก็บเงินของ Data API

Data API ห่อหุ้มข้อมูลเชนแบบอ่านอย่างเดียวไว้ใน REST endpoint โดยการคิดค่าบริการและการจัดการข้อผิดพลาดจะเป็นไปตามกฎเหล่านี้:

### รายละเอียดกฎ

* คิดค่าบริการเฉพาะการตอบกลับที่สำเร็จระดับ 2xx เท่านั้น
* การดำเนินการที่ไม่พร้อมใช้งานซึ่งอยู่นอกเหนือความครอบคลุม (เช่น เชนที่ไม่รองรับ หรือบล็อกที่อยู่นอกความครอบคลุมของ trace) จะส่งคืน HTTP 422 `no_coverage` ซึ่งไม่คิดค่าบริการแต่นับรวมในขีดจำกัดอัตรา
* การตอบกลับ HTTP 401, 402, 404 และ 429 ไม่คิดค่าบริการ สำหรับส่วนหัวการตอบกลับ (`x-bv-meter: 1`) โปรดดู [รหัสสถานะ HTTP และกฎการเรียกเก็บเงิน](#http-status-codes-and-billing-rules)

### ตารางรหัสสถานะ Data API

| สถานะ HTTP | รหัสข้อผิดพลาด / สถานการณ์                                                                                                                  | คิดค่าบริการหรือไม่?                                      | การดำเนินการที่แนะนำ                                                                                                                                                                                                                                                    |
| ---------: | ------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|        200 | การตอบกลับข้อมูลสำเร็จ                                                                                                                      | **คิดค่าบริการ** (ตามน้ำหนัก CU ของการดำเนินการ Data API) | แจงส่วน `data`, `meta` และ `next_cursor` ใน envelope ของการตอบกลับ                                                                                                                                                                                                      |
|        400 | พารามิเตอร์คำขอมีรูปแบบไม่ถูกต้องหรือขาดฟิลด์ที่จำเป็น                                                                                      | ไม่                                                       | ตรวจสอบและแก้ไขพารามิเตอร์ query หรือ body                                                                                                                                                                                                                              |
|        402 | ยอดคงเหลือหมด (`error.code: "insufficient_balance"` รวม `balance_units` และ `balance_cu` เมื่อทราบยอดคงเหลือ)                               | ไม่                                                       | ตรวจสอบยอดคงเหลือของคุณใน [หน้า Billing](https://console.blockvectra.com/billing/) ของคอนโซล หรือผ่าน `GET /v1/topup/deposit-address` (MCP `get_deposit_address`); เติมเงินบนเชนไปยังที่อยู่เฉพาะของบัญชีคุณ (ดู [คู่มือการเติมเงินของ Agent](https://docs.blockvectra.com/en/guides/agent-topup/)) |
|        401 | ไม่มี API key, คีย์ไม่รู้จัก หรือถูกปิดใช้งาน (`error.code: "missing_api_key"` หรือ `"invalid_api_key"`)                                    | ไม่                                                       | ส่ง API key ที่ใช้งานได้ในส่วนหัว `x-api-key`                                                                                                                                                                                                                           |
|        404 | เชนไม่รู้จักหรือไม่ใช่สาธารณะ (`error.code: "not_found"`) หรือออบเจกต์ที่ร้องขอไม่มีอยู่                                                    | ไม่                                                       | ตรวจสอบสลักเชนใน URL (ต้องเป็นตัวพิมพ์เล็กตรงกันทุกประการ) และพาธคำขอ                                                                                                                                                                                                   |
|        409 | บล็อกหรือหน้าต่างที่ร้องขอสูงกว่าความสูงที่จัดทำดัชนีในปัจจุบัน (`error.code: "not_indexed_yet"` รวม `indexed_through`)                     | ไม่                                                       | สืบค้นบล็อกได้สูงสุดถึง `indexed_through` หรือลองใหม่ในภายหลัง                                                                                                                                                                                                          |
|        422 | การดำเนินการเฉพาะเชนไม่พร้อมใช้งาน (เช่น เชนที่ไม่รองรับ หรืออยู่นอกความครอบคลุมของ trace, `error.code: "no_coverage"`)                     | ไม่ (นับรวมในขีดจำกัดอัตรา)                               | ตรวจสอบฟีเจอร์ที่รองรับผ่าน `GET /v1/status` (ฟรี, `data_features` แบบไม่ใช้คีย์)                                                                                                                                                                                       |
|        429 | เกินขีดจำกัดอัตรา (`error.code: "rate_limited"`) หรือคำขอเดี่ยวมีค่าใช้จ่ายมากกว่าความจุ burst ของคีย์ (`error.code: "cost_exceeds_burst"`) | ไม่                                                       | ลดความถี่ของคำขอ; แยกคำขอที่มีขนาดใหญ่เกินไป (คำขอที่เกินความจุ burst จะไม่มีทางสำเร็จหากส่งในรูปแบบเดิม)                                                                                                                                                               |
|        503 | บริการข้อมูลไม่พร้อมใช้งานชั่วคราว (`error.code: "unavailable"`) หรือเชนไม่ว่าง (`error.code: "gateway_overloaded"`)                        | ไม่                                                       | ลองใหม่ในภายหลังและปฏิบัติตาม `Retry-After` เมื่อมีระบุ                                                                                                                                                                                                                 |

## ตรวจสอบยอดคงเหลือ (`GET /v1/account`)

ผู้ถือ API key สามารถตรวจสอบยอดคงเหลือและรายละเอียดโควตาของคีย์ได้โดยตรง โดยไม่มีค่าใช้จ่ายหรือหัก Compute Units (CU) ใดๆ:

```bash
curl -H "x-api-key: $BLOCKVECTRA_API_KEY" https://api.blockvectra.com/v1/account
```

* **ฟรีและไม่คิดค่าบริการ**: `GET /v1/account` เป็นบริการฟรี จะไม่ถูกคิดค่าบริการ ไม่หัก CU และส่งคืน HTTP 200 พร้อมยอดคงเหลือปัจจุบันแม้ว่าจะเป็นศูนย์หรือติดลบก็ตาม (ไม่มีทางส่งคืน 402)
* **การยืนยันตัวตน**: การยืนยันตัวตนด้วยคีย์จะใช้ส่วนหัว `x-api-key` เท่านั้น (ไม่รับคีย์ในพาธและ Bearer token) หากไม่มีส่วนหัวจะส่งคืน 401 `missing_api_key`; คีย์ที่ไม่ถูกต้องหรือถูกเพิกถอนจะส่งคืน 401 `invalid_api_key` (คีย์ที่หมดอายุจะส่งคืน 403 `key_expired`; บริการที่ไม่พร้อมใช้งานชั่วคราวจะส่งคืน 503 `auth_unavailable` หรือ `billing_unavailable` พร้อม `Retry-After`)
* **การจำกัดอัตรา**: มีขีดจำกัดอิสระที่ 5 คำขอต่อวินาทีต่อ key ID โดยไม่ขึ้นกับการวัดปริมาณและการเรียกเก็บเงินของ CU การส่งคำขอเกินขีดจำกัดจะส่งคืน HTTP 429 `rate_limited` พร้อมส่วนหัว `Retry-After`

ฟิลด์การตอบกลับ:

* `key_id`: สตริงตัวระบุของ API key
* `plan`: ประเภทแพ็กเกจของบัญชี (`free` เมื่อบัญชีมีโควตาอัตราการเรียกของแพ็กเกจฟรี; นอกนั้นเป็น `paid`)
* `balance_units`: ยอดคงเหลือในบัญชีที่เหลืออยู่ในหน่วย units (อาจเป็นศูนย์หรือติดลบได้)
* `balance_cu`: ยอดคงเหลือที่แปลงเป็น Compute Units (CU)
* `balance_as_of_age_ms`: มิลลิวินาทีที่ผ่านไปนับตั้งแต่การอ่านยอดคงเหลือจากแหล่งข้อมูล
* `key`: ขีดจำกัดเฉพาะของคีย์และรายละเอียดโควตา:
  * `cu_per_sec`: อัตราการเติม token-bucket ในหน่วย CU ต่อวินาที
  * `burst_cu`: ความจุ burst ของ token-bucket ในหน่วย CU
  * `cu_cap`: เพดาน CU ตลอดอายุการใช้งานสำหรับคีย์นี้ หรือ `null` หากไม่ได้จำกัดเพดาน
  * `cu_cap_remaining`: CU ที่เหลืออยู่ภายใต้ `cu_cap` หรือ `null` หากไม่ได้จำกัดเพดาน (อาจเป็นศูนย์หรือติดลบได้)
  * `expires_at`: การประทับเวลาหมดอายุตาม RFC 3339 หรือ `null` หากคีย์ไม่มีวันหมดอายุ

ตัวอย่างการตอบกลับ:

```json
{
  "key_id": "<key_id>",
  "plan": "<plan>",
  "balance_units": <integer>,
  "balance_cu": <integer>,
  "balance_as_of_age_ms": <integer>,
  "key": {
    "cu_per_sec": <integer>,
    "burst_cu": <integer>,
    "cu_cap": <integer_or_null>,
    "cu_cap_remaining": <integer_or_null>,
    "expires_at": "<expires_at_or_null>"
  }
}
```

## การกำหนดราคาและการอัปเกรด

ค่าใช้จ่ายเฉพาะสำหรับการเรียกที่คิดค่าบริการทั้งหมดจะพิจารณาจากน้ำหนัก CU ที่ประกาศไว้:

* หากต้องการตรวจสอบน้ำหนักของเมธอดและการดำเนินการทั้งหมด โปรดดู [ตารางน้ำหนักเมธอด](https://blockvectra.com/en/pricing/) และ [กฎการวัดปริมาณ CU ของ JSON-RPC](https://docs.blockvectra.com/en/api/json-rpc/#cu-metering-rules)
* สำหรับรายละเอียดราคาของแพ็กเกจและการสรุปยอด โปรดดู [หน้าราคา](https://blockvectra.com/en/pricing/)
* การอัปเกรดเป็นแพ็กเกจชำระเงิน: การเติมเงินแบบชำระเงินจะยกเลิกขีดจำกัดการเรียกต่อวินาทีของแพ็กเกจฟรี โดยแต่ละคีย์ยังคงอยู่ภายใต้อัตรา CU และขีดจำกัด burst

### กระบวนการเติมเงินบนเชน

เมื่อยอดคงเหลือในบัญชีของคุณไม่เพียงพอหรือคุณต้องการ throughput ที่สูงขึ้น ให้เติมเงินบนเชนในคอนโซลตามขั้นตอนเหล่านี้:

1. **เข้าสู่ระบบคอนโซล**: ลงชื่อเข้าใช้ [BlockVectra Console](https://console.blockvectra.com/login/?next=%2Fbilling%2F)
2. **ไปที่หน้า Billing**: นำทางไปยัง [หน้า Billing](https://console.blockvectra.com/billing/)
3. **รับที่อยู่เฉพาะของคุณ**: ในการ์ดการเติมเงินบนเชน ให้คัดลอกที่อยู่การเติมเงินเฉพาะของบัญชีคุณหรือสแกนคิวอาร์โค้ด
4. **โอนเงิน**: โอนเงินโดยใช้เครือข่ายและ USDC / USDT / USDG ที่รองรับตามที่ระบุไว้ในหน้าดังกล่าวเท่านั้น เครือข่ายที่รองรับและจำนวนเงินเติมขั้นต่ำจะแสดงอยู่ในคอนโซล
5. **บันทึกเครดิตอัตโนมัติ**: เมื่อตรวจพบบนเชนแล้ว ธุรกรรมจะแสดงสถานะเป็น "Processing"; และเมื่อบันทึกเครดิตแล้ว เครดิตจะถูกเพิ่มเข้าสู่ยอดคงเหลือของคุณโดยอัตโนมัติ

> **ข้อควรระวังสำคัญ**:
>
> * ใช้เฉพาะเครือข่ายและโทเค็นที่ระบุไว้อย่างชัดเจนในคอนโซลเท่านั้น การโอนบนเชนที่ไม่รองรับหรือใช้โทเค็นที่ไม่ถูกต้องจะไม่สามารถบันทึกเครดิตโดยอัตโนมัติได้
> * ตรวจสอบให้แน่ใจว่าการโอนแต่ละครั้งมียอดถึงจำนวนเติมเงินขั้นต่ำที่ระบุไว้ในคอนโซล
> * เมื่อการเติมเงินแบบชำระเงินครั้งแรกได้รับการบันทึกเครดิตแล้ว บัญชีของคุณจะได้รับการอัปเกรดเป็นบัญชีชำระเงิน ซึ่งจะยกเลิกขีดจำกัดการเรียกต่อวินาทีของแพ็กเกจฟรี

โปรแกรม Agent หรือเซิร์ฟเวอร์สามารถเรียก endpoint การเติมเงินได้โดยตรงโดยใช้ API key; ดูที่ [คู่มือการเติมเงินแบบเป็นโปรแกรมของ Agent](https://docs.blockvectra.com/en/guides/agent-topup/)

## การคิดค่าบริการ Webhook Push

บริการ Push มีน้ำหนักแยกต่างหากสำหรับอีเวนต์ข้อมูลที่ส่งมอบสำเร็จ, การสืบค้นประวัติที่สำเร็จ และ address-days ที่คิดค่าบริการได้ การเรียกการจัดการนอกเหนือจากประวัติอีเวนต์, ความพยายามส่งมอบที่ล้มเหลว, การลองใหม่อัตโนมัติ และอีเวนต์ควบคุมจะไม่มีค่าบริการ อีเวนต์ที่ส่งมอบแต่ละรายการจะถูกคิดค่าบริการครั้งเดียว; การเล่นซ้ำของลูกค้าและอีเวนต์ตามสายหลัก (canonical events) ที่ส่งมอบซ้ำหลังจากการ reorg ถือเป็นการส่งมอบที่คิดค่าบริการใหม่ ค่าบริการที่อยู่จะใช้จำนวนที่อยู่สูงสุดของการสมัครรับข้อมูลแต่ละรายการขณะออนไลน์ระหว่างวันตามเวลา UTC; โควตาที่อยู่ฟรีของบัญชีจะถูกแชร์ร่วมกันในทุกการสมัครรับข้อมูล โดยการสมัครรับข้อมูลที่เก่ากว่าจะได้รับสิทธิ์ก่อน ที่อยู่หนึ่งที่อยู่ในสองการสมัครรับข้อมูลจะถูกนับสองครั้ง; การเพิ่มเชนจะเปลี่ยนค่าธรรมเนียมอีเวนต์ ไม่ใช่ค่าธรรมเนียมที่อยู่

ดู [คู่มือ Blockchain Webhook API](https://docs.blockvectra.com/en/guides/webhook-push/) สำหรับการตั้งค่า, [การตรวจสอบลายเซ็น](https://docs.blockvectra.com/en/guides/webhook-push/#verify-signatures) และ [การกู้คืนการส่งมอบ](https://docs.blockvectra.com/en/guides/webhook-push/#delivery-retries-and-replay) [คู่มือการชำระเงินด้วยสเตเบิลคอยน์](https://docs.blockvectra.com/en/guides/stablecoin-payments/) ครอบคลุมการตรวจสอบใบเสร็จและการโพลข้อมูลย้อนหลัง; [การสมัครรับข้อมูล WebSocket](https://docs.blockvectra.com/en/guides/websocket-subscriptions/) ใช้การวัดปริมาณการเชื่อมต่อและการแจ้งเตือนของตนเอง ข้อผิดพลาดของคำขอแสดงอยู่ใน [ข้อมูลอ้างอิงข้อผิดพลาด](https://docs.blockvectra.com/en/errors/) น้ำหนักด้านล่างนำมาจาก `GET /v1/plans`

| การใช้งาน | หน่วยการเรียกเก็บเงิน | CU |
| --- | --- | --- |
| `push.address_day` | ที่อยู่-วันที่คิดค่าบริการ | 33 |
| `push.history` | คำขอประวัติที่สำเร็จ | 25 |
| `push.log` | เหตุการณ์ข้อมูลที่ส่งมอบแล้ว | 150 |
| `push.native_transfer` | เหตุการณ์ข้อมูลที่ส่งมอบแล้ว | 150 |
| `push.token_transfer` | เหตุการณ์ข้อมูลที่ส่งมอบแล้ว | 150 |

ที่อยู่ฟรีต่อบัญชีต่อวัน UTC: 1000

โควตาที่อยู่ฟรีต่อบัญชีต่อวัน UTC ซึ่งแชร์ร่วมกันในทุกกลุ่มการสมัครรับข้อมูลโดยไม่คำนึงถึงแพ็กเกจ สำหรับแต่ละกลุ่ม จะนับจำนวนที่อยู่สูงสุดในขณะออนไลน์ระหว่างวันนั้น โดยจัดสรรโควตาตามลำดับ ID กลุ่มจากน้อยไปมาก หากที่อยู่เดียวกันอยู่ในสองกลุ่มจะนับสองครั้ง จำนวนเชนในกลุ่มจะไม่ทวีคูณจำนวนที่อยู่ กลุ่มที่ออฟไลน์หรือถูกลบตลอดทั้งวันจะไม่ถูกนำมาคำนวณ สำหรับแต่ละกลุ่ม จำนวนที่เหลือหลังจากหักส่วนแบ่งโควตาแล้ว จะถูกคูณด้วยน้ำหนัก CU ของ `push.address_day` ใน `method_weights` โควตาที่กำหนดค่าไว้ในปัจจุบันมาจากนโยบายราคาเดียวกันกับที่ใช้สำหรับค่าบริการที่อยู่-วัน ซึ่งไม่ใช่ขีดจำกัดความจุของบัญชีหรือโควตาแยกต่างหากต่อกลุ่ม

ตัวอย่าง: เหตุการณ์ native.transfer ที่ส่งมอบแล้ว 10 เหตุการณ์, คำขอประวัติที่สำเร็จ 2 คำขอ และที่อยู่-วันที่คิดค่าบริการ 10 ที่อยู่-วัน มีค่าใช้จ่าย 10 × 150 + 2 × 25 + 10 × 33 = 1880 CU ที่อยู่-วันที่คิดค่าบริการจะถูกนับหลังจากหักโควตาที่อยู่ฟรีของบัญชีแล้ว

## ขั้นตอนถัดไป

* [เลือกดูไดเรกทอรีชุดข้อมูล](https://blockvectra.com/en/data/) เพื่อดูชุดข้อมูลทั้งหมดที่ BlockVectra จัดทำดัชนี
* [ดูแพ็กเกจฟรีและการกำหนดราคา](https://blockvectra.com/en/pricing/#free) เพื่อตรวจสอบสิทธิประโยชน์ในบัญชีของคุณ
* [เข้าสู่ระบบคอนโซล](https://console.blockvectra.com/login/?next=%2Fkeys%2F) เพื่อสร้าง API key
