เอกสาร

คู่มืออ้างอิง API

เรียก AI Gateway ด้วย format เดียวกับ OpenAI — endpoint, พารามิเตอร์, error และ header ครบในหน้าเดียว

เริ่มเรียก AI Gateway ใน 3 ขั้นตอน

ถ้าแอปของคุณเรียก OpenAI อยู่แล้ว เปลี่ยนสองบรรทัดก็ใช้ Wisporta ได้ทันที

  1. 1

    สร้าง API key

    เข้า dashboard → API Keys → สร้าง key ใหม่ คีย์ขึ้นต้นด้วย sk- และระบบแสดงให้เห็นครั้งเดียวตอนสร้างเท่านั้น

  2. 2

    ชี้ base URL มาที่ Wisporta

    ใช้ client เดิมได้ เปลี่ยน base URL เป็น https://api.wisporta.com/v1 แล้วใส่ key ของ Wisporta แทน

  3. 3

    เลือก model

    ระบุเป็น provider/model เช่น openai/gpt-5.5 หรือใช้ alias สั้น ๆ เช่น claude-sonnet

first request
curl https://api.wisporta.com/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.5",
    "messages": [
      { "role": "user", "content": "Hello!" }
    ]
  }'

ดูว่ามี model อะไรให้เรียก

GET /v1/models เป็น endpoint สาธารณะ ไม่ต้องใส่ API key คืนรายการ model ที่เปิดให้ใช้พร้อมราคาขายต่อ 1M tokens หน่วย pts

list models
curl https://api.wisporta.com/v1/models

# → { "object": "list", "data": [ { "id": "openai/gpt-5.5", … } ] }
response cache ได้ 300 วินาที และมี ETag — ส่ง If-None-Match กลับมาแล้วตรงกันจะได้ 304 Not Modified · ถ้าส่ง Authorization header มาด้วยจะเป็น private, no-store

ชื่อ model เรียกได้ 2 แบบ

ชื่อเต็มopenai/gpt-5.5

provider/model — ระบุชัดเจนว่าจะใช้ provider ไหน แนะนำให้ใช้แบบนี้ใน production

aliasclaude-sonnetanthropic/claude-sonnet-5

ชื่อย่อที่ไม่มีเครื่องหมาย / — สะดวกตอนทดลอง แต่ปลายทางอาจเปลี่ยนได้เมื่อ catalog อัปเดต

พิมพ์ชื่อผิดจะได้ 400 model_not_found พร้อม suggestions ที่ใกล้เคียงที่สุดให้ใน response

provider ที่เปิดใช้งานอยู่

รายการนี้ดึงสดจาก /v1/models ทุกชั่วโมง

Anthropic4 model
anthropic/claude-fable-5anthropic/claude-opus-4-8
DeepSeek2 model
deepseek/deepseek-v4-prodeepseek/deepseek-v4-flash
Google4 model
google/gemini-3.1-progoogle/gemini-3.5-flash
OpenAI5 model
openai/gpt-5.5openai/gpt-5.4
ดูราคาทุก model ที่หน้าราคา

Request body ของ /v1/chat/completions

โครงสร้างเดียวกับ OpenAI Chat Completions บวกพารามิเตอร์ strategy ที่เป็นของ Wisporta เอง

พารามิเตอร์ชนิดค่าเริ่มต้นความหมาย
modelต้องระบุstringชื่อ model แบบเต็มหรือ alias
messagesต้องระบุarrayบทสนทนา แต่ละรายการมี role และ content — ต้องมีอย่างน้อย 1 รายการ
streambooleanfalsetrue = ส่งกลับเป็น SSE ทีละ token · ไม่ส่งมาถือว่า false
strategy"cost" | "latency" | "fallback""cost"วิธีเลือกปลายทางเมื่อ model มีตัวสำรอง — cost ถูกสุด, latency เร็วสุด, fallback ไล่ตามลำดับสำรอง
max_tokensnumberจำกัดจำนวน token ที่ให้ตอบ
temperaturenumber (0–2)ความสร้างสรรค์ 0–2 · บาง model ปฏิเสธพารามิเตอร์นี้ ระบบจะตัดออกให้เองไม่ต้องจัดการ

role ที่รับมีเพียง system, user, assistant — ยังไม่รองรับ role tool

รับคำตอบทีละ token

ใส่ "stream": true จะได้ text/event-stream รูปแบบ chat.completion.chunk เหมือน OpenAI และปิดท้ายด้วย data: [DONE]

streaming
curl https://api.wisporta.com/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "messages": [{ "role": "user", "content": "Tell me a joke" }],
    "stream": true
  }'

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{"content":"Why"},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]
ถ้าเกิด error หลัง stream เริ่มไปแล้ว ระบบจะส่ง frame ที่มี error.type = stream_error แล้วปิดด้วย [DONE] — สถานะ HTTP ยังเป็น 200 เพราะ header ถูกส่งไปก่อนหน้านั้นแล้ว ต้องตรวจ frame ด้วยไม่ใช่ดูแต่ status

