การอ้างอิง API
ข้อตกลงทั่วไป
URL ฐาน
จุดเชื่อมต่อทั้งหมดให้บริการภายใต้คำนำหน้า /v1
การรับรองความถูกต้อง
การเรียกจุดเชื่อมต่อ /v1/* ใช้การรับรองความถูกต้อง คีย์ API (ไม่ใช่ JWT) คีย์ API ส่งผ่านส่วนหัวต่อไปนี้:
| ส่วนหัว | รูปแบบ | คำอธิบาย |
|---|---|---|
Authorization | Bearer <api_key> | สไตล์ OpenAI จุดเชื่อมต่อที่เข้ากันได้กับ Anthropic ยังยอมรับ x-api-key กับ anthropic-version: 2023-06-01 |
คีย์ที่ขาดหายไปหรือไม่ถูกต้องจะส่งกลับ 401
การตรวจสอบยอดคงเหลือล่วงหน้า
จุดเชื่อมต่อเรียกโมเดลทั้งหมดจะตรวจสอบยอดคงเหลือก่อนการดำเนินการ:
- ยอดคงเหลือไม่เพียงพอจะส่งกลับ
Insufficient credit, แมปเป็น:- พิธีสาร OpenAI: HTTP
400,code = insufficient_quota - พิธีสาร Anthropic: HTTP
402,type = billing_error
- พิธีสาร OpenAI: HTTP
- จุดเชื่อมต่อบางรายการยังประเมินต้นทุนขั้นต่ำต่อโมเดลสำหรับการตรวจสอบล่วงหน้าครั้งที่สอง
Create Chat CompletionPOSThttps://api.basicrouter.ai/api/v1/chat/completions
จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI Chat Completions รองรับการสตรีมและไม่สตรีม การเรียก เครื่องมือ โหมด JSON และอินพุตหลายรูปแบบ
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
model | String | ใช่ | ชื่อโมเดล |
messages | Message[] | ใช่ | ข้อความสนทนา |
stream | Boolean | ไม่ | โหมดสตรีม ค่าเริ่มต้น false |
temperature | Double | ไม่ | อุณหภูมิการสุ่มตัวอย่าง |
max_tokens | Integer | ไม่ | โทเค็นเอาต์พุตสูงสุด |
top_p | Double | ไม่ | การสุ่มตัวอย่างนิวเคลียส |
presence_penalty | Double | ไม่ | — |
frequency_penalty | Double | ไม่ | — |
tools | Tool[] | ไม่ | นิยามเครื่องมือ |
tool_choice | String|Object | ไม่ | auto / none / required / ระบุฟังก์ชันเฉพาะ |
response_format | Object | ไม่ | {type, json_schema:{name,schema,strict}}; text/json_object/json_schema. |
parallel_tool_calls | Boolean | ไม่ | — |
metadata | Map | ไม่ | ข้อมูลเมตาแบบส่งผ่าน |
ฟิลด์ของ Message:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
role | String | system / user / assistant / tool. |
content | String|Array | ข้อความธรรมดาหรืออาร์เรย์ของบล็อกเนื้อหาหลายรูปแบบ ([{type:"text",text},{type:"image_url",image_url:{url}}]) |
tool_call_id | String | เชื่อมโยงไปยัง tool_calls เมื่อ role=tool |
tool_calls | ToolCall[] | มีเมื่อ role=assistant เรียกเครื่องมือ |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
type | String | ค่าคงที่ function |
function | Object | นิยามฟังก์ชัน |
function.name | String | ชื่อฟังก์ชัน |
function.description | String | คำอธิบายฟังก์ชัน |
function.parameters | Object | JSON Schema สำหรับอินพุต |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/chat/completions \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}],
"stream": false,
"temperature": 0.7
}'{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1721380000,
"model": "glm-5.2",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Hangzhou is ..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 12, "completion_tokens": 18, "total_tokens": 30}
}ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการเติมเต็ม |
object | String | ค่าคงที่ chat.completion |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
model | String | ชื่อโมเดล |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการเรียกเครื่องมือ |
type | String | ค่าคงที่ function |
function | Object | รายละเอียดการเรียกฟังก์ชัน |
function.name | String | ชื่อฟังก์ชัน |
function.arguments | Object | อาร์กิวเมนต์ฟังก์ชัน |
ตัวอย่างการตอบกลับแบบสตรีม:
data: {"object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":"..."}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"..."}}]}
data: [DONE]Create ResponsePOSThttps://api.basicrouter.ai/api/v1/responses
จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI Responses ใช้ input แทน messages instructions แทนข้อความระบบ และ บล็อก text แทน response_format
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
model | String | ใช่ | ชื่อโมเดล |
input | String|Array | ใช่ | สตริงธรรมดา (ข้อความผู้ใช้) หรืออาร์เรย์ออบเจ็กต์ข้อความ |
instructions | String | ไม่ | พร้อมต์ระบบ |
stream | Boolean | ไม่ | ค่าเริ่มต้น false |
max_output_tokens | Integer | ไม่ | โทเค็นเอาต์พุตสูงสุด |
temperature | Double | ไม่ | ค่าเริ่มต้น 1 |
top_p | Double | ไม่ | — |
tools | Tool[] | ไม่ | ระดับบน {type, name, description, parameters} |
tool_choice | String|Object | ไม่ | auto/none/required/{type,name}. |
text | Object | ไม่ | {format:{type, name, schema, strict}}; text/json_object/json_schema. |
metadata | Map | ไม่ | — |
previous_response_id | String | ไม่ | รหัสการตอบกลับก่อนหน้าสำหรับหลายรอบ |
parallel_tool_calls | Boolean | ไม่ | — |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/responses \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"input": "Describe Hangzhou in one sentence.",
"instructions": "Be concise.",
"stream": false
}'{
"id": "resp_xxx",
"object": "response",
"model": "glm-5.2",
"status": "completed",
"created_at": 1721380000,
"output": [
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"content": [{"type": "output_text", "text": "Hangzhou is ..."}],
"status": "completed"
}
],
"usage": {"input_tokens": 12, "output_tokens": 18, "total_tokens": 30}
}ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการตอบกลับ |
object | String | ค่าคงที่ response |
model | String | ชื่อโมเดล |
status | String | เช่น completed |
created_at | Long | การประทับเวลาที่สร้าง (วินาที) |
output | Array | รายการเอาต์พุต รายการข้อความ: {id, type:"message", role, content:[{type:"output_text", text}], status} รายการเรียกเครื่องมือ: {type:"function_call", id, name, call_id, arguments, status} |
usage | Object | {input_tokens, output_tokens, total_tokens} สำหรับโมเดล Claude input_tokens รวม cache_read และ output_tokens รวม cache_write |
การสตรีมตามเหตุการณ์ API Responses:
| เหตุการณ์ | คำอธิบาย |
|---|---|
response.created | จุดเริ่มต้นของสตรีมการตอบกลับ |
response.output_text.delta | การอัปเดตเอาต์พุตข้อความแบบเพิ่มขึ้น |
response.completed | จุดสิ้นสุดของสตรีมการตอบกลับ |
Create Anthropic MessagePOSThttps://api.basicrouter.ai/api/v1/messages
จุดเชื่อมต่อที่เข้ากันได้กับ Anthropic Messages ยอมรับส่วนหัว x-api-key และ anthropic-version: 2023-06-01 บล็อกเนื้อหารองรับ text, image, tool_use, tool_result, thinking และ redacted_thinking
| ฟิลด์ | ประเภท | จำเป็น | ฟิลด์ JSON | คำอธิบาย |
|---|---|---|---|---|
model | String | ใช่ | model | ชื่อโมเดล |
messages | Message[] | ใช่ | messages | ข้อความสนทนา |
system | String|Array | ไม่ | system | พร้อมต์ระบบ สตริงหรือ [{type,text}] |
maxTokens | Integer | ใช่ | max_tokens | โทเค็นเอาต์พุตสูงสุด |
stream | Boolean | ไม่ | stream | การสตรีม |
temperature | Double | ไม่ | temperature | — |
topP | Double | ไม่ | top_p | — |
topK | Integer | ไม่ | top_k | — |
tools | Tool[] | ไม่ | tools | นิยามเครื่องมือ (input_schema) |
toolChoice | Object | ไม่ | tool_choice | — |
metadata | Map | ไม่ | metadata | — |
thinking | Object | ไม่ | thinking | การกำหนดค่าการคิดแบบขยาย |
stopSequences | Object | ไม่ | stop_sequences | — |
anthropicBeta | Object | ไม่ | anthropic_beta | ส่วนหัวฟีเจอร์เบต้า |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
role | String | บทบาทข้อความ เช่น user / assistant |
content | String|ContentBlock[] | ข้อความธรรมดาหรืออาร์เรย์ของบล็อกเนื้อหา |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
type | String | หนึ่งใน text, image, tool_use, tool_result, thinking, redacted_thinking |
text | String | มีเมื่อ type เป็น text |
source | Object | มีเมื่อ type เป็น image |
ตัวอย่างบล็อกภาพ:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
name | String | ชื่อฟังก์ชัน |
description | String | คำอธิบายฟังก์ชัน |
input_schema | Object | JSON Schema สำหรับอินพุต |
cache_control | Object | การควบคุมแคชที่เลือกได้ |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/messages \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-4.6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}]
}'{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4.6",
"content": [{"type": "text", "text": "Hangzhou is ..."}],
"stop_reason": "end_turn",
"usage": {"input_tokens": 12, "output_tokens": 18}
}ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสข้อความ |
type | String | ค่าคงที่ message |
role | String | ค่าคงที่ assistant |
model | String | ชื่อโมเดล |
content | ContentBlock[] | บล็อกเนื้อหาของการตอบกลับ (เช่น {type:"text", text}, {type:"tool_use", ...}) |
stop_reason | String | เช่น end_turn, tool_use, max_tokens |
usage | Object | {input_tokens, output_tokens} |
| เหตุการณ์ | คำอธิบาย |
|---|---|
message_start | จุดเริ่มต้นของสตรีมข้อความ |
content_block_start | จุดเริ่มต้นของบล็อกเนื้อหาใหม่ |
content_block_delta | การอัปเดตแบบเพิ่มขึ้นสำหรับบล็อกเนื้อหา |
content_block_stop | จุดสิ้นสุดของบล็อกเนื้อหา |
message_delta | การอัปเดตแบบเพิ่มขึ้นสำหรับข้อความ |
message_stop | จุดสิ้นสุดของสตรีมข้อความ |
List ModelsGEThttps://api.basicrouter.ai/api/v1/models
ส่งคืนโมเดล API ที่ออนไลน์และเปิดใช้งานทั้งหมด
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"object": "list",
"data": [
{
"id": "glm-5.2",
"object": "model",
"display_name": "glm-5.2",
"created": 1721380000,
"owned_by": "Zai",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"context_length": 128000,
"description": "..."
}
]
}ฟิลด์ของแต่ละรายการโมเดล (data[]):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ model |
display_name | String | ชื่อที่แสดง |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
owned_by | String | เจ้าของ / ผู้ผลิต |
input_modalities | String[] | เช่น ["text","image"] |
output_modalities | String[] | เช่น ["text"] |
context_length | Integer | ความยาวบริบทสูงสุด |
description | String | คำอธิบายโมเดล |
Retrieve ModelGEThttps://api.basicrouter.ai/api/v1/models/{model}
ส่งคืนโมเดลเดียวที่มีรูปร่างเดียวกับรายการในรายการ ส่งกลับ HTTP 404 เมื่อ โมเดลไม่มีอยู่
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $BASICROUTER_API_KEY"การตอบกลับสำเร็จ: ออบเจ็กต์โมเดลเดียวที่มีฟิลด์เดียวกันกับ รายการใน /v1/models
เมื่อโมเดลไม่มีอยู่ จะส่งกลับ HTTP 404:
{"error": {"message": "The model 'xxx' does not exist", "type": "invalid_request_error", "code": "invalid_model_error"}}List Image ModelsGEThttps://api.basicrouter.ai/api/v1/image-models
สอบถามความละเอียด อัตราส่วน และจำนวนสูงสุดที่รองรับโดยโมเดลภาพก่อน เรียก /v1/image-generations ไม่ต้องรับรองความถูกต้อง
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ image_model |
displayName | String | ชื่อที่แสดง |
description | String | คำอธิบายโมเดล |
icon | String | URL ไอคอน |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
maxCount | Integer | ภาพสูงสุดต่อคำขอ |
fileMax | Integer | ภาพอ้างอิงสูงสุด เมื่อเป็น 0 จะไม่รองรับการสร้างภาพจากภาพ |
resolutions | String[] | ความละเอียดที่รองรับ เช่น ["720p","1080p"] |
ratios | String[] | อัตราส่วนภาพที่รองรับ เช่น ["1:1","3:2"] |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"object": "list",
"data": [
{
"id": "gpt-image-2",
"object": "image_model",
"displayName": "GPT Image 1",
"description": "...",
"icon": "...",
"created": 1721380000,
"maxCount": 4,
"fileMax": 10,
"resolutions": ["720p", "1080p"],
"ratios": ["1:1", "3:2"]
}
]
}List Video ModelsGEThttps://api.basicrouter.ai/api/v1/video-models
สอบถามค่า videoType ที่รองรับ ช่วงระยะเวลา ความละเอียด และ อัตราส่วนสำหรับโมเดลวิดีโอก่อนเรียก /v1/video-generations ไม่ ต้องรับรองความถูกต้อง
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ video_model |
displayName | String | ชื่อที่แสดง |
description | String | คำอธิบายโมเดล |
icon | String | URL ไอคอน |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
allowedVideoTypes | VideoTypeOption[] | รายการ videoType ที่รองรับ |
videoDurationMin | Integer | วินาทีขั้นต่ำต่อคลิป |
videoDurationMax | Integer | วินาทีสูงสุดต่อคลิป |
videoDurationSuggest | Integer[] | ขั้นระยะเวลาที่แนะนำ เช่น [5,8,10] |
resolutions | String[] | ความละเอียดที่รองรับ |
ratios | String[] | อัตราส่วนภาพที่รองรับ |
resolutionOptions | ResolutionOption[] | ชุดค่าผสมความละเอียด+อัตราส่วน+ขนาดแบบโครงสร้าง |
fileMax | Integer | เนื้อหาอ้างอิงสูงสุด |
ฟิลด์ของ VideoTypeOption:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
code | Integer | ค่า videoType ที่ต้องส่งไปยัง /v1/video-generations |
name | String | ชื่อประเภทที่แปลแล้ว (ข้อความเป็นวิดีโอ / ภาพเป็นวิดีโอ / ...) |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"object": "list",
"data": [
{
"id": "sora-2",
"object": "video_model",
"displayName": "Sora 2",
"description": "...",
"icon": "...",
"created": 1721380000,
"allowedVideoTypes": [
{"code": 1, "name": "text-to-video"},
{"code": 2, "name": "image-to-video"},
{"code": 3, "name": "image-to-video (first/last frame)"}
],
"videoDurationMin": 5,
"videoDurationMax": 10,
"videoDurationSuggest": [5, 8, 10],
"resolutions": ["1080p", "720p"],
"ratios": ["16:9", "9:16"],
"fileMax": 5
}
]
}คำอธิบายฟิลด์ระดับราคา
4 endpoint สำหรับการคิวรีโมเดล /v1/models, /v1/models/{model}, /v1/image-models และ /v1/video-models จะคืนค่าราคาที่เรียกเก็บจริงสำหรับผู้เรียก (ผู้ใช้ API Key) ซึ่งตรงกับค่าใช้จ่ายจริง และคืนค่าระดับราคาทั้งหมดของโมเดลนั้น
ความแตกต่างของชื่อฟิลด์:/v1/models / /v1/models/{model} ใช้สไตล์ OpenAI snake_case (price_tiers); /v1/image-models / /v1/video-models ใช้ camelCase (priceTiers)โครงสร้างเหมือนกัน
price_tiers / priceTiers เป็น array โดยแต่ละ element คือระดับราคา:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
outputPrice | decimal | ราคาต่อหน่วยเอาต์พุตที่มีผลสำหรับผู้เรียกปัจจุบัน |
cachePrice | decimal | ราคาแคช (โมเดลทั่วไป, ใช้สูตรการเรียกเก็บเงินแบบเก่า) |
cacheReadPrice | decimal | ราคาต่อหน่วยการอ่านแคช (เฉพาะ Bedrock Claude) |
cacheWritePrice | decimal | ราคาต่อหน่วยการเขียนแคช (เฉพาะ Bedrock Claude) |
ratio | decimal | อัตราคูณการเรียกเก็บเงิน โหมด FIXED คือ 1; โหมด RATIO คือ อัตราคูณของผู้ใช้/กลุ่ม |
mode | string | โหมดราคา:RATIO / FIXED |
planId | string | ID แผนราคาที่ตรงกัน อาจเป็น null |
โมเดลทั้งสามประเภทใช้โครงสร้างเดียวกัน ต่างกันที่การเติมฟิลด์คำอธิบายเท่านั้น ฟิลด์ที่ไม่เกี่ยวข้องเป็น null:
| ประเภทโมเดล | UNIT | ฟิลด์คำอธิบายที่มีผล |
|---|---|---|
| ข้อความ | token | region / bandMin / bandMax |
| รูปภาพ | image | resolution / clarity |
| วิดีโอ | video | resolution / clarity |
ความหมายของราคา:ค่า inputPrice / outputPrice / cacheReadPrice / cacheWritePrice ที่คืนมา เป็นหน่วยราคาเรียกเก็บสุดท้ายสำหรับผู้ใช้ API Key ปัจจุบัน หลังจากแก้ไขผ่าน price chain (chain)→ guidance → ราคาฐาน ตรงกับค่าใช้จ่ายจริง หน่วยราคาที่ผู้เรียกเห็นจะแตกต่างกันตามกลุ่ม pricing chain (reseller / distributor / องค์กร / การตั้งค่าระดับผู้ใช้)
ยอดหักจริง = ปริมาณการใช้ ÷ quantity × ราคาต่อหน่วยที่เกี่ยวข้อง × ratio สำหรับวิดีโอที่คิดตามวินาที: ยอดหักจริง = duration × outputPrice × ratio
การจัดการขอบเขตและข้อยกเว้น (endpoint แบบอ่านอย่างเดียวจะไม่คืน 500 เนื่องจากปัญหาการตั้งค่าราคา)
| สถานการณ์ | พฤติกรรม |
|---|---|
| การแก้ไขระดับราคาเดียวล้มเหลว (นโยบายราคาปฏิเสธการเข้าถึง, การตั้งค่าขาดหาย) | ข้ามระดับนั้น บันทึก warn log แล้วแก้ไขระดับที่เหลือต่อ |
| ระดับราคาทั้งหมดของโมเดลแก้ไขไม่สำเร็จ | เป็น array ว่าง [] โมเดลยังคงคืนค่าปกติ |
| โมเดลไม่มีการตั้งค่าราคาใดๆ | เป็น array ว่าง [] |
| การแก้ไขราคาเกิดข้อยกเว้นที่ไม่ได้จัดการ | try-catch ทั้งหมด คืนค่า array ว่าง endpoint ยังคง 200 |
ตัวอย่างการตอบกลับ (/v1/models, โมเดลข้อความ):
{
"object": "list",
"data": [
{
"id": "gpt-4o",
"object": "model",
"display_name": "gpt-4o",
"context_length": 128000,
"price_tiers": [
{
"region": "GLOBAL",
"bandMin": null,
"bandMax": null,
"resolution": null,
"clarity": null,
"unit": "token",
"quantity": 1000,
"description": "ต่อ 1,000 token",
"inputPrice": 0.0025,
"outputPrice": 0.01,
"cachePrice": 0.00125,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}ตัวอย่างการตอบกลับ (/v1/image-models, โมเดลรูปภาพ, โครงสร้าง priceTiers เหมือนข้างต้น, unit คือ image):
{
"object": "list",
"data": [
{
"id": "dall-e-3",
"object": "image_model",
"displayName": "dall-e-3",
"resolutions": ["1024x1024", "1792x1024", "1024x1792"],
"priceTiers": [
{
"region": null,
"bandMin": null,
"bandMax": null,
"resolution": "1024x1024",
"clarity": "standard",
"unit": "image",
"quantity": 1,
"description": "ต่อรูป",
"inputPrice": 0,
"outputPrice": 0.04,
"cachePrice": 0,
"cacheReadPrice": 0,
"cacheWritePrice": 0,
"ratio": 1,
"mode": "RATIO",
"planId": null
}
]
}
]
}Create Image GenerationPOSThttps://api.basicrouter.ai/api/v1/image-generations
ส่งงานสร้างภาพแบบอะซิงโครนัส ส่งคืน taskId ทันที ดึงผลลัพธ์โดยโพล GET /v1/image-generations/{taskId} หรือผ่าน เว็บฮุก callbackUrl
model ค่า resolution / ratio ที่รองรับ ขีดจำกัดบน count และขีดจำกัดการอัปโหลดภาพอ้างอิง (fileMax) ต้องได้รับจาก GET /v1/image-models ก่อน ยอมรับเฉพาะค่า ที่ระบุในสเปกของโมเดลนั้นเท่านั้น
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
text | String | ใช่ | พร้อมต์ |
model | String | ใช่ | ชื่อโมเดล |
imageUrls | String[] | ไม่ | URL ภาพอ้างอิง (ภาพเป็นภาพ) |
count | Integer | ไม่ | จำนวนภาพ (≥0) |
resolution | String | ไม่ | ความละเอียด (ดู /v1/image-models) |
ratio | String | ไม่ | อัตราส่วนภาพ |
callbackUrl | String | ไม่ | URL เว็บฮุกระดับงาน |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/image-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": []
}'{
"code": 200,
"message": "image task is commit",
"data": {"taskId": "img_xxx"}
}การตอบกลับข้อผิดพลาด:
// Insufficient credit
{ "code": 500, "message": "Insufficient credit" }
// Model not found
{ "code": 404, "message": "Model not found: xxx" }Retrieve Image GenerationGEThttps://api.basicrouter.ai/api/v1/image-generations/{taskId}
โพลงานสร้างภาพ status คือ pending / success / failed images เป็นอาร์เรย์ URL ของภาพที่แปลงเป็นสตริง JSON text มีคำอธิบายข้อความที่โมเดลแนบมา (เช่น เอาต์พุตหลายรูปแบบของ Gemini) หากไม่มีจะเป็น null
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-generations/img_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"code": 200,
"message": "success",
"data": {
"taskId": "img_xxx",
"status": "success",
"errorMessage": null,
"images": "[\"https://.../1.png\"]",
"text": null
}
}ฟิลด์ data การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
taskId | String | รหัสงาน |
status | String | pending / success / failed. |
errorMessage | String | เหตุผลความล้มเหลว null เมื่อสำเร็จ |
images | String | สตริง JSON ของอาร์เรย์ URL ภาพ เช่น "[\"https://.../1.png\"]" |
text | String | คำอธิบายข้อความที่โมเดลแนบมา (เช่น เอาต์พุตหลายรูปแบบของ Gemini) มิฉะนั้นเป็น null |
ไม่พบงาน:
{ "code": 500, "message": "task not found" }หากระบุ callbackUrl ไว้ตอนส่ง เซิร์ฟเวอร์จะส่งผลลัพธ์ success / failed ขั้นสุดท้ายผ่านเว็บฮุกด้วยรูปแบบ data เดียวกัน
ตัวอย่างแบบเต็ม (ส่ง + โพล)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ImageGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task.
String body = "{"
+ "\"model\":\"seedream-4.5\","
+ "\"text\":\"A cat drinking water by the river\","
+ "\"count\":1,"
+ "\"resolution\":\"2k\","
+ "\"ratio\":\"1:1\","
+ "\"imageUrls\":[]"
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status.
String status = "pending";
while ("pending".equals(status)) {
Thread.sleep(15_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
status = extract(poll.body(), "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("image generation failed: " + status);
}
// images is a JSON-stringified array of URLs.
String images = extract(pollResult(http, taskId), "images");
System.out.println("images = " + images);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
private static String pollResult(HttpClient http, String taskId) throws Exception {
return http.send(HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString()).body();
}
}import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task.
resp = requests.post(
f"{BASE}/image-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": [],
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status.
while True:
time.sleep(15)
poll = requests.get(f"{BASE}/image-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"image generation failed: {data.get('errorMessage')}")
# images is a JSON-stringified array of URLs.
import json
images = json.loads(data["images"])
print(f"images = {images}")Create Video GenerationPOSThttps://api.basicrouter.ai/api/v1/video-generations
ส่งงานสร้างวิดีโอแบบอะซิงโครนัส ส่งคืน taskId ทันที ดึงผลลัพธ์โดยโพล GET /v1/video-generations/{taskId} หรือผ่าน เว็บฮุก callbackUrl
model ค่า videoType ที่อนุญาต ช่วงระยะเวลา (videoDurationMin/Max) resolution / ratio ที่รองรับ และขีดจำกัดการอัปโหลดเนื้อหาอ้างอิง (fileMax) ต้อง ได้รับจาก GET /v1/video-models ก่อน ยอมรับเฉพาะ รหัส videoType ที่ระบุใน allowedVideoTypes ของโมเดลนั้นเท่านั้น
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
text | String | ใช่ | พร้อมต์ |
model | String | ใช่ | ชื่อโมเดล |
videoType | Integer | ใช่ | 1 ข้อความเป็นวิดีโอ / 2 ภาพเป็นวิดีโอ (เฟรมแรก) / 3 ภาพเป็นวิดีโอ (เฟรมแรกและเฟรมสุดท้าย) / 4 ภาพเป็นวิดีโอ (อ้างอิง) / 5 อ้างอิงทั้งหมด |
imageUrls | String[] | ไม่ | URL เนื้อหาภาพ |
videoUrls | VideoUrl[]|String[] | ไม่ | URL เนื้อหาวิดีโอ |
audioUrls | String[] | ไม่ | URL เนื้อหาเสียง |
resolution | String | ไม่ | ความละเอียด |
ratio | String | ไม่ | อัตราส่วนภาพ |
duration | Long | ไม่ | วินาที (>0) |
callbackUrl | String | ไม่ | URL เว็บฮุกระดับงาน |
ตัวอย่างสำหรับแต่ละ videoType:
1. ข้อความเป็นวิดีโอ (videoType=1)
สร้างวิดีโอจากพร้อมต์ข้อความเท่านั้น ไม่ต้องมีเนื้อหาอ้างอิง
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0"
}'2. ภาพเป็นวิดีโอ - เฟรมแรก (videoType=2)
ระบุเฟรมเริ่มต้นเดียวใน imageUrls โมเดลจะสร้างวิดีโอ เริ่มจากเฟรมนั้น
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 2,
"text": "Happily shaking head",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": ["https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png"]
}'3. ภาพเป็นวิดีโอ - เฟรมแรกและสุดท้าย (videoType=3)
ระบุทั้งเฟรมแรกและสุดท้ายใน imageUrls (ลำดับ: [first, last]) โมเดลจะสร้างวิดีโอเปลี่ยนผ่านระหว่างสอง เฟรม
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 3,
"text": "Put on the hat",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/last-frame.png"
]
}'4. ภาพเป็นวิดีโอ - อ้างอิง (videoType=4)
ระบุภาพอ้างอิงหนึ่งภาพขึ้นไปใน imageUrls โมเดลจะใช้ สไตล์/เนื้อหาเป็นอ้างอิง (ไม่ใช่เฟรมแรก/สุดท้ายที่บังคับ) เพื่อสร้างวิดีโอ
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 4,
"text": "Two cats playing together",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "kling-v3-omni-video",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-1.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-2.png"
]
}'5. อ้างอิงทั้งหมด (videoType=5)
อ้างอิงภาพ / วิดีโอ / เสียงแบบผสม อ้างอิงเนื้อหาตามตำแหน่งในพร้อมต์: รายการ ที่ 1 ใน imageUrls คือ @图片 1 รายการที่ 1 ใน videoUrls คือ @视频 1 รายการที่ 1 ใน audioUrls คือ @音频 1 videoUrls ยังยอมรับสตริง URL แบบธรรมดา
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 5,
"text": "Use the first-person framing of @视频 1 and @音频 1 as background music. First-person tea ad; start frame is @图片 1 ... end frame is @图片 2.",
"model": "seedance-2.0",
"imageUrls": [
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic1.jpg",
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic2.jpg"
],
"videoUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_tea_video1.mp4"],
"audioUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_audio/r2v_tea_audio1.mp3"],
"resolution": "1080p",
"ratio": "16:9",
"duration": 11
}'การตอบกลับการส่ง (ทั้งห้าประเภท):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}Retrieve Video GenerationGEThttps://api.basicrouter.ai/api/v1/video-generations/{taskId}
โพลงานสร้างวิดีโอ status คือ pending / success / failed videoUrl คือ URL ของวิดีโอที่สร้างขึ้น และ lastFrameUrl คือ URL ของเฟรมสุดท้าย (สถานการณ์ภาพเป็นวิดีโอ)
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-generations/vid_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"code": 200,
"message": "success",
"data": {
"status": "success",
"videoUrl": "https://.../out.mp4",
"lastFrameUrl": null,
"message": null
}
}ฟิลด์ data การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL วิดีโอที่สร้าง |
lastFrameUrl | String | URL เฟรมสุดท้าย (กรณีภาพเป็นวิดีโอ) มิฉะนั้นเป็น null |
message | String | เหตุผลความล้มเหลว null เมื่อสำเร็จ |
หากระบุ callbackUrl ไว้ตอนส่ง เซิร์ฟเวอร์จะส่งผลลัพธ์ขั้นสุดท้าย ผ่านเว็บฮุกด้วยรูปแบบ data เดียวกัน
ตัวอย่างแบบเต็ม (ส่ง + โพล)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class VideoGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task (videoType=1: text-to-video).
String body = "{"
+ "\"videoType\":1,"
+ "\"text\":\"A cat jumping on a bed\","
+ "\"resolution\":\"480p\","
+ "\"ratio\":\"16:9\","
+ "\"duration\":4,"
+ "\"model\":\"seedance-2.0\""
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status. Video tasks take longer — poll every 20s.
String status = "pending";
String lastBody = null;
while ("pending".equals(status)) {
Thread.sleep(20_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
lastBody = poll.body();
status = extract(lastBody, "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("video generation failed: " + status);
}
String videoUrl = extract(lastBody, "videoUrl");
System.out.println("videoUrl = " + videoUrl);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
}import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task (videoType=1: text-to-video).
resp = requests.post(
f"{BASE}/video-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status. Video tasks take longer — poll every 20s.
while True:
time.sleep(20)
poll = requests.get(f"{BASE}/video-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"video generation failed: {data.get('message')}")
print(f"videoUrl = {data['videoUrl']}")
if data.get("lastFrameUrl"):
print(f"lastFrameUrl = {data['lastFrameUrl']}")Retrieve Billing BalanceGEThttps://api.basicrouter.ai/api/v1/billing/balance
ส่งคืนยอดคงเหลือบัญชีแบ่งเป็นกระเป๋าเงินสามใบ: แผนรายเดือน แพ็กเกจทรัพยากร และ เครดิตจ่ายตามการใช้งาน
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"{
"totalCredit": 128.50,
"totalResourceCredit": 30.00,
"wallets": {
"monthlyPlan": {"id": "pkg_xxx", "credit": 50.00, "name": "Monthly plan"},
"resourcePacks": [
{"id": "rp_xxx", "credit": 30.00, "name": "Video resource pack"}
],
"payAsYouGo": 48.50
}
}ฟิลด์การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
totalCredit | BigDecimal | ยอดคงเหลือรวม |
totalResourceCredit | BigDecimal | ผลรวมยอดคงเหลือแพ็กเกจทรัพยากร |
wallets.monthlyPlan | WalletDetail | แผนรายเดือน (null หากไม่มี) |
wallets.resourcePacks | WalletDetail[] | รายการแพ็กเกจทรัพยากร |
wallets.payAsYouGo | BigDecimal | ยอดคงเหลือจ่ายตามการใช้งาน |
WalletDetailVO fields::
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสกระเป๋าเงิน |
credit | BigDecimal | เครดิตคงเหลือ |
name | String | ชื่อกระเป๋าเงิน |
List UsageGEThttps://api.basicrouter.ai/api/v1/usage
รายละเอียดการเรียกเก็บเงินการเรียกโมเดลแบบแบ่งหน้า สแนปชอตตามราคา (priceSnapshotId) เรียงตามเวลาสร้างคำสั่งซื้อจากมากไปน้อย ส่งคืนเฉพาะ ระเบียนค่าใช้จ่ายปกติ (reason = model usage) เท่านั้น
พารามิเตอร์การค้นหา:
| พารามิเตอร์ | ประเภท | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|---|
page | Integer | ไม่ | 1 | หมายเลขหน้า เริ่มจาก 1 |
size | Integer | ไม่ | 20 | ขนาดหน้า (แบ่งหน้าตาม priceSnapshotId) |
startTime | LocalDateTime | ไม่ | — | เวลาเริ่มต้น รูปแบบ yyyy-MM-ddTHH:mm:ss กรองตาม orderCreatedAt ของสแนปชอต |
endTime | LocalDateTime | ไม่ | — | เวลาสิ้นสุด รูปแบบ yyyy-MM-ddTHH:mm:ss |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/usage?page=1&size=20&startTime=2026-07-01T00:00:00&endTime=2026-07-31T23:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"ตัวห่อหุ้มการตอบกลับ:
{
"code": 0,
"message": "success",
"data": { ... }
}| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
records | UsageDetailVO[] | ระเบียนหน้าปัจจุบัน |
total | Long | จำนวนรวม |
current | Long | หน้าปัจจุบัน |
size | Long | ขนาดหน้า |
pages | Long | หน้าทั้งหมด |
ฟิลด์ของ UsageDetailVO:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
priceSnapshotId | String | รหัสสแนปชอตราคา |
taskId | String | รหัสงาน |
credit | BigDecimal | จำนวนเงินที่เรียกเก็บ |
model | String | ชื่อโมเดล |
modelType | String | text / image / video. |
inputTokens | Long | โทเค็นอินพุต null สำหรับภาพ/วิดีโอ |
outputTokens | Long | โทเค็นเอาต์พุต |
totalTokens | Long | โทเค็นรวม |
cacheReadTokens | Long | โทเค็นอ่านแคช |
cacheWriteTokens | Long | โทเค็นเขียนแคช |
imageCount | Integer | จำนวนภาพ ตั้งค่าสำหรับโมเดลภาพ |
imageResolution | String | ความละเอียดภาพ เช่น 720P |
imageRatio | String | อัตราส่วนภาพ เช่น 1:1 |
videoResolution | String | ความละเอียดวิดีโอ เช่น 1080p |
videoRatio | String | อัตราส่วนวิดีโอ เช่น 16:9 |
videoDurationSec | Long | ระยะเวลาวิดีโอเป็นวินาที |
orderCreatedAt | LocalDateTime | เวลาสร้างคำสั่งซื้อ (สแนปชอต orderCreatedAt) |
creditDetails | CreditDetailItem[] | รายละเอียดคำสั่งซื้อภายใต้สแนปชอตนี้ (จาก credit_order_t) |
ฟิลด์ของ CreditDetailItem:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
credit | BigDecimal | จำนวนเงินที่เรียกเก็บโดยคำสั่งซื้อนี้ |
deductionSource | String | แหล่งที่มาของการหักเงิน (Balance / Monthly Package / Resource Package) |
packageName | String | ชื่อแพ็กเกจ null หากไม่มีแพ็กเกจ |
อนุสัญญาค่าว่าง: เฉพาะฟิลด์ที่เกี่ยวข้องกับแต่ละ modelType เท่านั้นที่ ถูกเติม ส่วนที่เหลือเป็น null text เติมฟิลด์โทเค็น image เติม imageCount/imageResolution/imageRatio video เติม videoResolution/videoRatio/videoDurationSec
ตัวอย่างการตอบกลับ:
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"priceSnapshotId": "snap_9f3c1a2b",
"taskId": "task_5e8a1c33",
"credit": 0.0342,
"model": "glm-5.2",
"modelType": "text",
"inputTokens": 1280,
"outputTokens": 642,
"totalTokens": 1922,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": null,
"videoRatio": null,
"videoDurationSec": null,
"orderCreatedAt": "2026-07-18T14:23:11",
"creditDetails": [
{
"credit": 0.0342,
"deductionSource": "balance",
"packageName": ""
}
]
},
{
"priceSnapshotId": "snap_a12f77c0",
"taskId": "task_c71e44a2",
"credit": 1.8000,
"model": "seedance-2.0",
"modelType": "video",
"inputTokens": null,
"outputTokens": null,
"totalTokens": null,
"cacheReadTokens": null,
"cacheWriteTokens": null,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": "1080p",
"videoRatio": "16:9",
"videoDurationSec": 8,
"orderCreatedAt": "2026-07-17T22:41:09",
"creditDetails": [
{
"credit": 1.5000,
"deductionSource": "Monthly Package",
"packageName": "基础月度套餐"
},
{
"credit": 0.3000,
"deductionSource": "Resource Package",
"packageName": "byteplus视频资源包"
}
]
}
],
"total": 128,
"current": 1,
"size": 20,
"pages": 7
}
}List Billing TransactionsGEThttps://api.basicrouter.ai/api/v1/billing/transactions
รายการแบบแบ่งหน้าของธุรกรรมการเติมเงินที่ชำระแล้ว (status=2) ของผู้ใช้ปัจจุบัน เรียงตาม created_at จากมากไปน้อย
| พารามิเตอร์ | ประเภท | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|---|
page | Integer | ไม่ | 1 | หมายเลขหน้า |
size | Integer | ไม่ | 20 | ขนาดหน้า |
startTime | String | ไม่ | — | เวลาเริ่มต้น yyyy-MM-dd HH:mm:ss รวม |
endTime | String | ไม่ | — | เวลาสิ้นสุด yyyy-MM-dd HH:mm:ss รวม |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/billing/transactions?page=1&size=20&startTime=2026-07-01%2000:00:00&endTime=2026-07-31%2023:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"ตัวห่อหุ้มการตอบกลับ:
{
"code": 0,
"message": "success",
"data": { ... }
}| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
records | TransactionVO[] | ธุรกรรมหน้าปัจจุบัน |
total | Long | จำนวนรวม |
current | Long | หน้าปัจจุบัน |
size | Long | ขนาดหน้า |
pages | Long | หน้าทั้งหมด |
ฟิลด์ของ TransactionVO:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
orderNo | String | หมายเลขคำสั่งซื้อ |
thirdPartyOrderNo | String | หมายเลขคำสั่งซื้อบุคคลที่สาม |
amount | BigDecimal | จำนวนเงินคำสั่งซื้อ |
actualAmount | BigDecimal | จำนวนเงินที่ชำระจริง |
discount | BigDecimal | จำนวนเงินส่วนลด |
paymentMethod | String | วิธีชำระเงิน (wechat / alipay / ustd / stripe / wallyt เป็นต้น) |
ฟิลด์ของ TransactionVO:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
serviceFeeAmount | BigDecimal | จำนวนเงินค่าธรรมเนียมบริการ |
paymentChannel | String | แพลตฟอร์มการชำระเงิน |
source | String | แหล่งที่มาของคำสั่งซื้อ (recharge / package_purchase เป็นต้น) |
packageName | String | ชื่อแพ็กเกจ (ตั้งค่าเมื่อซื้อแพ็กเกจ; การเติมเงินทั่วไปเป็น null) |
createdAt | LocalDateTime | เวลาที่สร้าง |
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"orderNo": "R20260718abc123",
"thirdPartyOrderNo": "wx_pay_xxx",
"amount": 50.00,
"actualAmount": 48.50,
"discount": 1.50,
"paymentMethod": "wechat",
"serviceFeeAmount": 0.00,
"paymentChannel": "wechat",
"source": "recharge",
"packageName": null,
"createdAt": "2026-07-18T14:23:11"
}
],
"total": 28,
"current": 1,
"size": 20,
"pages": 2
}
}