Skip to main content

Errors & Error Handling

HTTP status code, รูปแบบ error response, และวิธีกู้คืนจาก error ทั่วไป


Errors & Error Handling

Synapse ใช้ HTTP status code มาตรฐานพร้อมรูปแบบ error response ที่สม่ำเสมอ เอกสารหน้านี้อธิบายวิธีตีความและกู้คืนจาก error

รูปแบบ Error Response

error ทั้งหมดส่งกลับเป็น JSON ด้วยโครงสร้างนี้:

{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Mind Key fehlt oder ungültig.",
  "docs": "https://synapse.schaefer.zone/docs/getting-started/authentication"
}
Field คำอธิบาย
statusCode HTTP status code
error ชื่อ HTTP status
message คำอธิบาย error ที่มนุษย์อ่านได้
docs URL ไปยังเอกสารที่เกี่ยวข้อง (เมื่อเกี่ยวข้อง)

HTTP Status Codes

200 OK

สำเร็จ request ถูกประมวลผลถูกต้อง

201 Created

สำเร็จ สร้าง resource ใหม่ (เช่น POST /memory)

204 No Content

สำเร็จ ไม่มี body ส่งกลับ (เช่น DELETE /memory/:id)

400 Bad Request

request ผิดรูปแบบ สาเหตุทั่วไป:

  • ขาด JSON field ที่จำเป็น
  • ไวยากรณ์ JSON ไม่ถูกต้อง
  • ค่า enum ไม่ถูกต้อง (เช่น category ผิด)
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "category must be one of: identity, preference, fact, project, skill, mistake, context, note, credentials"
}

วิธีแก้: ตรวจสอบ request body กับ API docs ตรวจสอบว่า field ที่จำเป็นทั้งหมดมีและมีค่าที่ถูกต้อง

401 Unauthorized

การยืนยันตัวตนล้มเหลว สาเหตุทั่วไป:

  • ขาด Authorization header
  • Mind Key หรือ JWT ไม่ถูกต้อง
  • ใช้ Mind Key ในที่ที่ต้องใช้ JWT (หรือกลับกัน)
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Mind Key fehlt oder ungültig.",
  "docs": "https://synapse.schaefer.zone/docs/getting-started/authentication"
}

วิธีแก้: ตรวจสอบ token ของคุณ ดู Authentication

403 Forbidden

คุณยืนยันตัวตนแล้วแต่ไม่ได้รับอนุญาตให้ทำ action นี้ สาเหตุทั่วไป:

  • พยายามลบ mind ของผู้ใช้อื่น
  • พยายาม verify memory ด้วย Mind Key (ต้องใช้ JWT)
  • Mind ถูกปิดใช้งาน

วิธีแก้: ตรวจสอบว่าคุณใช้ประเภท token ที่ถูกต้องสำหรับ endpoint นี้

404 Not Found

path หรือ resource ที่ร้องขอไม่มีอยู่

**อย่าเดา path ของ endpoint** มีเพียง path ที่แสดงใน `GET /endpoints` เท่านั้นที่มีอยู่ หากคุณได้ 404 แสดงว่าคุณใช้ path ผิด
{
  "statusCode": 404,
  "error": "Not Found",
  "message": "Route GET /memory/list not found",
  "docs": "https://synapse.schaefer.zone/docs/api/errors"
}

วิธีแก้: เรียก GET /endpoints เพื่อดูรายการ endpoint ที่ถูกต้อง เปรียบเทียบ URL ของคุณกับรายการทีละตัวอักษร

409 Conflict

request ขัดแย้งกับสถานะที่มีอยู่ สาเหตุทั่วไป:

  • พยายามลงทะเบียนด้วย email ที่มีอยู่แล้ว
  • ซ้ำ webhook URL

วิธีแก้: ใช้ค่าอื่น หรือใช้ PUT เพื่ออัปเดต resource ที่มีอยู่

429 Too Many Requests

คุณกระทบ rate limit ใช้เฉพาะกับ auth ผ่าน ?key= query parameter (60/นาที)

{
  "statusCode": 429,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Use Authorization header for unlimited access."
}

Response headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Retry-After: 42

วิธีแก้: เปลี่ยนไปใช้ Authorization: Bearer header (ไม่จำกัดอัตรา) หรือรอ Retry-After วินาที

500 Internal Server Error

server error ไม่ควรเกิดขึ้น — หากเกิด ถือเป็น bug

วิธีแก้:

  1. Retry ด้วย exponential backoff (1s, 2s, 4s, 8s)
  2. ตรวจสอบ GET /health เพื่อดูว่า server ยังทำงานอยู่หรือไม่
  3. หากยังเกิดขึ้นเรื่อย ๆ ให้รายงาน error

503 Service Unavailable

server ล่มชั่วคราว (เช่น ระหว่าง deploy, database migration)

วิธีแก้: รอแล้ว retry ตรวจสอบ GET /health

รูปแบบการกู้คืน

Retry ด้วย exponential backoff

import time
import requests

def call_with_retry(url, max_retries=3):
    for attempt in range(max_retries):
        try:
            r = requests.get(url, headers={"Authorization": f"Bearer {KEY}"})
            if r.status_code == 429:
                wait = int(r.headers.get("Retry-After", 60))
                time.sleep(wait)
                continue
            if r.status_code >= 500:
                time.sleep(2 ** attempt)
                continue
            return r
        except requests.RequestException:
            time.sleep(2 ** attempt)
    raise Exception(f"Failed after {max_retries} retries")

การจัดการ auth error

def safe_call(url, key):
    r = requests.get(url, headers={"Authorization": f"Bearer {key}"})
    if r.status_code == 401:
        # Mind Key invalid — alert user
        raise AuthError("Mind Key invalid or expired")
    return r

สถานการณ์ error ทั่วไป

"Mind Key fehlt oder ungültig"

  • คุณลืม Authorization header
  • คุณใช้ ?key= แต่ key ผิด
  • คุณใช้ JWT ในที่ที่ต้องใช้ Mind Key

"Route not found"

  • คุณเดา path ที่ไม่มีอยู่
  • คุณใช้ verb ผิด (เช่น GET /memory เทียบกับ POST /memory)
  • ตรวจสอบ GET /endpoints สำหรับ path ที่ถูกต้อง

"Rate limit exceeded"

  • คุณใช้ ?key= และเกิน 60 req/min
  • เปลี่ยนไปใช้ Authorization: Bearer header

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