นักพัฒนา
API สาธารณะ Beta
สร้างการเชื่อมต่อสำหรับเวิร์กสเปซด้วยคีย์ API ที่ปลอดภัยและจำกัดขอบเขตสิทธิ์ พร้อมสัญญา JSON แบบมีเวอร์ชันที่เสถียร
เปิดเอกสารอ้างอิง API แบบโต้ตอบเริ่มต้นอย่างรวดเร็ว
- 01
เปิดคีย์ API
เปิด การตั้งค่า เลือก นักพัฒนา หา คีย์ API แล้วเลือก สร้างคีย์ เจ้าของและผู้ดูแลระบบสร้างคีย์ได้
- 02
สร้างคีย์ API
กรอก ชื่อ เลือก หมดอายุในกี่วัน เลือก สิทธิ์เข้าถึงช่องทาง เป็น ทุกช่องทาง หรือ ช่องทางที่เลือก และเลือกขอบเขตสิทธิ์ขั้นต่ำที่การเชื่อมต่อของคุณต้องใช้ใน ขอบเขตสิทธิ์ คำขอจะสำเร็จก็ต่อเมื่อคีย์มีสิทธิ์ดำเนินการกับทรัพยากรตรงตามที่เอนด์พอยต์กำหนด จากนั้นเลือก สร้างคีย์
- 03
บันทึกคีย์ API ของคุณ
คีย์แบบเต็มจะแสดงเพียงครั้งเดียว คัดลอกไปเก็บในตัวจัดการข้อมูลลับ (secret manager) แล้วเลือก บันทึกแล้ว
- 04
ส่งคีย์
ใช้ Bearer token หรือส่งค่าเดียวกันใน
x-api-keyห้ามใส่คีย์ใน query string หรือในโค้ดฝั่งเบราว์เซอร์
cURL
curl https://www.usesonny.com/api/v1/contacts?limit=25 \
--header "Authorization: Bearer sonny_your_key"คีย์ปลอดภัยเสมอ
- ความปลอดภัยของคีย์
- คีย์ใช้คำนำหน้า
sonny_ตามด้วยอักขระสุ่ม 64 ตัว จัดเก็บด้วยการแฮชแบบทางเดียว กำหนดวันหมดอายุได้ และจำกัด 1800 คำขอ/นาทีต่อคีย์ คีย์หนึ่งผูกกับเวิร์กสเปซเดียว - หากต้องการเพิกถอนคีย์ ให้เลือกปุ่มถังขยะข้างคีย์นั้น แล้วยืนยัน เพิกถอนคีย์ API หรือไม่? โดยเลือก ลบ คีย์จะหยุดใช้งานทันที
- ตรวจสอบสิทธิ์ทุกครั้งที่เรียกใช้
- Sonny ตรวจสอบแฮชและขอบเขตสิทธิ์ จากนั้นตรวจสอบสถานะสมาชิกเวิร์กสเปซ บทบาท และสถานะการเรียกเก็บเงินของผู้สร้างคีย์อีกครั้ง การนำผู้ใช้นั้นออกหรือปิดใช้งานจะปิดคีย์ของผู้ใช้ทันที
- ช่องทางที่เลือกจะถูกบังคับใช้กับทุกการเรียก REST API และ MCP เอนด์พอยต์สำหรับจัดการผู้ติดต่อ ฟิลด์ที่กำหนดเอง แท็ก และเว็บฮุกต้องมีสิทธิ์เข้าถึงทุกช่องทาง การสร้างจากฟอร์มใช้ contacts:write ร่วมกับ conversations:write บนช่องทางที่เลือกได้ ส่วนเอนด์พอยต์ผู้ติดต่อแบบแยกยังคงมีผลทั้งเวิร์กสเปซ
ขอบเขตสิทธิ์
contacts:readcontacts:writetags:readtags:writeconversations:readconversations:writemessages:readmessages:writemessages:sendwebhooks:readwebhooks:writekb:readkb:writecsat:readattachments:writemembers:readcontact-memory:readcontact-memory:writereporting:read
ทรัพยากร
- ผู้ติดต่อ
- จัดการผู้ติดต่อ ฟิลด์ที่กำหนดเองแบบระบุชนิดข้อมูล ตัวกรองแบบค่าตรงตัว และความจำเกี่ยวกับลูกค้า เก็บถาวรผู้ติดต่อ หรือลบถาวรพร้อมบทสนทนาทั้งหมดเพื่อรองรับคำขอด้านการคุ้มครองข้อมูล
- ช่องทาง (Sources)
- ดูช่องทางที่ตั้งค่าไว้ และดูว่าแต่ละช่องทางรองรับแชท อีเมล หรือทั้งสองอย่าง
- บทสนทนา
- สร้างคำถามจากฟอร์ม กรองบทสนทนาที่ต้องดูแล มอบหมายให้เจ้าหน้าที่หรือทีม พักไว้ ติดแท็ก และอัปเดตเป็นชุด
- การซิงค์
- เล่นซ้ำการเปลี่ยนแปลงในเวิร์กสเปซที่บันทึกไว้อย่างถาวรและบันทึกการลบด้วยเคอร์เซอร์ที่บันทึกไว้
- สมาชิกและทีม
- ดูสมาชิกทีมที่มอบหมายได้ สถานะพร้อมให้บริการ และสิทธิ์เข้าถึงช่องทางที่มีผลจริง
- รายงาน
- อ่านรายงานด้านการสนับสนุน ทีม AI ความรู้ ลูกค้าเป้าหมาย และสถานะพร้อมให้บริการ
- ข้อความ
- อ่านประวัติข้อความและข้อมูลที่ดึงจากไฟล์แนบ อัปโหลดไฟล์ส่วนตัว เพิ่มโน้ตภายใน และส่งหรือแก้ไขคำตอบถึงลูกค้า
- เว็บฮุก
- จัดการเอนด์พอยต์ การสมัครรับอีเวนต์ การทดสอบ การส่ง และการลองส่งใหม่
- ฐานความรู้
- สร้าง อ่าน อัปเดต และลบบทความและหมวดหมู่ของศูนย์ช่วยเหลือแยกตามช่องทาง
- ความพึงพอใจของลูกค้า
- อ่านผล CSAT ของเวิร์กสเปซ แต่ละช่องทาง และแต่ละบทสนทนา และแสดงรายการผลการประเมินแต่ละรายการ โดยกรองตามค่าที่ประเมิน ความคิดเห็น ผู้รับผิดชอบ หรือช่วงเวลา
ใช้ Sonny จากเครื่องมือ AI
Sonny MCP เปิดให้ใช้ทุกการดำเนินการของ API สาธารณะในรูปแบบเครื่องมือ ไคลเอนต์เชื่อมต่อโดยเข้าสู่ระบบด้วย OAuth 2.1 หรือใช้คีย์ API ที่จำกัดขอบเขตสิทธิ์ และทุกการเรียกจะยังคงใช้ขอบเขตสิทธิ์ ขอบเขตของเวิร์กสเปซ และกฎทางธุรกิจเดียวกัน
อ่านคู่มือ Sonny MCPการตอบกลับของ API และข้อผิดพลาด
การตอบกลับแบบรายการใช้ data และมีการแบ่งหน้าในกรณีที่เกี่ยวข้อง ทุกการตอบกลับมี x-request-id คุณส่ง ID คำขอที่ปลอดภัยมาเองได้ และ Sonny จะส่งค่านั้นกลับไป ข้อผิดพลาดจะส่งข้อความที่ปลอดภัยกลับไปโดยไม่เปิดเผยรายละเอียดการทำงานภายในที่ละเอียดอ่อน
{
"error": {
"type": "validation_error",
"message": "Invalid email address",
"requestId": "req_01J..."
}
}400- ข้อมูลนำเข้า JSON, query หรือเคอร์เซอร์ไม่ถูกต้อง
401- ไม่มีคีย์ API หรือคีย์ไม่ถูกต้อง หมดอายุ หรือไม่มีขอบเขตสิทธิ์ที่ต้องใช้
402- สถานะการเรียกเก็บเงินของเวิร์กสเปซบล็อกคำขอนี้
403- บทบาทในเวิร์กสเปซของผู้สร้างคีย์ไม่ได้รับอนุญาต
404- ไม่มีทรัพยากรนี้ในเวิร์กสเปซของคีย์
409- คำขอขัดแย้งกับทรัพยากรที่มีอยู่
410- เคอร์เซอร์การซิงค์หมดอายุ ให้โหลดสถานะปัจจุบันใหม่ตั้งแต่ต้นแล้วเล่นซ้ำจากเคอร์เซอร์ใหม่
413- ไฟล์ที่อัปโหลดมีขนาดเกินกว่าที่อนุญาต
422- ช่องทางนี้ไม่มีอีเมล หรือค่าฟิลด์ที่ส่งมาไม่ถูกต้อง
429- เกินขีดจำกัดอัตราคำขอต่อคีย์
500- เกิดข้อผิดพลาดที่ไม่คาดคิด ลองอีกครั้งพร้อม ID คำขอ
503- คิวการส่งเว็บฮุกเต็ม ลองใหม่ภายหลัง
ขีดจำกัดอัตราคำขอ
คีย์ API แต่ละคีย์ส่งคำขอได้สูงสุด 1,800 ครั้งต่อนาที ทุกการตอบกลับจะรายงานช่วงเวลาปัจจุบันผ่านเฮดเดอร์มาตรฐาน RateLimit-Limit, RateLimit-Remaining และ RateLimit-Reset ไคลเอนต์จึงควบคุมอัตราการเรียกเองได้โดยไม่ต้องเดา เมื่อเกินขีดจำกัด API จะส่ง 429 พร้อมเฮดเดอร์ Retry-After ให้รอตามจำนวนวินาทีนั้นก่อนลองใหม่
การกำหนดเวอร์ชันและการเลิกใช้งาน
API กำหนดเวอร์ชันไว้ในพาธของ URL (/api/v1) ภายในเวอร์ชันเดียวกัน เราจะทำเฉพาะการเปลี่ยนแปลงแบบเพิ่มเติมเท่านั้น เช่น เอนด์พอยต์ใหม่ ฟิลด์ใหม่ที่ไม่บังคับ และค่า enum ใหม่ การเปลี่ยนแปลงที่ไม่รองรับของเดิมจะออกเป็นเวอร์ชันใหม่ และก่อนเลิกใช้เอนด์พอยต์ v1 ใดๆ เราจะแจ้งล่วงหน้าอย่างน้อยหกเดือน ทั้งในหน้านี้ ทางอีเมลถึงเจ้าของเวิร์กสเปซที่มีคีย์ API ที่ใช้งานอยู่ และผ่านเฮดเดอร์ Deprecation และ Sunset บนเอนด์พอยต์ที่ได้รับผลกระทบ
แก้ไขคำตอบที่ส่งไปแล้ว
- ให้คีย์ API หรือการเชื่อมต่อ MCP ของคุณมีขอบเขตสิทธิ์
messages:readและmessages:sendและมีสิทธิ์เข้าถึงช่องทางของคำตอบนั้น - อ่านข้อความของบทสนทนาแล้วคัดลอก ID ของคำตอบที่คุณเขียนและส่งเอง คีย์ API จะทำงานในนามของผู้สร้างคีย์ ส่วน OAuth จะทำงานในนามของสมาชิกทีมที่เชื่อมต่อ
- ส่งข้อความใหม่โดยใช้คำขอด้านล่าง หรือเรียก
edit_messageใน MCP พร้อมconversationId,messageIdและbody - ตรวจสอบข้อความที่ส่งกลับมา ID ไฟล์แนบ สถานะการอ่าน และเวลาส่งเดิมจะยังคงเหมือนเดิม
curl --request PATCH \
https://www.usesonny.com/api/v1/conversations/conversation_1/messages/message_1 \
--header "Authorization: Bearer sonny_your_key" \
--header "Content-Type: application/json" \
--data '{"body":"The corrected reply"}'การแก้ไขจะปรับบันทึกบทสนทนาและไคลเอนต์แชทที่เชื่อมต่ออยู่ให้ถูกต้อง โดยจะไม่ส่งอีเมลหรือการแจ้งเตือนเพิ่ม และอีเมลที่ส่งถึงผู้รับแล้วจะไม่เปลี่ยนแปลง แก้ไขได้เฉพาะคำตอบถึงลูกค้าที่คุณเขียนเองเท่านั้น ข้อความขาเข้า คำตอบจากบอท โน้ตภายใน และคำตอบของสมาชิกทีมคนอื่นแก้ไขไม่ได้ รอให้การส่งอีเมลที่ค้างอยู่เสร็จก่อนแก้ไข ข้อความใหม่ต้องมี 1–50,000 ตัวอักษร HTML และตัวอย่างลิงก์เดิมจะถูกล้าง การเชื่อมต่อจะได้รับเว็บฮุก message.updated และอีเวนต์การซิงค์ การดึงข้อมูลเฉพาะ ID ข้อความที่ใหม่กว่าจะไม่พบการแก้ไข ให้ใช้ฟีดการซิงค์แบบถาวรแทน
สร้างบทสนทนาจากฟอร์ม
ส่งข้อมูลที่กรอกในฟอร์มไปยัง POST /api/v1/conversations Sonny จะค้นหาหรือสร้างผู้ติดต่อจากอีเมล จัดเก็บคำตอบในฟอร์ม และเปิดบทสนทนาขาเข้าในฝั่งอีเมลของช่องทางที่คุณเลือก ทีม กฎการมอบหมาย และการแจ้งเตือนของช่องทางจะมีผลตามปกติ เจ้าหน้าที่ตอบกลับทางอีเมล
- สร้างคีย์ที่มี
conversations:writeและcontacts:writeคุณจำกัดคีย์ให้ใช้ได้เฉพาะช่องทางของลูกค้ารายนั้นได้ หา ID ของช่องทางด้วยGET /api/v1/sourcesซึ่งต้องใช้conversations:readด้วย - ใน n8n ให้เพิ่มโหนด HTTP Request เมธอด POST URL
https://www.usesonny.com/api/v1/conversationsจัดเก็บคีย์ในข้อมูลรับรองแบบ Header Auth:Authorizationที่มีค่าBearer sonny_your_key - เปิด Send Body เลือก JSON และ Using JSON จากนั้นเปลี่ยนฟิลด์ JSON ทั้งหมดเป็น Expression แล้ววางตัวอย่างนี้ แทนที่ ID ของช่องทางและจับคู่ฟิลด์นำเข้ากับฟอร์มของคุณ ใช้ ID การส่งฟอร์มที่คงที่และไม่ซ้ำกัน เพื่อให้การลองใหม่ใช้ค่าเดิม
{{ {
sourceId: "YOUR_CLIENT_SOURCE_ID",
contact: { email: $json.email, name: $json.name },
subject: "Website enquiry",
message: $json.message,
fields: {
Company: String($json.company ?? ""),
Budget: String($json.budget ?? ""),
Service: String($json.service ?? "")
},
externalId: "website-form-" + $json.submissionId
} }}ดูตัวเลือกเพิ่มเติมของโหนดได้ในคู่มือ HTTP Request ของ n8n เครื่องมือ MCP ที่เทียบเท่ากันคือ create_conversation ซึ่งใช้ payload และสิทธิ์เดียวกัน
ชื่อฟิลด์ใหม่จะกลายเป็นฟิลด์ข้อความ ฟิลด์ตัวเลข URL วันที่ และตัวเลือกที่มีอยู่แล้วต้องได้รับค่าสตริงที่ถูกต้อง ค่าที่ไม่ถูกต้องจะส่งกลับ 422 พร้อมระบุชื่อฟิลด์และไม่บันทึกข้อมูลใดๆ วันที่รองรับรูปแบบวันที่ ISO หรือ timestamp ส่วนค่าตัวเลือกต้องตรงกับตัวเลือกที่มี รับได้สูงสุด 50 ฟิลด์ โดยชื่อยาวไม่เกิน 100 ตัวอักษรและค่ายาวไม่เกิน 5,000 ตัวอักษร ฟิลด์จะแสดงที่ผู้ติดต่อและในแถบด้านข้างของบทสนทนา เนื้อหาข้อความทั้งสองแบบจะเก็บสำเนาคำตอบในฟอร์มไว้ รวมถึงเมื่อคุณส่ง htmlMessage ซึ่งไม่บังคับมาด้วย
tags ซึ่งไม่บังคับ รับ ID แท็กของเวิร์กสเปซที่มีอยู่ได้สูงสุด 20 รายการ การตอบกลับมี conversation, ข้อมูลสรุป contact, message และ deduplicated การส่งใหม่จะส่งกลับ 201 การใช้ externalId ซ้ำในช่องทางเดิมจะส่งกลับ 200 พร้อม ID เดิมและ deduplicated: true โดยเนื้อหาที่เปลี่ยนไปจะถูกละเว้น หากไม่มี external ID ทุกการเรียกจะสร้างบทสนทนาใหม่ ไม่รองรับไฟล์แนบตอนสร้างและการตอบกลับอัตโนมัติด้วย AI
เวิร์กโฟลว์ของเอเจนต์ AI
คัดแยก ดำเนินการ และซิงค์ข้อมูลให้ตรงกันเสมอ
REST และ MCP ใช้สิทธิ์และเวิร์กโฟลว์เดียวกัน ข้อมูลรับรองทำได้เพียงจำกัดสิทธิ์เข้าถึงช่องทางปัจจุบันของคุณให้แคบลง การนำช่องทางออกจากสิทธิ์สมาชิกของคุณจะนำช่องทางนั้นออกจากการเชื่อมต่อของคุณด้วย
ค้นหาบทสนทนาที่ต้องดูแล
กรองตาม awaitingReply, unread, unassigned, assigneeId, agentGroupId, snoozed, priority หรือ tagIds การรอตอบกลับ (awaitingReply) ไม่นับโน้ตภายใน ส่วน unread เป็นข้อมูลเฉพาะของสมาชิกทีมที่ยืนยันตัวตนอยู่ unassigned หมายถึงไม่มีผู้รับผิดชอบรายบุคคล แม้จะมอบหมายให้ทีมแล้วก็ตาม แท็กจะตรงเมื่อมี ID ใดก็ได้ที่ส่งมา ส่ง propertyId (ฟิลด์ประเภท Select จาก list_properties) พร้อม propertyValues เพื่อจับคู่ผู้ติดต่อที่มีตัวเลือกใดตัวเลือกหนึ่งในนั้น สำหรับ REST ให้ใส่ propertyValues ซ้ำหนึ่งครั้งต่อหนึ่งตัวเลือก
GET /api/v1/conversations?status=open&awaitingReply=true&compact=true&sort=waitingSince&direction=ascเรียงลำดับตาม waitingSince, lastMessageAt, createdAt หรือความสำคัญทางธุรกิจ โดยกำหนดทิศทางเป็น asc หรือ desc หากค่าเท่ากันจะใช้ ID ตัดสิน ตัวกรองที่ไม่ได้ระบุจะคงค่า compact=false และ snoozed=any ไว้ tagIds ใน REST รับ ID ที่คั่นด้วยจุลภาค ส่วน MCP รับแบบอาร์เรย์ได้ด้วย waitingSince เริ่มนับที่ข้อความขาเข้าข้อความแรกหลังการตอบกลับล่าสุด ข้อความติดตามผลและโน้ตภายในจะไม่รีเซ็ตค่านี้ ให้ตั้งเวลาสแกนคิวรอนี้เป็นประจำแม้ไม่มีเว็บฮุกเข้ามา เพื่อให้เธรดเก่ากลับขึ้นมาให้เห็น
ตามทันการเปลี่ยนแปลงโดยไม่ต้องอ่านกล่องข้อความซ้ำ
ใช้ GET /api/v1/sync พร้อม conversations:read ฟีดแบบถาวรนี้มีการเปลี่ยนแปลงของบทสนทนา แท็ก ข้อความ ฟิลด์ของผู้ติดต่อ ความจำ และบันทึกการลบ payload แต่ละประเภทยังต้องใช้ขอบเขตสิทธิ์การอ่านของตนเองด้วย เนื้อหาข้อความต้องใช้ messages:read และความจำต้องใช้ contact-memory:read ข้อมูลรับรองที่ถูกจำกัดจะได้รับเฉพาะช่องทางที่ได้รับอนุญาต
- เริ่มโดยไม่ใส่เคอร์เซอร์ ทำตาม nextCursor ไปจนกว่า hasMore จะเป็น false แล้วบันทึกเคอร์เซอร์นั้นไว้
- อ่านรายการบทสนทนา/ผู้ติดต่อปัจจุบันและประวัติที่คุณต้องใช้สำหรับสถานะเริ่มต้น
- เล่นซ้ำจากเคอร์เซอร์ที่บันทึกไว้เพื่อเก็บการเปลี่ยนแปลงที่เกิดขึ้นระหว่างการอ่านนั้น ประมวลผลแต่ละหน้า แล้วบันทึก nextCursor
ตัดรายการซ้ำด้วย id ของอีเวนต์ เนื่องจากการเล่นซ้ำรับประกันแบบอย่างน้อยหนึ่งครั้ง (at least once) การดำเนินการปลายทางจึงต้องมีการป้องกันการซ้ำของตนเอง คำขอที่ไม่มีเคอร์เซอร์จะครอบคลุมเฉพาะชั่วโมงล่าสุด ไม่ใช่สแนปช็อตทั้งหมด อีเวนต์จะถูกเก็บไว้ 30 วัน HTTP 410 resync_required หมายถึงต้องโหลดสถานะเริ่มต้นใหม่ และควรโหลดสถานะเริ่มต้นใหม่หลังขยายขอบเขตสิทธิ์หรือสิทธิ์เข้าถึงช่องทางด้วย ใช้ limit ได้สูงสุด 100 และ maxBodyChars ได้สูงสุด 10,000 (ค่าเริ่มต้น 500) ตั้ง compact=true เพื่อรับฟิลด์ textPreview/textTruncated ของข้อความที่จำกัดไว้ 200 ตัวอักษรแทน body/bodyTruncated เว็บฮุกปลุกเอเจนต์ได้ ส่วนฟีดยังใช้ได้แม้ไม่ได้สมัครรับเว็บฮุก หรือเมื่อการส่งเว็บฮุกค้างอยู่
บันทึกการตรวจสอบครั้งเดียวและแชร์ผลลัพธ์
ก่อนตรวจสอบเรื่องเดิมซ้ำ ให้อ่าน list_conversation_checks (GET /api/v1/conversations/{conversationId}/checks) บันทึกผลด้วย record_conversation_check (PUT ไปยังพาธเดียวกัน) โดยระบุ key, result, checkedBy และ reference ซึ่งไม่บังคับสำหรับ ID หรือ URL ของการ์ด ตัวอย่างเช่น key=product-version, result=Shopstar Go verified, checkedBy=Engineer, reference=card-X แล้ว Sonny จะบันทึก actorId ที่ยืนยันตัวตนและเวลา checkedAt การใช้ key ซ้ำจะแทนที่เฉพาะการตรวจสอบนั้น ข้อมูลนี้เป็นสถานะปัจจุบัน ไม่ใช่บันทึกประวัติ การอ่านต้องใช้ conversations:read และการเขียนต้องใช้ conversations:write โดยทั้งสองอย่างจำกัดตามช่องทางของบทสนทนา การเรียกเหล่านี้จะไม่ส่งคำตอบหรือทำเครื่องหมายว่าตอบผู้ขายแล้ว
มอบหมายและอัปเดตงานเป็นชุด
ดูสมาชิกทีมและทีมที่ใช้งานอยู่และมอบหมายได้ด้วย GET /api/v1/members and /teams (members:read) การตอบกลับมีสถานะพร้อมให้บริการและสิทธิ์เข้าถึงช่องทางที่มีผลจริง โดยไม่มีอีเมล ใช้ conversations:write เพื่อเปลี่ยน status, priority, assigneeId, agentGroupId, snoozedUntil, snoozedUntilReply, addTagIds หรือ removeTagIds
POST /api/v1/conversations/batch
{
"conversationIds": ["conversation_1", "conversation_2"],
"updates": { "agentGroupId": "team_1", "assignment": "round_robin" }
}การกระจายงานแบบวนรอบ (round-robin) จะเลือกสมาชิกทีมที่พร้อมให้บริการและเข้าถึงช่องทางของบทสนทนาได้ หากไม่มีสมาชิกที่เข้าเกณฑ์ การอัปเดตรายการเดียวจะส่งกลับ 409 และรายการในชุดจะล้มเหลว แต่ละชุดรับ ID ที่ไม่ซ้ำกันได้สูงสุด 100 รายการ และใช้การแก้ไขหนึ่งชุดแบบ atomic ต่อบทสนทนา ตรวจสอบผลลัพธ์ { id, ok, error? } ทุกรายการ เพราะบางรายการอาจล้มเหลว ชุดคำขอใช้ขีดจำกัดอัตราตามจำนวนคำขอปัจจุบัน โดยไม่คิดน้ำหนักตามจำนวนรายการ
แชร์บริบทของลูกค้ากับ Sonny AI
แสดงรายการ บันทึก และนำความจำของผู้ติดต่อออกด้วย contact-memory:read/write ระบุทั้ง contactId และ sourceId ที่เข้าถึงได้ โดยผู้ติดต่อต้องมีบทสนทนาในช่องทางนั้น ข้อเท็จจริงที่บันทึกจะใช้การตรวจสอบ การจัดการข้อมูลซ้ำ และขีดจำกัดเดียวกับในแอป และบันทึกเป็นความจำที่เพิ่มด้วยตนเอง
อ่านคำจำกัดความของฟิลด์ที่ /api/v1/properties และอ่านหรือตั้งค่าที่ /api/v1/contacts/{contactId}/properties MCP มี list_properties, get_contact_properties และ set_contact_property ซึ่งต้องใช้ contacts:read/write และสิทธิ์เข้าถึงทุกช่องทาง ระบุ propertyId หรือ propertyName อย่างใดอย่างหนึ่งเท่านั้น พร้อมค่าสตริง หรือ null เพื่อล้างค่า ค่าข้อความ ตัวเลข URL วันที่ และตัวเลือกจะถูกตรวจสอบตามคำจำกัดความของฟิลด์
PUT /api/v1/contacts/contact_1/properties
{ "propertyName": "Plan", "value": "Pro" }
GET /api/v1/contacts?property[Plan]=Proตัวกรองฟิลด์จะจับคู่กับสตริงที่จัดเก็บไว้แบบตรงตัว หากใช้หลายฟิลด์ ต้องตรงทั้งหมด ค่าที่เขียนผ่าน API จะถูกระบุว่าเป็นข้อมูลจาก API ใน Co-Pilot และระบบตอบกลับอัตโนมัติ กฎเดิมเกี่ยวกับลูกค้าที่ยืนยันแล้วและช่องทางยังคงมีผล ค่าฟิลด์ภายในที่กรอกด้วยตนเองตามปกติยังคงไม่รวมอยู่ในบริบท AI นี้
อ่านรายงานชุดเดียวกับที่ทีมของคุณเห็น
เมื่อมี reporting:read ให้เรียก GET /api/v1/reporting/{kind} ประเภทรายงานได้แก่ overview, volume, response-times, agents, sources, tags, csat, ai, knowledge, leads และ online-hours โดย overview จะรวมจำนวน เวลาตอบกลับ และ CSAT ไว้ด้วยกัน ตัวกรองได้แก่ period (1–365 วัน ค่าเริ่มต้น 30), วันที่ from/to ที่ใช้คู่กัน (ไม่รวมวันที่ to), granularity (day/month), source, assigneeId และ tagId ค่า source รับ all, all-chat, all-email, website:{id} หรือ email:{id}
รายงานใช้คิวรีเดียวกับแดชบอร์ดและการตรวจสอบสิทธิ์เข้าถึงปัจจุบัน knowledge ใช้วันที่และช่องทางที่ได้รับอนุญาต โดยไม่ขึ้นกับ source ผู้รับผิดชอบ หรือแท็กที่เลือก online-hours วัดการออนไลน์ในเวิร์กสเปซของสมาชิกทีมที่เข้าถึงได้ ส่วนจำนวนบทสนทนายังคงจำกัดตามช่องทาง เอนด์พอยต์ /csat ที่มีอยู่ยังคงใช้ขอบเขตสิทธิ์ csat:read แยกต่างหาก และอาจอธิบายกลุ่มข้อมูลที่ต่างกัน
ส่งไฟล์พร้อมคำตอบหรือโน้ตภายใน
ให้สิทธิ์ attachments:write แล้วอัปโหลดไฟล์ขนาดไม่เกิน 25 MB สำหรับบทสนทนา POST /api/v1/attachments รับฟิลด์ multipart ได้แก่ file และ conversationId การตอบกลับมี id และ expiresAt ส่ง attachmentIds ได้สูงสุด 10 รายการไปกับคำตอบหรือโน้ตภายในหนึ่งชั่วโมง ไฟล์ที่อัปโหลดแต่ละไฟล์ผูกกับผู้ใช้และบทสนทนาของคุณ และใช้ได้เพียงครั้งเดียว ไฟล์ที่ไม่ได้ใช้จะถูกล้างหลังหมดอายุ
POST /api/v1/conversations/conversation_1/reply
{ "attachmentIds": ["upload_1"] }คำตอบต้องใช้ messages:send ส่วนโน้ตภายในต้องใช้ messages:write และจะไม่ถึงลูกค้า รองรับข้อความที่มีแต่ไฟล์แนบ คำตอบทางอีเมลจะแนบไฟล์ภายในขนาดอีเมลที่กำหนด และให้ลิงก์ดาวน์โหลดสำหรับไฟล์ที่เหลือ อีเมลแชทเมื่อออฟไลน์จะมีลิงก์ไฟล์ ลิงก์ในอีเมลใช้ได้ตราบใดที่ไฟล์แนบยังอยู่ ผู้รับจึงเปิดภายหลังได้ การส่งต่ออีเมลจะเป็นการแชร์สิทธิ์เข้าถึงไฟล์เหล่านั้นด้วย ตรวจสอบ emailDeliveryStatus เพื่อดูการส่งที่ล้มเหลว
การอ่านข้อความที่ได้รับอนุญาตจะมี downloadUrl, downloadExpiresAt, aiStatus, aiDescription และ aiExtractedText รวมถึง videoTranscripts สำหรับวิดีโอที่ลิงก์ไว้ (Loom, Vimeo และอื่นๆ) ลิงก์ดาวน์โหลดมีอายุ 15 นาที อ่านข้อความอีกครั้งเพื่อรับลิงก์ใหม่ ไฟล์ที่อัปโหลดผ่าน API/MCP ใหม่จะจัดเก็บแบบส่วนตัว ไฟล์แนบเก่ายังคงเป็นแบบสาธารณะและถูกระบุเป็น access=legacy_public โดย URL เดิมจะไม่หมดอายุ การอ่านข้อความจะเริ่มอ่านรูปภาพในข้อความเมื่อเวิร์กสเปซมี Sonny AI การอ่านรูปภาพและการถอดความวิดีโอจะเสร็จในไม่ช้าหลังจากข้อความเข้ามา ระหว่างที่ยังทำงานอยู่ การตอบกลับจะขึ้นต้นด้วย readsInProgress ซึ่ง nextStep จะระบุการเรียกที่ต้องทำอย่างชัดเจน ส่ง waitSeconds (สูงสุด 30) เพื่อรอผลในคำขอเดียว ข้อความในวิดเจ็ตที่ลูกค้าเห็นและข้อความแบบเรียลไทม์จะไม่มีข้อมูลที่ดึงออกมาหรือคำถอดความ
ฐานความรู้
ซิงค์จากแหล่งข้อมูลภายนอก
ซิงค์บทความและหมวดหมู่ด้วย external ID ที่คงที่ นำเข้า Markdown หรือ HTML อัปโหลดรูปภาพ กำหนดลำดับ และจัดการกลุ่มผู้ชม การ upsert ซ้ำจะอัปเดตเนื้อหาที่มีอยู่
- เลือก sourceId ของช่องทางคุณและให้สิทธิ์ kb:read และ kb:write เก็บคีย์ API ไว้บนเซิร์ฟเวอร์ของคุณและจำกัดสิทธิ์เข้าถึงช่องทางของคีย์
- สร้างหมวดหมู่ แล้วซิงค์บทความเป็นฉบับร่าง ตรวจสอบรูปแบบและสิทธิ์เข้าถึงก่อนเผยแพร่
- กำหนดค่าสิทธิ์เข้าถึงศูนย์ช่วยเหลือ เผยแพร่ แล้วทดสอบมุมมองของผู้อ่าน ใช้การแบ่งหน้าและ external ID ที่คงที่สำหรับการอัปเดตครั้งต่อไป
จัดการกลุ่มผู้ชมที่เป็นลูกค้า
สร้างกลุ่มจากคุณลักษณะของลูกค้าที่ยืนยันแล้ว และนำไปใช้กับศูนย์ช่วยเหลือ หมวดหมู่ หรือบทความ ข้อจำกัดที่สืบทอดมาทั้งหมดต้องตรงกัน ข้อมูลรับรองของ API และ MCP จะทำงานในฐานะพนักงานภายในขอบเขตสิทธิ์ของตน ให้ดูตัวอย่างและทดสอบด้วยเซสชันของลูกค้าจริงเพื่อตรวจสอบสิทธิ์เข้าถึงของผู้อ่าน
ตั้งค่าและทดสอบกลุ่มผู้ชมของศูนย์ช่วยเหลือเอกสารที่เกี่ยวข้อง
- Sonny MCPBeta
เชื่อมต่อผู้ช่วย AI เข้ากับเวิร์กโฟลว์ในกล่องข้อความ ความจำเกี่ยวกับลูกค้า รายงาน และไฟล์ ด้วย OAuth หรือคีย์ที่จำกัดขอบเขต
- เว็บฮุกBeta
สมัครรับอีเวนต์ของเวิร์กสเปซที่มีลายเซ็นรับรอง และตรวจสอบความพยายามในการส่ง
- ผู้ติดต่อ
เรียนรู้วิธีที่ผู้ติดต่อถูกสร้าง จัดการ ติดแท็ก และรวมกันใน Sonny
- กล่องข้อความ
ทำความเข้าใจสถานะ ความสำคัญ การมอบหมาย การพักไว้ การดำเนินการแบบกลุ่ม และคีย์ลัด