สตรีม WebSocket
การหมดเวลาการเชื่อมต่อ
- เซิร์ฟเวอร์จะปิดการเชื่อมต่อ WebSocket หลังจากไม่มีการใช้งานเป็นเวลา 60 วินาที (Connection Keep-Alive)
- ความไม่มีกิจกรรม หมายถึง การไม่มีคำขอที่ส่งโดยไคลเอนต์
การเชื่อมต่อแบบคงอยู่
หากต้องการให้การเชื่อมต่อ WebSocket ทำงานอยู่ คุณต้อง
- ส่งคำขอเป็นระยะทุก ๆ 50 วินาที
- จัดการการตัดการเชื่อมต่อที่อาจเกิดขึ้นในตรรกะของแอปพลิเคชันของคุณอย่างเหมาะสม
การอนุญาต
การแนะนำ
ก่อนที่จะลงนามคำขอ WebSocket ใด ๆ คุณต้องสร้างคีย์ API ในบัญชีส่วนตัว Cryptomus ของคุณ
มีคำแนะนำโดยละเอียดสำหรับการสร้างคีย์ API ที่นี่
การรับโทเค็นแบบใช้ครั้งเดียวสำหรับการเชื่อมต่อ
ก่อนที่จะเชื่อมต่อกับเซิร์ฟเวอร์ WebSocket คุณต้องได้รับโทเค็นการตรวจสอบสิทธิ์แบบครั้งเดียว
คุณสามารถรับโทเค็นได้โดยการส่ง คำขอที่สอดคล้องกัน
โทเค็นจะมีอายุการใช้งาน 5 นาทีหรือจนกว่าการเชื่อมต่อครั้งแรกจะสำเร็จ
การเชื่อมต่อกับเซิร์ฟเวอร์ WebSocket
การเชื่อมต่อกับเซิร์ฟเวอร์ WebSocket
1. รับครั้งเดียว โทเค็นการตรวจสอบสิทธิ์
2. ระบุโทเค็นในโทเค็นพารามิเตอร์แบบสอบถามเมื่อสร้างการเชื่อมต่อ
ตัวอย่าง URL การเชื่อมต่อ: wss://api-ws.cryptomus.com/ws?token=b0b1cacd26993392ecf072155bd1686c96e380ad12cefa564aa6665c85c77334
โทเค็นสามารถใช้ได้เพียงครั้งเดียว สำหรับการเชื่อมต่อใหม่แต่ละครั้ง คุณต้องขอโทเค็นใหม่
หลังจากการตรวจสอบโทเค็นสำเร็จแล้ว การเชื่อมต่อจะถูกสร้างขึ้น และคุณสามารถสมัครรับช่องที่พร้อมใช้งานได้
การรับโทเค็นการตรวจสอบสิทธิ์ครั้งเดียวสำหรับการเชื่อมต่อ WebSocket
อนุญาตให้สร้างโทเค็นการตรวจสอบสิทธิ์แบบครั้งเดียวเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ WebSocket โทเค็นจะใช้งานได้จนกว่าการเชื่อมต่อจะสำเร็จครั้งแรก หรือจนกว่าจะหมดอายุ (5 นาที)
ส่วนหัวการอนุญาต
มีข้อมูลครบถ้วนเกี่ยวกับส่วนหัวการอนุญาตที่จำเป็น ที่นี่
การตอบสนอง
{ "token": "168b34a3a12370740ff1654f0d0c4726ff1bba8c4675edc0d7553f15e5a2a094" }
สำเนารหัสที่เป็นไปได้
200: สร้างคำสั่งซื้อสำเร็จแล้ว
404: ไม่พบผู้ใช้หรือทรัพยากร
500: ข้อผิดพลาดเซิร์ฟเวอร์ภายใน
สัญลักษณ์ของมาตราส่วนความลึก
ขอ
การตอบสนอง
1{
2 "status": "success",
3 "message": "success",
4 "data": [
5 {
6 "scale": "0.01",
7 "index": 0 // index
8 },
9 ...
10 ]
11}
สำเนารายชื่อตลาด
ขอ
การตอบสนอง
1{
2 "result": [
3 {
4 "id": "01HSBPVS17CT2GN2FV34K3AMP9",
5 "symbol": "BTC_USDT",
6 "baseCurrency": "BTC",
7 "quoteCurrency": "USDT",
8 "baseMinSize": "0.0000100000000000",
9 "quoteMinSize": "0.1000000000000000",
10 "baseMaxSize": "10000000000.0000000000000000",
11 "quoteMaxSize": "99999999.0000000000000000",
12 "basePrec": "8",
13 "quotePrec": "6",
14 "baseCurrencyFullName": "Bitcoin",
15 "quoteCurrencyFullName": "Tether USD"
16 },
17 ...
18 ]
19}
สำเนาตัวอย่างการใช้งาน
Node.js
1const WebSocket = require('ws');
2
3class CryptomusWebSocket {
4 constructor(token) {
5 this.token = token;
6 this.socket = new WebSocket('wss://api-ws.cryptomus.com/ws?token=${this.token}');
7 this.setupConnection();
8 }
9
10 setupConnection() {
11 this.socket.on('open', () => {
12 console.log('Connected to Cryptomus WebSocket');
13 this.startPing();
14 });
15
16 this.socket.on('message', (data) => {
17 console.log('Received:', data.toString());
18 });
19 }
20
21 ping() {
22 if (this.socket.readyState === WebSocket.OPEN) {
23 this.socket.send(JSON.stringify({
24 id: 0,
25 method: "ping",
26 params: []
27 }));
28 }
29 }
30
31 startPing() {
32 setInterval(() => {
33 this.ping();
34 }, 50 * 1000); // Every 50 seconds
35 }
36}
37
38// Usage
39const token = "your_auth_token_here";
40const client = new CryptomusWebSocket(token);
41
สำเนาPython
1import asyncio
2import websockets
3import json
4
5class CryptomusWebSocket:
6 def __init__(self, token):
7 self.token = token
8 self.socket = None
9
10 async def connect(self):
11 self.socket = await websockets.connect(f"wss://api-ws.cryptomus.com/ws?token={self.token}")
12 print('Connected to Cryptomus WebSocket')
13
14 async def ping(self):
15 await self.socket.send(json.dumps({
16 "id": 0,
17 "method": "ping",
18 "params": []
19 }))
20
21 async def start_ping(self):
22 while True:
23 await asyncio.sleep(50) # Every 50 seconds
24 await self.ping()
25
26 async def listen(self):
27 async for message in self.socket:
28 print(f"Received: {message}")
29
30 async def run(self):
31 await self.connect()
32
33 # Start ping task
34 ping_task = asyncio.create_task(self.start_ping())
35
36 # Listen for messages
37 await self.listen()
38
39# Usage
40token = "your_auth_token_here"
41client = CryptomusWebSocket(token)
42asyncio.run(client.run())
43
สำเนาจุดสิ้นสุดทั้งหมดส่งคืนเวลาในรูปแบบประทับเวลา Unix
โครงสร้างข้อความคำขอ
ชื่อ | ประเภทพารามิเตอร์ | คำนิยาม |
---|---|---|
id | Integer | ควรเป็นเอกลักษณ์ในการประมวลผลการตอบสนองต่อคำขอของคุณ |
method | String | ชื่อคำขอ |
params | Array | ส่งพารามิเตอร์สำหรับวิธีการที่นี่ |
ประเภทพารามิเตอร์
Integerคำนิยาม
ควรเป็นเอกลักษณ์ในการประมวลผลการตอบสนองต่อคำขอของคุณประเภทพารามิเตอร์
Stringคำนิยาม
ชื่อคำขอประเภทพารามิเตอร์
Arrayคำนิยาม
ส่งพารามิเตอร์สำหรับวิธีการที่นี่
การเชื่อมต่อ WebSocket จะสิ้นสุดลงหากส่ง JSON ที่ไม่ถูกต้อง
ประเภทข้อความและคำขอ
- การร้องขอ (`ping`, `candles_request` เป็นต้น)
- การสมัครสมาชิก (`candles_subscribe`, `lastprice_subscribe` เป็นต้น) การสมัครสมาชิกประเภทข้อมูลเดียวกันอีกครั้งจะถูกยกเลิก
ข้อความตอบกลับ
ชื่อ | ประเภทพารามิเตอร์ | คำนิยาม |
---|---|---|
id | Integer | ตัวระบุคำขอ |
data | Null | หากคำขอล้มเหลว หากสำเร็จ โครงสร้างการตอบสนองสำหรับแต่ละวิธีจะแสดงด้านล่าง |
error | Null | หากสำเร็จ หากมีข้อผิดพลาด |
message | String | |
code | Integer | รหัสข้อผิดพลาด |
ประเภทพารามิเตอร์
Integerคำนิยาม
ตัวระบุคำขอประเภทพารามิเตอร์
Nullคำนิยาม
หากคำขอล้มเหลว หากสำเร็จ โครงสร้างการตอบสนองสำหรับแต่ละวิธีจะแสดงด้านล่างประเภทพารามิเตอร์
Nullคำนิยาม
หากสำเร็จ หากมีข้อผิดพลาดประเภทพารามิเตอร์
Integerคำนิยาม
รหัสข้อผิดพลาด
รหัส: 1. ข้อความ: รูปแบบข้อความไม่ถูกต้อง
รหัส : 2. ข้อความ : ข้อผิดพลาดอื่นๆ
ประเภทข้อความตอบกลับ
- ผลลัพธ์การค้นหา
- สถานะการสมัคร (สำเร็จ/ล้มเหลว)
- อัปเดตกิจกรรม
ปิงปอง
ปิง
1{
2 "id": 0,
3 "method": "ping",
4 "params": []
5}
6
สำเนาการตอบสนองปิงปอง
1{
2 "id": 0,
3 "method": "pong",
4 "data": null,
5 "error": null
6}
7
สำเนาตัวอย่างการสมัครสมาชิก
ขอ
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT"
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนาอัปเดตกิจกรรม
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": [], // See structure for each method below
5 "error": null
6}
7
สำเนาราคาล่าสุด
การสมัครสมาชิก
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด lastprice_subscribe
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนาเหตุการณ์
1{
2 "id": 0,
3 "method": "lastprice_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953362,
7 "price": "107152.55"
8 },
9 "error": null
10}
11
สำเนาการยกเลิกการสมัครสมาชิก
ขอ
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "BTC_USDT",
6 "ETH_USDT",
7 ...
8 ]
9}
10
สำเนายกเลิกการสมัครรับข่าวสารจากกิจกรรมทั้งหมด lastprice_unsubscribe
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
สำเนาความลึก
การสมัครสมาชิก
ขั้นแรกคุณต้องได้รับดัชนีมาตราส่วนของตลาด วิธีการรับ
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "BTC_USDT:1",
7 "ETH_USDT:1",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด depth_subscribe
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนาเหตุการณ์
1{
2 "id": 0,
3 "method": "depth_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750952911,
7 "full_reload": false, // If false, it is a partial update, if true, it is a fully updated orderbook.
8 "scale_index": 0,
9 "asks": [
10 [
11 "107043.93", // price
12 "0.304313" // value
13 ]
14 ],
15 "bids": [
16 [
17 "106976.11",
18 "0" // for partial update - finished orders will be 0
19 ]
20 ]
21 },
22 "error": null
23}
24
สำเนาการยกเลิกการสมัครสมาชิก
ขอ
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "ETH_USDT:1",
7 ...
8 ]
9}
10
สำเนายกเลิกการสมัครรับข่าวสารจากกิจกรรมทั้งหมด depth_unsubscribe
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนาทิกเกอร์
การสมัครสมาชิก
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด ticker_subscribe
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนาเหตุการณ์
1{
2 "id": 0,
3 "method": "ticker_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953144,
7 "price": "107090.35",
8 "open": "107042.21",
9 "high": "108248.15",
10 "low": "106573.19",
11 "volume": "1531.027982",
12 "quote_volume": "164564314.80174687",
13 "price_change": "0.04"
14 },
15 "error": null
16}
17
สำเนาการยกเลิกการสมัครสมาชิก
ขอ
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
สำเนายกเลิกการสมัครรับข่าวสารจากกิจกรรมทั้งหมด ticker_unsubscribe
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนาการค้าขาย
การสมัครสมาชิก
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด trade_subscribe
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนาเหตุการณ์
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953177,
7 "trades": [
8 {
9 "price": 107100.01,
10 "quantity": 0.000254,
11 "timestamp": 1750953177,
12 "direction": "buy"
13 },
14 ...
15 ]
16 },
17 "error": null
18}
19
สำเนาการยกเลิกการสมัครสมาชิก
ขอ
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
สำเนายกเลิกการสมัครรับข่าวสารจากกิจกรรมทั้งหมด trade_unsubscribe
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนาคำสั่งซื้อ
การสมัครสมาชิก
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด order_subscribe
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนากิจกรรม
สร้างคำสั่งซื้อแล้ว
1{
2 "id": "1",
3 "method": "order_update",
4 "data": {
5 "type": "created",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "0.0000000000000000",
15 "filledValue": "0.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376
18 }
19 },
20 "error": null
21}
22
สำเนาอัปเดตคำสั่งซื้อ
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "updated",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "20.0000000000000000",
15 "filledValue": "4.4000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "updateTs": 1750696487,
19 }
20 },
21 "error": null
22}
23
สำเนาการสั่งซื้อเสร็จสิ้น
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "finished",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "50.0000000000000000",
15 "filledValue": "11.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "finishTs": 1750696417,
19 "state": "completed""internalState": "filled"
20 }
21 },
22 "error": null
23}
24
สำเนายกเลิกการสมัครรับข้อมูลอัปเดต
จากตลาดเฉพาะ
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10
สำเนาจากทุกตลาด
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนายอดคงเหลือ
การสมัครสมาชิก
BaseCurrency จาก รายชื่อตลาด
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "TRX,
7 "ETH",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด balance_subscribe
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9
สำเนากิจกรรม
1{
2 "id": "4",
3 "method": "balance_update",
4 "data": {
5 "info": {
6 "walletId": "01J7E836F6K5KCX5DP2W0F6FAG",
7 "currencyCode": "USDT",
8 "amount": "50.0000000000000000",
9 "oldBalance": "40000.0000000000000000",
10 "newBalance": "39950.00000000"
11 }
12 },
13 "error": null
14}
15
สำเนายกเลิกการสมัครรับข่าวสารกิจกรรม
จากสกุลเงินเฉพาะ
BaseCurrency จาก market-list
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "ETH",
7 ...
8 ]
9}
10
สำเนาจากทุกสกุลเงิน
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนาข้อเสนอพิเศษ
การสมัครสมาชิก
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 "ETH_USDT",
8 ...
9 ]
10}
11
สำเนาสมัครรับข่าวสารกิจกรรมทั้งหมด deal_subscribe
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนากิจกรรม
1{
2 "id": "4",
3 "method": "deal_update",
4 "data": {
5 "info": {
6 "dealId": "01JYH50V5VWPP3QTYGM6CPZ0AR",
7 "symbol": "TRX_USDT",
8 "dealState": "completed",
9 "transactionId": "01JYH50V5YM8M3943KJ9HY2VXM",
10 "filledPrice": "0.2726960000000000",
11 "filledQuantity": "100.0000000000000000",
12 "filledValue": "27.2696000000000000",
13 "fee": "1.0907840000000000",
14 "feeCurrency": "USDT",
15 "tradeRole": "taker",
16 "committedAt": 1750774869
17 }
18 },
19 "error": null
20}
21
สำเนายกเลิกการสมัครรับข้อมูลอัปเดต
จากตลาดเฉพาะ
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 ...
8 ]
9}
10
สำเนาจากทุกตลาด
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8
สำเนาการตอบสนอง
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8
สำเนา