Header ที่ควรอ่านจาก response

พอยท์คงเหลือและสถานะ model ติดมากับทุก response อยู่แล้ว ไม่ต้องยิง endpoint เพิ่มเพื่อเช็ก

Headerความหมาย
X-Credit-Balanceพอยท์คงเหลือของ organization ณ ตอนเริ่ม request
X-Credit-Expires-Atวันเวลาที่พอยท์จะหมดอายุ (ISO 8601)
X-Credit-Days-Leftจำนวนวันที่เหลือก่อนพอยท์หมดอายุ
X-Model-Deprecatedส่งค่า true เมื่อ model ที่เรียกกำลังจะเลิกให้บริการ — ยังใช้ได้แต่ควรย้าย
X-Model-Replaced-Byชื่อ model ที่ควรย้ายไปใช้แทน
Warningข้อความ 299 อ่านง่ายสำหรับ log ของคุณ

Error handling

gateway ตอบ error กลับมา 2 รูปแบบ — client ที่ parse แค่รูปแบบเดียวจะพังกับอีกรูปแบบ

flat

error เป็น string ตรง ๆ ใช้กับปัญหาเรื่องสิทธิ์ พอยท์ และ request ที่ผิดรูป

nested

error เป็น object ใช้กับปัญหาเรื่อง model และ provider ต้นทาง

error envelopes
// flat — auth, points, malformed request
{
  "error": "insufficient_credit",
  "message": "Insufficient points. Please add points to continue.",
  "balance": 0,
  "currency": "THB"
}

// nested — model and upstream provider problems
{
  "error": {
    "type": "invalid_request_error",
    "code": "model_not_found",
    "message": "…",
    "param": "model",
    "suggestions": ["openai/gpt-5.5"]
  }
}
ใน object แบบ nested ค่า code เป็น string เช่น model_not_found — ไม่ใช่ HTTP status ตัวเลข
codeHTTPรูปแบบความหมาย
invalid_request400flatbody ไม่ใช่ JSON หรือไม่ผ่าน validation (มีรายละเอียดใน details)
model_not_found400nestedไม่มี model ชื่อนี้ — ดู suggestions ใน response
unauthorized401flatAPI key ไม่ถูกต้อง ถูก revoke หรือไม่ได้ส่งมา
insufficient_credit402flatพอยท์คงเหลือไม่พอ
credit_expired402flatพอยท์หมดอายุแล้ว เติมใหม่เพื่อใช้งานต่อ
account_disabled403flatบัญชีผู้ใช้ถูกระงับ
organization_disabled403flatorganization ถูกระงับ
too_many_requests429flatมี request ของ organization นี้กำลังประมวลผลพร้อมกันเกิน 10 รายการ — รอให้รายการเดิมเสร็จแล้วส่งใหม่
internal_error500flatระบบขัดข้องภายใน ลองใหม่อีกครั้ง
upstream_error502nestedprovider ต้นทางตอบ error กลับมา
model_unavailable503nestedmodel ถูกปิดใช้งานชั่วคราว — response จะบอกตัวสำรองให้ถ้ามี
service_unavailable503flatไม่มี provider ที่พร้อมให้บริการสำหรับ model นี้

ใช้กับ SDK ของ OpenAI ได้ตรง ๆ

ไม่ต้องเปลี่ยน library ไม่ต้องเขียน HTTP client เอง — ตั้ง base_url และ api_key เท่านั้น

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.wisporta.com/v1",
    api_key="YOUR_WISPORTA_KEY",
)

response = client.chat.completions.create(
    model="openai/gpt-5.5",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
node
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.wisporta.com/v1",
  apiKey: process.env.WISPORTA_API_KEY,
});

const response = await client.chat.completions.create({
  model: "openai/gpt-5.5",
  messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);

ข้อจำกัดที่ควรรู้

จำนวน request พร้อมกัน

หนึ่ง organization ประมวลผลได้ 10 request พร้อมกัน เกินกว่านั้นได้ 429 too_many_requests ทันที

พอยท์และการหมดอายุ

ระบบตัดพอยท์หลัง request สำเร็จ และพอยท์มีอายุ 30 วันนับจากการเติมครั้งล่าสุด — ดูรายละเอียดในคู่มือ Web App

นี่ไม่ใช่ rate limit — ส่งงานเรื่อย ๆ ทีละไม่กี่รายการจะไม่ติดเพดานนี้ไม่ว่าจะยิงนานเท่าไร ปัจจุบันยังไม่มีการจำกัดจำนวน request ต่อช่วงเวลาต่อ key
อ่านต่อจัดการองค์กร คีย์ และพอยท์ผ่าน dashboardคู่มือการใช้งาน Web App

พร้อมเริ่มต้นหรือยัง?

สมัครฟรีวันนี้ ไม่ต้องใส่บัตรเครดิต เติม credit เมื่อพร้อมใช้งานจริง

ออกใบกำกับภาษีอิเล็กทรอนิกส์ e-Tax Invoice & e-Receipt ทุกยอดเติม credit