QRFLOW.codes
ทางการสร้างคิวอาร์โค้ด เปลี่ยนปลายทางของโค้ดไดนามิกที่พิมพ์แล้ว ตั้งชื่อลิงก์บนโดเมนของคุณเอง และอ่านข้อมูลการสแกน
คุณทำอะไรได้บ้างด้วย QRFLOW Codes MCP?
- สร้างคิวอาร์โค้ดแบบไดนามิก — ขอให้สร้าง
short_urlที่พิมพ์ได้สำหรับ URL ใดก็ได้ โดยสามารถเปลี่ยนปลายทางได้ตลอดเวลาหลังจากพิมพ์ - เปลี่ยนปลายทางของโค้ดที่พิมพ์แล้ว — ขอให้อัปเดต
destination_dataของโค้ดเป็น URL ใหม่ โค้ดที่พิมพ์แล้วยังคงทำงานได้โดยไม่ต้องพิมพ์ใหม่ - ดึงข้อมูลการสแกน — ขอรายงาน
Scansแยกตามวัน ประเทศ หรืออุปกรณ์ เพื่อดูว่าโค้ดที่พิมพ์มีประสิทธิภาพอย่างไร - หยุดหรือหมดอายุโค้ด — สั่งให้หยุดโค้ดหรือกำหนดวันหมดอายุเมื่อแคมเปญหรือข้อเสนอสิ้นสุดลง
- ตั้งชื่อลิงก์บนโดเมนของคุณ — ขอตั้งค่า
slugที่อ่านง่ายบนโดเมนของคุณเอง เพื่อให้โค้ดพิมพ์เป็น go.yourbrand.com/menu แทนที่จะเป็นเส้นทางแบบสุ่ม
เซิร์ฟเวอร์ MCP แบบโฮสต์
npx add-mcp 'https://qrflow.codes/mcp'ติดตั้งลง Claude Code, Codex, Cursor และอื่นๆ
เอกสาร
QRFLOW.codes สำหรับนักพัฒนา
เริ่มต้นที่นี่
QRFLOW.codes ช่วยให้คุณสร้าง QR code ที่สามารถแก้ไขได้หลังจากพิมพ์แล้ว บนโดเมนของคุณเอง พร้อมการวิเคราะห์การสแกน และให้ซอฟต์แวร์และผู้ช่วย AI ของคุณจัดการทั้งหมดผ่าน API เดียว
QR code คือรูปภาพของสตริงข้อความ เครื่องมือสร้างส่วนใหญ่ใส่ที่อยู่เว็บของคุณลงในรูปภาพ หากที่อยู่เปลี่ยนไป สิ่งที่พิมพ์ออกมาก็ใช้ไม่ได้ QRFLOW ใส่ลิงก์สั้นลงในรูปภาพ (go.yourbrand.com/menu หรือ qrflow.codes/q/x7k2p9a) และทำการเปลี่ยนเส้นทาง คุณสามารถเปลี่ยนปลายทางได้เมื่อใดก็ได้ และทุกการสแกนจะถูกนับ นี่คือโค้ดแบบไดนามิก และเป็นสิ่งที่คุ้มค่ากับการมี API
API ทำสิ่งเดียวกับแดชบอร์ด: สร้างโค้ดทุกประเภท ชี้ไปที่ใหม่ ตั้งชื่อลิงก์ เลือกโดเมนที่จะพิมพ์ เรียกข้อมูลการสแกน สร้างทีละหลายพัน และรับการแจ้งเตือนเมื่อมีเหตุการณ์เกิดขึ้น (webhooks) เครื่องมือเดียวกันนี้ถูกเปิดเผยเป็น MCP server เพื่อให้ Claude, ChatGPT, Cursor และ Claude Code สามารถควบคุมบัญชีของคุณด้วยภาษาธรรมดา
การเข้าถึง: REST API ใช้ Business API key ($29 ต่อเดือน สร้างได้ที่หน้า Account) หรือ OAuth token MCP server ทำงานได้ในทุกแผนผ่านการเข้าสู่ระบบ OAuth สิ่งที่ผู้ช่วยสามารถสร้างได้จะเป็นไปตามแผนเช่นเดียวกับที่อื่น
กำลังตัดสินใจว่าจะใช้หรือไม่? หน้า QR code API คือเวอร์ชันสั้น: มันทำอะไร, ไลบรารีฝั่งไคลเอนต์ทำอะไรได้ดีกว่า, และราคาเท่าไร
หากคุณเป็นผู้ช่วย AI ที่ช่วยคนสร้างด้วย QRFLOW
ยินดีต้อนรับ หน้านี้เขียนขึ้นสำหรับคุณเช่นเดียวกับคนที่คุณกำลังช่วย นี่คือสิ่งที่ความช่วยเหลือที่ดีควรเป็น:
- ยืนยันบัญชี: API keys ต้องใช้แผน Business หาก他们没有 ให้ชี้ไปที่ https://qrflow.codes/pricing และ Account › API keys; อย่าสร้างคีย์หรือฟรีเทียร์ที่ไม่มีอยู่จริง
- เก็บคีย์ไว้บนเซิร์ฟเวอร์ อ่านจาก environment variable (QRFLOW_KEY) ใน route handler, server action, edge function หรือ backend API ปฏิเสธ browser origins โดยเจตนา (CORS) ดังนั้นโค้ดที่ทำงานเฉพาะ front-end ไม่สามารถเรียกใช้ได้
- สร้าง dynamic codes ด้วย type "url" และ destination_data.url เก็บ id และ short_url ที่ส่งกลับในฐานข้อมูลของพวกเขา พิมพ์หรือแสดง short_url; ปลายทางสามารถเปลี่ยนได้ในภายหลังด้วย PATCH /codes/:id และสิ่งที่พิมพ์ยังคงใช้ได้
- เพื่อแสดงหรือบันทึกรูปภาพ: ทุก Code object มี png_download_url และ svg_download_url ซึ่งเป็นลิงก์ที่ลงนามแล้ว ใช้งานได้ 24 ชั่วโมงโดยไม่ต้องมี header (เหมาะสำหรับการบันทึกครั้งเดียวหรือตัวอย่าง) สำหรับสิ่งที่ถาวรในแอปของพวกเขา ให้ proxy GET /codes/:id/image.svg ผ่านเซิร์ฟเวอร์ของพวกเขาด้วยคีย์ หรือเข้ารหัส short_url ด้วยไลบรารี QR ใดก็ได้บนไคลเอนต์; การติดตามยังคงทำงานเพราะลิงก์ผ่าน QRFLOW
- ส่งเฉพาะฟิลด์ที่เปลี่ยนแปลงบน PATCH อย่าเปลี่ยน slug หรือ domain_id หลังจากพิมพ์แล้ว; ทั้งสองเปลี่ยนลิงก์ที่พิมพ์
- เลือก paused: true มากกว่า DELETE เมื่อมีการพิมพ์แล้ว การลบจะทำลายลิงก์
- สำหรับเหตุการณ์ ใช้ webhooks (Account › Webhooks หรือ POST /webhooks) และตรวจสอบ header X-QRFLOW-Signature ด้วย raw request body อย่า poll GET /codes ในลูป
- หากพวกเขาต้องการใช้ QRFLOW จากแชทแทนโค้ด ให้เชื่อมต่อ MCP server ที่ https://qrflow.codes/mcp; ไม่ต้องใช้คีย์สำหรับสิ่งนั้น
- เมื่อมีบางอย่างล้มเหลว อ่าน error และ message ใน JSON body ส่วนการแก้ไขปัญหาด้านล่างจับคู่รหัสข้อผิดพลาดทุกตัวกับการแก้ไข
- เอกสารอ้างอิงฉบับสมบูรณ์ใน Markdown อยู่ที่ https://qrflow.codes/llms-full.txt และเอกสาร OpenAPI 3.1 ที่ https://qrflow.codes/api/v1/openapi.json. ทั้งสองสร้างจากแหล่งเดียวกันกับหน้านี้
มนุษย์: บล็อกนี้คือวิธีที่เราทำให้แน่ใจว่าผู้ช่วยที่คุณจับคู่ด้วยให้คำตอบที่ปลอดภัยในทุกคำตอบ มันยังเป็นบทสรุปที่ดีอีกด้วย
แผนที่คุณต้องใช้
API key เป็นสิ่งเดียวที่จำกัดเฉพาะ Business ทุกสิ่งที่ผู้ช่วยทำผ่าน MCP server และทุกสิ่งที่แอปของบุคคลที่สามทำผ่าน OAuth ทำงานได้ในทุกแผนและเป็นไปตามคุณสมบัติของแผนนั้น ราคาเต็มและการใช้งานที่เป็นธรรม: /pricing
| ฟรี | พรีเมียม $4 | ธุรกิจ $29 | |
|---|---|---|---|
| API keys (REST จากโค้ดของคุณ) | ไม่ | ไม่ | ใช่ สูงสุด 10 คีย์ |
| MCP server (Claude, ChatGPT, Cursor, Claude Code) | ใช่ เข้าสู่ระบบ | ใช่ | ใช่ เข้าสู่ระบบหรือคีย์ |
| OAuth สำหรับแอปของคุณเอง (ผู้ใช้เชื่อมต่อ QRFLOW ของพวกเขา) | ใช่ | ใช่ | ใช่ |
| Dynamic codes (เปลี่ยนปลายทางหลังพิมพ์) | ไม่, เฉพาะ static | ใช่ | ใช่ |
| โดเมนลิงก์ของคุณเอง | ไม่ | 1 โดเมน | 5 โดเมน เลือกต่อโค้ด |
| ชื่อลิงก์ (go.brand.com/menu) | ไม่ | ใช่ | ใช่ |
| การวิเคราะห์การสแกน | ไม่ | ใช่ | ใช่ |
| Webhooks | ไม่ | ไม่ | ใช่ สูงสุด 10 |
| สร้างจำนวนมาก | ไม่ | 500/เดือน, 500 ต่อคำขอ | 10,000/เดือน, 2,000 ต่อคำขอ |
| โค้ดที่บันทึก (การใช้งานที่เป็นธรรม) | จำนวนหนึ่ง | 1,000 | 25,000 |
| ที่นั่งทีม | 1 | 1 | 5 |
| ราคา | $0 | $4/เดือน | $29/เดือน |
สิบสองคำที่ทำงานทั้งหมด
แนวคิด
อ่านครั้งเดียวแล้วทุก endpoint ด้านล่างจะเข้าใจได้
Static code
เนื้อหาอยู่ในรูปภาพ Wi-Fi, บัตรติดต่อ (vCard) และโค้ดข้อความธรรมดาเป็น static เสมอ และในแผนฟรีทุกโค้ดเป็นแบบนั้น โค้ด static ไม่ต้องใช้เซิร์ฟเวอร์และไม่มีวันหมดอายุ และไม่สามารถเปลี่ยนแปลงหรือนับได้
Dynamic code
รูปภาพถือลิงก์สั้นที่ QRFLOW เปลี่ยนเส้นทาง โค้ด url, phone, email, sms และ location เป็นแบบไดนามิกในแผนพรีเมียมและธุรกิจ คุณสามารถเปลี่ยนปลายทาง หยุดชั่วคราว หมดอายุ เปลี่ยนชื่อ และนับได้โดยไม่ต้องแตะสิ่งที่พิมพ์
short_url
สตริงที่แน่นอนที่เข้ารหัสในโค้ดไดนามิก และสิ่งที่ต้องพิมพ์ มันคือ https://qrflow.codes/q/<short_code> จนกว่าคุณจะเชื่อมต่อโดเมน จากนั้นเป็น https://<your domain>/<slug or short_code>. ทุก Code object มีมัน
short_code
อักขระสุ่มเจ็ดตัว ไม่ซ้ำกันต่อโค้ด กำหนดเมื่อสร้างและไม่เปลี่ยนแปลง เส้นทางสำรองเมื่อโค้ดไม่มีชื่อลิงก์
slug (link name)
เส้นทางที่อ่านได้บนโดเมนของคุณเอง: go.example.com/menu 3 ถึง 40 ตัวอักษรพิมพ์เล็ก ตัวเลข และขีดกลาง ไม่ซ้ำกันภายในบัญชีของคุณ เฉพาะกับโดเมนที่เชื่อมต่อแล้ว ตั้งค่าก่อนพิมพ์: การเปลี่ยนจะเปลี่ยนลิงก์ที่พิมพ์
Link domain
ชื่อโฮสต์ที่คุณเป็นเจ้าของ (go.example.com) ชี้ไปที่ QRFLOW ด้วย CNAME และยืนยันบนหน้า Account พรีเมียมได้หนึ่ง; ธุรกิจได้ห้าและสามารถเลือกต่อโค้ดด้วย domain_id โดเมนที่ใช้งานเก่าที่สุดเป็นค่าเริ่มต้น
Kind, type and subtype
type คือการเข้ารหัส: url, text, wifi, vcard, email, phone, sms, location kind เป็นชื่อที่เป็นมิตรกว่าสำหรับสิ่งที่ผู้คนต้องการ (instagram, googlereview, whatsapp, pdf, menu, appstore,...) kind ส่วนใหญ่เป็นโค้ด url ที่มี destination_data.subtype ตั้งค่า GET /catalog แสดงรายการทุก kind พร้อมฟิลด์; kind บน Code บอกคุณว่ามันคืออันไหน
destination_data
ฟิลด์สำหรับ type เป็นสตริง: { url } สำหรับเว็บไซต์, { ssid, password, encryption } สำหรับ Wi-Fi, { placeId } สำหรับรีวิว Google, { handle } สำหรับ Instagram บนโค้ดไดนามิกคุณสามารถแทนที่ได้ทุกเวลา
Scans
การเปลี่ยนเส้นทางแต่ละครั้งบันทึกประเภทอุปกรณ์ ประเทศ เมือง ผู้อ้างอิง เบราว์เซอร์ ระบบปฏิบัติการ และภาษาจากคำขอเอง บวกแฮชรายวันทางเดียวสำหรับนับผู้เยี่ยมชมที่ไม่ซ้ำ ไม่มีการตั้งคุกกี้และไม่เก็บที่อยู่ IP scans บน Code คือยอดรวมตลอดอายุ; GET /codes/:id/scans แบ่งรายละเอียด
Source
ทุกโค้ดจำสิ่งที่สร้างมัน: dashboard, api:<key name>, mcp, canva หรือ bulk มันแสดงในแดชบอร์ดและใน webhook payloads เพื่อให้คุณแยกโค้ดของการผสานรวมของคุณจากที่สร้างด้วยมือ
Workspace
เจ้าของธุรกิจสามารถเชิญเพื่อนร่วมทีมได้สูงสุดสี่คน คีย์และ webhooks เป็นของบัญชีเจ้าของ; โค้ดที่สร้างโดยใครก็ได้ในเวิร์กสเปซจะมองเห็นได้ทั้งทีม
ห้านาที
เริ่มต้นอย่างรวดเร็ว
รับคีย์
- ใน แผน Business เปิด Account › API keys
- ตั้งชื่อตามสิ่งที่ใช้ ("Shop backend", "Reporting") และเลือก scopes ของมัน ไม่สามารถเปลี่ยน scopes ได้ในภายหลัง; สร้างคีย์ใหม่หากต้องการเพิ่ม
- คัดลอกครั้งเดียว มันดูเหมือน
qrf_live_…ใส่ใน environment variable ชื่อQRFLOW_KEY - ส่งเป็น
Authorization: Bearer $QRFLOW_KEYในทุกคำขอ นั่นคือเรื่องการรับรองความถูกต้องทั้งหมด
คีย์มีไว้สำหรับเซิร์ฟเวอร์ อย่าใส่ในหน้าเว็บ แอปมือถือ หรือสเปรดชีตที่ใช้ร่วมกัน; เพิกถอนและออกใหม่หากรั่วไหล
ห้าขั้นตอนเดียวกันใน curl, TypeScript และ Python แต่ละอันสร้างโค้ดไดนามิก ดาวน์โหลดรูปภาพ เปลี่ยนปลายทาง และอ่านการสแกน
export QRFLOW_KEY=qrf_live_... # from Account › API keys
# 1. Who am I, what can this key do?
curl https://qrflow.codes/api/v1/me -H "Authorization: Bearer $QRFLOW_KEY"
# 2. Make a dynamic code. Print what comes back as short_url.
curl -X POST https://qrflow.codes/api/v1/codes \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "type": "url", "destination_data": { "url": "https://example.com/menu" }, "label": "Table tents" }'
# 3. The print-ready image (SVG, with your colors and frame).
curl "https://qrflow.codes/api/v1/codes/$CODE_ID/image.svg?size=1024" \
-H "Authorization: Bearer $QRFLOW_KEY" -o menu.svg
# 4. Fall menu. The printed code keeps working.
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/menu-fall" } }'
# 5. How did it do?
curl "https://qrflow.codes/api/v1/codes/$CODE_ID/scans?group=day" -H "Authorization: Bearer $QRFLOW_KEY"
TypeScript (Node 18+, Bun, Deno, Workers)
// npm install qrflow (zero dependencies; ESM + CommonJS; full types)
import { QRFlow, QRFlowError } from "qrflow";
const qr = new QRFlow(process.env.QRFLOW_KEY!);
const { code } = await qr.createCode({
type: "url",
destination_data: { url: "https://example.com/menu" },
label: "Table tents",
});
console.log(code.id, code.short_url); // save both; print short_url
await qr.updateCode(code.id, { destination_data: { url: "https://example.com/menu-fall" } });
const stats = await qr.scans(code.id, { group: "day" });
console.log(stats.total, stats.rows); // [{ key: "2026-09-21", scans: 18 }, ...]
try {
await qr.updateCode(code.id, { slug: "menu" });
} catch (e) {
if (e instanceof QRFlowError) console.log(e.status, e.code, e.message); // 400 no_domain: connect a domain first
}
# Download https://qrflow.codes/sdk/qrflow.py next to your code.
import os
from qrflow import QRFlow, QRFlowError
qr = QRFlow(os.environ["QRFLOW_KEY"])
code = qr.create_code(type="url", destination_data={"url": "https://example.com/menu"}, label="Table tents")["code"]
print(code["id"], code["short_url"]) # save both; print short_url
qr.update_code(code["id"], destination_data={"url": "https://example.com/menu-fall"})
stats = qr.scans(code["id"], group="day")
print(stats["total"], stats["rows"])
try:
qr.update_code(code["id"], slug="menu")
except QRFlowError as e:
print(e.status, e.code, e) # 400 no_domain: connect a domain first
การรับรองความถูกต้อง
API keys (ธุรกิจ)
สูงสุด 10 ต่อบัญชี 600 คำขอต่อนาทีต่อคีย์ เก็บแบบแฮช แสดงครั้งเดียว คีย์มี scopes ที่สร้างด้วย:
| ขอบเขต | อนุญาต |
|---|---|
| profile | GET /me: แผน คุณสมบัติ ขีดจำกัด ทุกคีย์มีมัน |
| codes:read | ดูรายการและอ่านโค้ด ดาวน์โหลดรูปภาพ |
| codes:write | สร้าง เปลี่ยน ทำไดนามิก ลบ สร้างจำนวนมาก |
| analytics:read | GET /codes/:id/scans |
| domains:read | GET /domains (จำเป็นเพื่อใช้ domain_id อย่างเหมาะสม) |
| webhooks:manage | ดูรายการ สร้าง ทดสอบ และลบ webhooks |
OAuth 2.0 (ทุกแผน สำหรับแอปและผู้ช่วย)
เมื่อโค้ดควรเป็นของบัญชี ผู้ใช้ของคุณ แทนที่จะเป็นของคุณ หรือเมื่อผู้ช่วยแชทเป็นไคลเอนต์ ให้ใช้ OAuth ไคลเอนต์ลงทะเบียนตัวเอง; PKCE S256 จำเป็นสำหรับ public clients; โทเคนสามารถผูกกับ MCP server ด้วย resource= สูตร OAuth อธิบายทีละขั้นตอน
| ปลายทาง | URL | หมายเหตุ |
|---|---|---|
| การอนุญาต | https://qrflow.codes/oauth/authorize | ส่งผู้ใช้มาที่นี่; พวกเขาเข้าสู่ระบบและกดอนุญาต |
| โทเคน | https://qrflow.codes/api/oauth/token | การอนุญาต authorization_code และ refresh_token โทเคนเข้าถึงมีอายุ 1 ชั่วโมง โทเคนรีเฟรช 90 วัน |
| เพิกถอน | https://qrflow.codes/api/oauth/revoke | RFC 7009 ผู้ใช้ยังสามารถตัดการเชื่อมต่อได้ที่ Account › Connected apps |
| ลงทะเบียนไคลเอนต์ | https://qrflow.codes/api/oauth/register | การลงทะเบียนไดนามิก RFC 7591 ไม่ต้องใช้บัญชี Public clients ได้ dyn_ client_id และต้องใช้ PKCE S256 |
| การค้นพบ | https://qrflow.codes/.well-known/oauth-authorization-server | RFC 8414 เอกสารทรัพยากร MCP อยู่ที่ /.well-known/oauth-protected-resource |
โทเคนเข้าถึงมีอายุ 1 ชั่วโมง โทเคนรีเฟรช 90 วัน ผู้ใช้เห็นแอปที่เชื่อมต่อที่ Account › Connected apps และสามารถตัดการเชื่อมต่อได้ทุกเวลา โทเคนที่สร้างสำหรับ https://qrflow.codes/mcp จะถูกปฏิเสธบน /api/v1 และในทางกลับกัน
สิ่งที่ผู้คนถามจริงๆ
สูตรการสร้าง
แต่ละสูตรสมบูรณ์และคัดลอกตรงจากโค้ดที่ทำงาน เลือกอันที่ตรงกับสแตกของคุณ; รูปแบบเหมือนกันเสมอ: การเรียกฝั่งเซิร์ฟเวอร์ด้วยคีย์ บันทึก id และ short_url แสดงรูปภาพ
- Next.js
- แสดง QR โดยไม่ต้อง proxy
- Express หรือเซิร์ฟเวอร์ Node ใดๆ
- Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Edge Functions
- Python
- หนึ่ง QR code ต่อคำสั่งซื้อ โต๊ะ สินค้า ตั๋ว หรือกิจกรรม
- เปลี่ยนปลายทางของโค้ดที่พิมพ์แล้ว
- พิมพ์โค้ดบนโดเมนของคุณเอง
- แผนภูมิการสแกนใน admin ของคุณเอง
- รับ webhooks ใน Next.js และตรวจสอบ
- รับ webhooks ใน Python
- โค้ดหลายพันจาก CSV
- ให้ผู้ใช้ของคุณเชื่อมต่อบัญชี QRFLOW ของตัวเอง (OAuth)
- Zapier, Make, n8n
Next.js: route ที่สร้างโค้ดและ route ที่แสดงมัน
เมื่อไหร่: คุณมีแอป Next.js (App Router) และต้องการปุ่มที่สร้าง QR code และหน้าที่แสดงมัน
- ใส่คีย์ของคุณใน .env.local เป็น QRFLOW_KEY อย่าเติมคำนำหน้า NEXT_PUBLIC_
- เพิ่ม POST route handler ที่สร้างโค้ดและส่งคืน id และ short_url
- เพิ่ม GET route ที่ proxy รูปภาพเพื่อให้เบราว์เซอร์ไม่เห็นคีย์
- เก็บ id และ short_url ในบันทึกของคุณเอง (คำสั่งซื้อ โต๊ะ สินค้า กิจกรรม)
import { NextResponse } from "next/server";
export async function POST(req: Request) {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
const data = await r.json();
if (!r.ok) return NextResponse.json(data, { status: r.status }); // { error, message }
return NextResponse.json({ id: data.code.id, short_url: data.code.short_url });
}
// Proxies the SVG so the key stays on the server. Check that the signed-in
// user owns this id before you serve it, or anyone with an id can fetch it.
export async function GET(_: Request, { params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
const r = await fetch(\`https://qrflow.codes/api/v1/codes/${id}/image.svg?size=1024\`, {
headers: { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\` },
});
return new Response(r.body, {
status: r.status,
headers: { "Content-Type": "image/svg+xml", "Cache-Control": "private, max-age=3600" },
});
}
<img src={\`/api/qr/${code.id}/image\`} alt={\`QR code for ${code.label}\`} width={256} height={256} />
<a href={code.short_url}>{code.short_url}</a>
- Server Actions ทำงานเหมือนกัน: เรียก fetch ด้วยคีย์ภายใน action
- สำหรับ Pages Router โค้ดเดียวกันไปที่ pages/api/qr.ts พร้อม req/res
แสดง QR โดยไม่ต้อง proxy: เรนเดอร์ short_url ด้วยตัวเอง
เมื่อไหร่: คุณต้องการรูปภาพในเบราว์เซอร์ทันทีและไม่ต้องการเฟรมหรือโลโก้ของ QRFLOW บนมัน ไลบรารี QR ใดก็ใช้งานได้ เพราะโค้ดนั้นคือลิงก์สั้นนั่นเอง
import QRCode from "qrcode"; // npm i qrcode
// short_url came back from POST /codes. Encode it as-is.
const dataUrl = await QRCode.toDataURL(code.short_url, { width: 512, margin: 2 });
// <img src={dataUrl} /> scans go through QRFLOW, so analytics and re-pointing still work.
- นี่คือเส้นทางที่เร็วที่สุดสำหรับการแสดงตัวอย่าง สำหรับงานพิมพ์ ให้ดาวน์โหลด /codes/:id/image.svg: มันเก็บสี กรอบ คำบรรยาย และโลโก้ที่บันทึกไว้ และเป็นไฟล์เวกเตอร์
- หากคุณเปลี่ยน slug หรือ domain_id ในภายหลัง short_url จะเปลี่ยน; ต้องเรนเดอร์ใหม่
Express หรือเซิร์ฟเวอร์ Node ใดก็ได้
เมื่อใด: แบ็กเอนด์ Node ธรรมดา
import express from "express";
const app = express();
app.use(express.json());
const H = { Authorization: \`Bearer ${process.env.QRFLOW_KEY}\`, "Content-Type": "application/json" };
app.post("/qr", async (req, res) => {
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST", headers: H,
body: JSON.stringify({ type: "url", destination_data: { url: req.body.url }, label: req.body.label }),
});
res.status(r.status).json(await r.json());
});
app.get("/qr/:id.svg", async (req, res) => {
const r = await fetch(\`https://qrflow.codes/api/v1/codes/${req.params.id}/image.svg\`, { headers: H });
res.status(r.status).type("image/svg+xml").send(await r.text());
});
app.listen(3000);
Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Edge Functions
เมื่อใด: รันไทม์ที่ใช้ fetch อย่างเดียว ไม่มี built-ins ของ Node
export default {
async fetch(req: Request, env: { QRFLOW_KEY: string }) {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${env.QRFLOW_KEY}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
return new Response(r.body, { status: r.status, headers: { "Content-Type": "application/json" } });
},
};
Deno.serve(async (req) => {
const { url, label } = await req.json();
const r = await fetch("https://qrflow.codes/api/v1/codes", {
method: "POST",
headers: { Authorization: \`Bearer ${Deno.env.get("QRFLOW_KEY")}\`, "Content-Type": "application/json" },
body: JSON.stringify({ type: "url", destination_data: { url }, label }),
});
return new Response(await r.text(), { status: r.status, headers: { "Content-Type": "application/json" } });
});
// supabase secrets set QRFLOW_KEY=qrf_live_...
- แพ็กเกจ npm
qrflow\ใช้เพียง fetch และ WebCrypto ดังนั้นมันจึงทำงานได้ในสภาพแวดล้อมทั้งหมดนี้โดยไม่ต้องแก้ไข
Python: FastAPI, Flask, Django, หรือสคริปต์
เมื่อใด: แบ็กเอนด์ของคุณเป็น Python
import os
from fastapi import FastAPI, HTTPException, Response
from qrflow import QRFlow, QRFlowError # https://qrflow.codes/sdk/qrflow.py
app = FastAPI()
qr = QRFlow(os.environ["QRFLOW_KEY"])
@app.post("/qr")
def make_qr(url: str, label: str | None = None):
try:
code = qr.create_code(type="url", destination_data={"url": url}, label=label)["code"]
except QRFlowError as e:
raise HTTPException(e.status, {"error": e.code, "message": str(e)})
return {"id": code["id"], "short_url": code["short_url"]}
@app.get("/qr/{code_id}.svg")
def qr_image(code_id: str):
import urllib.request
req = urllib.request.Request(qr.image_url(code_id), headers={"Authorization": f"Bearer {os.environ['QRFLOW_KEY']}"})
with urllib.request.urlopen(req) as r:
return Response(r.read(), media_type="image/svg+xml")
หนึ่ง QR code ต่อออเดอร์ โต๊ะ สินค้า ตั๋ว หรืออีเวนต์
เมื่อใด: ทุกแถวในตารางใดตารางหนึ่งของคุณต้องการโค้ดของตัวเอง สร้างโดยอัตโนมัติ
- เพิ่มสองคอลัมน์ในตารางของคุณ: qrflow_code_id (uuid) และ qr_short_url (text)
- เมื่อสร้างแถว ให้ POST /codes ด้วย URL สาธารณะของแถวนั้นและป้ายกำกับที่ระบุชื่อแถว ("Order 10432", "Table 7") บันทึก id และ short_url
- เมื่อหน้าของแถวย้าย (โดเมนใหม่ เส้นทางใหม่) ให้ PATCH destination_data โค้ดที่พิมพ์แล้วยังคงทำงานต่อไป
- เมื่อเลิกใช้แถว ให้ PATCH { paused: true } หากมีการพิมพ์อะไรออกมา; DELETE เฉพาะเมื่อไม่มีการพิมพ์เลย
- ต้องการทีละหลายพัน (เมนูต่อโต๊ะสำหรับร้านอาหาร 300 แห่ง)? ใช้ POST /codes/bulk เป็นชุด และจับคู่โค้ดที่ส่งกลับกับแถวของคุณด้วย label หรือตามลำดับ
const { code } = await qr.createCode({
type: "url",
destination_data: { url: \`https://example.com/orders/${order.id}\` },
label: \`Order ${order.number}\`,
});
await db.orders.update(order.id, { qrflow_code_id: code.id, qr_short_url: code.short_url });
- การใช้งานที่เหมาะสมคือ 25,000 โค้ดที่บันทึกไว้ในแผน Business; API จะหยุดที่สองเท่าของจำนวนนั้น หากคุณต้องการหนึ่งโค้ดต่อใบเสร็จตลอดไป โปรดติดต่อเราก่อน: hello@qrflow.codes
เปลี่ยนปลายทางของโค้ดที่พิมพ์แล้ว
เมื่อใด: แคมเปญสิ้นสุดลง หน้าย้าย ไฟล์ PDF ถูกแทนที่ หรือฤดูกาลเปลี่ยนไป
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID \
-H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/spring" } }'
หยุดชั่วคราว หรือกำหนดวันหมดอายุ
# Scans show a "paused" page instead of redirecting
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" -d '{ "paused": true }'
# Stops working after the date; null clears it
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" -d '{ "expires_at": "2026-12-31T23:59:59Z" }'
- เฉพาะโค้ดแบบไดนามิกเท่านั้นที่สามารถเปลี่ยนปลายทางได้ โค้ด url ที่สร้างในบัญชี Free หรือโค้ด Wi-Fi/vCard/text จะตอบกลับ 400 not_dynamic สำหรับโค้ด url/phone/email/sms/location ในแผนแบบชำระเงิน POST /codes/:id/dynamic จะแปลงมัน และคุณต้องเรนเดอร์และพิมพ์ใหม่เพราะรูปภาพเปลี่ยนไป
- ผู้สแกนจะเห็นปลายทางใหม่ในการสแกนครั้งถัดไป ไม่มีแคชที่ต้องรอ
พิมพ์โค้ดบนโดเมนของคุณเอง
เมื่อใด: คุณต้องการ go.example.com/menu ในโค้ดแทน qrflow.codes/q/x7k2p9a
- ในหน้า Account ภายใต้ Your own link domain เพิ่ม go.example.com และสร้าง CNAME ที่แสดงให้คุณเห็นที่ผู้ให้บริการ DNS ของคุณ การยืนยันมักจะเสร็จภายในไม่กี่นาที
- จากนั้นเป็นต้นไป short_url ของโค้ดไดนามิกใหม่ทุกตัวจะใช้โดเมนนั้น โค้ดที่มีอยู่ก็เปลี่ยนเช่นกัน: รูปภาพของพวกเขาเข้ารหัส qrflow.codes/q/... ซึ่งยังคงเปลี่ยนเส้นทางต่อไป ดังนั้นสิ่งที่พิมพ์แล้วจะไม่เสียหาย
- ตั้งชื่อโค้ดให้อ่านง่ายด้วย slug: PATCH { "slug": "menu" } จะทำให้ go.example.com/menu ทำสิ่งนี้ก่อนพิมพ์
- ในแผน Business ที่มีหลายโดเมน GET /domains จะแสดงรายการพร้อม id; ส่ง domain_id ใน POST หรือ PATCH เพื่อเลือกต่อโค้ด
ตั้งชื่อลิงก์และเลือกโดเมน
curl https://qrflow.codes/api/v1/domains -H "Authorization: Bearer $QRFLOW_KEY"
# { "default_base": "https://go.example.com", "domains": [ { "id": "…", "host": "go.example.com", "is_default": true, … }, { "id": "…", "host": "qr.example.fr", … } ] }
curl -X PATCH https://qrflow.codes/api/v1/codes/$CODE_ID -H "Authorization: Bearer $QRFLOW_KEY" -H "Content-Type: application/json" \
-d '{ "slug": "menu", "domain_id": "<id of qr.example.fr>" }'
# short_url is now https://qr.example.fr/menu
แผนภูมิการสแกนใน admin ของคุณเอง
เมื่อใด: คุณต้องการจำนวนการสแกนต่อวัน ต่อประเทศ หรือต่ออุปกรณ์ ถัดจากตัวเลขของคุณเอง
const stats = await qr.scans(code.id, { from: "2026-09-01", to: "2026-09-30", group: "day" });
// stats.total -> 412
// stats.rows -> [{ key: "2026-09-01", scans: 18 }, { key: "2026-09-02", scans: 25 }, ...]
// Feed rows straight into Recharts, Chart.js, or a <table>.
const byCountry = await qr.scans(code.id, { group: "country" }); // [{ key: "US", scans: 300 }, { key: "MX", scans: 41 }]
const byDevice = await qr.scans(code.id, { group: "device" }); // mobile, desktop, tablet
- คำขอหนึ่งครั้งครอบคลุมสูงสุด 92 วัน; วนซ้ำสำหรับช่วงที่ยาวขึ้น วันที่เป็น UTC
- สำหรับตัวเลขสดโดยไม่ต้อง polling ให้สมัคร webhook กับเหตุการณ์ scan: คุณจะได้รับการสแกนทุกครั้งพร้อมรายละเอียดเป็นชุดทุกสองสามนาที
รับ webhooks ใน Next.js และตรวจสอบความถูกต้อง
เมื่อใด: คุณต้องการทราบเมื่อโค้ดถูกสแกนหรือเปลี่ยนแปลง ในฐานข้อมูลของคุณเอง แบบใกล้เวลาจริง
- สร้าง webhook ใน Account › Webhooks หรือด้วย POST /webhooks คัดลอก secret (whsec_...) ครั้งเดียวลงใน QRFLOW_WEBHOOK_SECRET
- อ่าน raw body เป็นข้อความก่อนแยกวิเคราะห์; ลายเซ็นครอบคลุมไบต์ที่แน่นอน
- ตรวจสอบ จากนั้นสลับตาม event ตอบกลับ 2xx อย่างรวดเร็ว; ทำงานช้าหลังจากที่คุณตอบกลับหรือในคิว
- กด Test บน webhook เพื่อรับ ping ที่ลงนามและยืนยันการเชื่อมต่อ
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(raw: string, header: string, secret: string): boolean {
const t = /t=(\d+)/.exec(header)?.[1], v1 = /v1=([a-f0-9]+)/.exec(header)?.[1];
if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = createHmac("sha256", secret).update(\`${t}.${raw}\`).digest("hex");
return expected.length === v1.length && timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
export async function POST(req: Request) {
const raw = await req.text();
if (!verify(raw, req.headers.get("x-qrflow-signature") ?? "", process.env.QRFLOW_WEBHOOK_SECRET!)) {
return new Response("bad signature", { status: 401 });
}
const evt = JSON.parse(raw) as { id: string; event: string; created_at: string; data: any };
// evt.id is stable across retries: store it and skip duplicates.
switch (evt.event) {
case "scan": // evt.data.scans[]: code_id, label, slug, scanned_at, device, country, city, referrer, browser, os, language
break;
case "code.created": // evt.data.code, evt.data.source
case "code.updated": // evt.data.code, evt.data.changed[]
case "code.deleted": // evt.data.code { id, label, short_code, slug }
break;
case "ping": // the Test button
break;
}
return new Response(null, { status: 204 });
}
- ในเครื่อง ให้เปิดเผย dev server ของคุณด้วย tunnel (cloudflared tunnel --url http://localhost:3000, หรือ ngrok) และใช้ URL https นั้นสำหรับ webhook ขณะที่คุณพัฒนา
- แพ็กเกจ npm ทำสิ่งนี้ให้คุณ:
import { parseWebhook } from "qrflow"\ตรวจสอบและแยกวิเคราะห์ในการเรียกครั้งเดียว (WebCrypto ดังนั้นมันจึงทำงานใน Workers และ Deno ด้วย) ไคลเอนต์ Python มาพร้อม verify_webhook
รับ webhooks ใน Python
เมื่อใด: Flask, FastAPI หรือ Django รับเหตุการณ์เดียวกัน
import os, json
from flask import Flask, request, abort
from qrflow import verify_webhook # https://qrflow.codes/sdk/qrflow.py
app = Flask(__name__)
@app.post("/qrflow")
def hook():
raw = request.get_data() # bytes, before any parsing
if not verify_webhook(raw, request.headers.get("X-QRFLOW-Signature", ""), os.environ["QRFLOW_WEBHOOK_SECRET"]):
abort(401)
evt = json.loads(raw)
if evt["event"] == "scan":
for s in evt["data"]["scans"]:
print(s["code_id"], s["scanned_at"], s["country"], s["device"])
return "", 204
โค้ดหลายพันจาก CSV
เมื่อใด: หนึ่งโค้ดต่อ SKU ต่อที่นั่ง ต่อแท็กทรัพย์สิน ต่อไปรษณีย์
import { parse } from "csv-parse/sync";
import { readFileSync } from "node:fs";
const rows = parse(readFileSync("skus.csv"), { columns: true }) as Array<{ sku: string; url: string }>;
const out: Array<{ sku: string; id: string; short_url: string }> = [];
for (let i = 0; i < rows.length; i += 2000) { // Business: 2,000 per request
const chunk = rows.slice(i, i + 2000);
const { codes, rejected, remaining_this_month } = await qr.bulkCreate(
chunk.map((r) => ({ destination: r.url, label: r.sku })),
);
codes.forEach((c, j) => out.push({ sku: chunk[j].sku, id: c.id, short_url: c.short_url }));
if (rejected.length) console.warn(rejected); // rows that were not web addresses
console.log(remaining_this_month, "left this month");
}
- Bulk สร้างเฉพาะโค้ด url แบบไดนามิก ทั้งหมดมีสีเดียวกัน โค้ดจะถูกส่งกลับตามลำดับที่คุณส่ง ลบแถวที่ถูกปฏิเสธ; จับคู่ด้วย label เมื่อไม่แน่ใจ
- Webhooks จะได้รับหนึ่งเหตุการณ์ code.created ต่อคำขอ bulk พร้อม codes[] แทนที่จะเป็นหนึ่งต่อโค้ด
ให้ผู้ใช้ของคุณเชื่อมต่อบัญชี QRFLOW ของตนเอง (OAuth)
เมื่อใด: คุณกำลังสร้างผลิตภัณฑ์สำหรับผู้อื่นและต้องการให้โค้ดไปอยู่ในบัญชี QRFLOW ของพวกเขา ไม่ใช่ของคุณ
- ลงทะเบียนไคลเอนต์ครั้งเดียว: POST https://qrflow.codes/api/oauth/register ด้วย client_name และ redirect_uris คุณจะได้รับ client_id (และ client_secret สำหรับ confidential clients)
- ส่งผู้ใช้ไปที่ /oauth/authorize ด้วย response_type=code, client_id, redirect_uri, scope, state และ PKCE (code_challenge, code_challenge_method=S256)
- แลกเปลี่ยนโค้ดที่ /api/oauth/token เก็บ refresh token; access tokens มีอายุหนึ่งชั่วโมง
- เรียก /api/v1 ด้วย Authorization: Bearer <access_token> ทุกอย่างทำงานเหมือนกับคีย์ทุกประการ ภายใต้แผนของผู้ใช้
curl -X POST https://qrflow.codes/api/oauth/register -H "Content-Type: application/json" \
-d '{ "client_name": "Acme Menus", "redirect_uris": ["https://app.example.com/oauth/qrflow"], "token_endpoint_auth_method": "none" }'
# { "client_id": "dyn_…", "redirect_uris": [...], "grant_types": ["authorization_code","refresh_token"], … }
https://qrflow.codes/oauth/authorize?response_type=code&client_id=dyn_…&redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fqrflow
&scope=profile%20codes%3Aread%20codes%3Awrite%20analytics%3Aread&state=…&code_challenge=…&code_challenge_method=S256
- Scopes เป็นหกอย่างเดียวกันกับ API keys ขอเท่าที่จำเป็น; หน้าอนุญาตจะแสดงรายการ
- หากแอปของคุณเป็นผู้ช่วยแชทหรือ agent ให้เพิ่ม resource=https://qrflow.codes/mcp ในคำขอ authorize และพูดคุยกับ MCP server แทน; โทเค็นจะถูกผูกไว้กับมัน
Zapier, Make, n8n: ไม่ต้องเขียนโค้ดเลย
เมื่อใด: คุณต้องการให้การสแกนหรือโค้ดใหม่ไปอยู่ในชีต ช่อง Slack หรือ CRM
- สร้างทริกเกอร์ catch-hook (Zapier: Webhooks by Zapier › Catch Hook; Make: Custom webhook; n8n: Webhook node) และคัดลอก URL https ของมัน
- ใน Account › Webhooks เพิ่ม URL นั้นและเลือกเหตุการณ์ กด Test; ping จะปรากฏในเครื่องมือและให้รูปร่าง payload แก่มัน
- แมป data.scans[] (สำหรับ scan) หรือ data.code (สำหรับ code.*) ไปยังชีต ข้อความ หรือเรกคอร์ดของคุณ
- เพื่อสร้างโค้ดจากเครื่องมือเหล่านั้น ใช้โมดูล HTTP กับ POST /codes ด้วยส่วนหัว Authorization เก็บคีย์ในที่เก็บข้อมูลประจำตัวของเครื่องมือ
- เครื่องมือเหล่านี้ไม่สามารถตรวจสอบลายเซ็นได้ URL ที่พวกเขาให้คุณนั้นคาดเดาไม่ได้ ซึ่งเป็นการป้องกันที่คุณมี; อย่าโพสต์มันที่ใด
Vibe coding
พรอมต์ที่จะวาง
ผู้ช่วยเขียนโค้ดจะสร้างสิ่งที่ถูกต้องเมื่อได้รับกฎล่วงหน้า พรอมต์เหล่านี้มีกฎอยู่ วางหนึ่งอัน เติมในวงเล็บ และผู้ช่วยจะอ่านเอกสารอ้างอิง Markdown ก่อนที่จะเขียนบรรทัดใดๆ
เพิ่ม QR codes ในแอปของฉัน
Claude, ChatGPT, Cursor, Codex, Windsurf, Copilot Chat: วางในแชท
Add QR codes to this project using the QRFLOW.codes API.
Read https://qrflow.codes/llms-full.txt before writing code; it is the complete reference.
Rules:
- The API key is in the environment variable QRFLOW_KEY. It must only be used server-side (route handler, server action, edge function). Never expose it to the browser.
- Create dynamic codes: POST https://qrflow.codes/api/v1/codes with { "type": "url", "destination_data": { "url": ... }, "label": ... }.
- Save the returned code.id and code.short_url on my record. short_url is what gets printed or displayed.
- Show the image by proxying GET /codes/:id/image.svg through my server, or by encoding short_url with a QR library on the client.
- Handle errors from the JSON body: { "error", "message" }. Map 402 to "upgrade needed", 429 to a retry with the Retry-After header.
What I want: [describe the feature, e.g. "every event in my events table gets a QR code that opens its public page; show it on the event admin page with a download button"].
สอน repo ของคุณเกี่ยวกับ QRFLOW
วางใน CLAUDE.md, AGENTS.md, .cursorrules หรือ .github/copilot-instructions.md
## QR codes (QRFLOW.codes)
- Docs: https://qrflow.codes/llms-full.txt (Markdown), https://qrflow.codes/api/v1/openapi.json (OpenAPI 3.1).
- Base URL https://qrflow.codes/api/v1, header Authorization: Bearer $QRFLOW_KEY. Server-side only.
- Codes are created with POST /codes { type: "url", destination_data: { url }, label }. Store code.id and code.short_url.
- Change the destination with PATCH /codes/:id { destination_data: { url } }. Never change slug/domain_id after printing.
- Image: GET /codes/:id/image.svg (needs the key). Prefer paused: true over DELETE when a print exists.
- Webhooks arrive as POST with X-QRFLOW-Signature (t=,v1=HMAC-SHA256 of "t.rawBody"); verify with the raw body.
ใน Lovable, Bolt, v0, Replit และตัวสร้างแอปอื่นๆ
ตัวสร้างที่เน้น front-end เป็นหลักซึ่งให้แบ็กเอนด์แก่คุณ (Supabase, serverless functions)
Integrate QRFLOW.codes QR codes. The API refuses browser calls, so create a backend function (Supabase Edge Function / serverless function) that holds the secret QRFLOW_KEY and calls POST https://qrflow.codes/api/v1/codes with { "type": "url", "destination_data": { "url": "<the page URL>" }, "label": "<name>" }. Return code.id and code.short_url to the UI and save them in the database. Render the QR in the UI by encoding short_url with a QR library; add a "Download for print" button that fetches /codes/:id/image.svg through the same backend function. Reference: https://qrflow.codes/llms-full.txt
GPT ที่กำหนดเองซึ่งจัดการโค้ดของฉัน
ChatGPT › Create a GPT › Actions
Import from URL: https://qrflow.codes/api/v1/openapi.json
Authentication: API Key › Bearer › paste a Business key with the scopes you want the GPT to have.
Then the GPT can list, create, re-point and report on your codes. For a no-setup version, add the MCP connector instead (Developer mode › Plugins › https://qrflow.codes/mcp).
สิ่งที่ควรพูดเมื่อเชื่อมต่อ connector แล้ว
Claude, ChatGPT, Claude Code ที่เชื่อมต่อกับ MCP server ของ QRFLOW
"Make a QR code for https://example.com/fall-menu, call it Fall menu, frame caption 'Scan for menu'."
"Which of my codes got the most scans this month? Show a breakdown by country for the top one."
"Point the 'Lobby poster' code at https://example.com/events/october."
"Name the 'Business card' code's link 'hi' on my domain."
"Pause every code with 'Summer' in the label."
"Make 40 codes, one per table, going to https://example.com/order?table=1 through 40."
"Show me the PNG of the 'Front door' code."
MCP server
ใช้จาก Claude, ChatGPT, Cursor และ Claude Code
QRFLOW เป็น MCP server ที่ https://qrflow.codes/mcp เชื่อมต่อครั้งเดียว ลงชื่อเข้าใช้ แล้วพูดเช่น "สร้าง QR code สำหรับหน้าเมนูฤดูใบไม้ร่วงของเรา ชื่อ menu บนโดเมนของฉัน", "ชี้โค้ดของโปสเตอร์ล็อบบี้ไปที่หน้าใหม่" หรือ "สัปดาห์ที่แล้วใบปลิวมีการสแกนกี่ครั้ง แยกตามประเทศ?" ผู้ช่วยจะได้รับเครื่องมือเดียวกันกับที่ API นี้เสนอ ภายใต้กฎเดียวกัน และโค้ดจะอยู่ในแดชบอร์ดของคุณโดยมี mcp เป็นแหล่งที่มา
ไม่ใช่นักพัฒนา? เวอร์ชันภาษาธรรมดา พร้อมคลิกที่แน่นอนสำหรับผู้ช่วยแต่ละคน อยู่ที่ สร้าง QR codes ด้วยผู้ช่วย AI ของคุณ
เชื่อมต่อ
Customize › Connectors › Add custom connector › วางที่อยู่ หรือกด Connect ในรายการไดเรกทอรีของ QRFLOW Claude จะเปิดหน้าลงชื่อเข้าใช้ QRFLOW; กด Allow ใช้งานได้ทุกแผน
https://qrflow.codes/mcp
Settings › Security and login › เปิด Developer mode จากนั้น Settings › Plugins › + › วางที่อยู่; ลงชื่อเข้าใช้เมื่อถูกขอ Plus, Pro, Team, Enterprise และ Edu
https://qrflow.codes/mcp
หนึ่งคำสั่ง จากนั้น /mcp เพื่อลงชื่อเข้าใช้ เพิ่มคีย์ Business เป็นส่วนหัวเพื่อข้ามการลงชื่อเข้าใช้
claude mcp add --transport http qrflow https://qrflow.codes/mcp
# or, with a key:
claude mcp add --transport http qrflow https://qrflow.codes/mcp --header "Authorization: Bearer $QRFLOW_KEY"
Cursor, Windsurf, VS Code, ไคลเอนต์ MCP ใดๆ
เพิ่มเซิร์ฟเวอร์ HTTP ที่ URL การลงชื่อเข้าใช้ OAuth เกิดขึ้นในเบราว์เซอร์; หรือส่งส่วนหัว Authorization พร้อมคีย์
{
"mcpServers": {
"qrflow": { "type": "http", "url": "https://qrflow.codes/mcp" }
}
}
agent ของคุณเอง (Anthropic หรือ OpenAI SDK)
ชี้ตัวเชื่อมต่อ MCP หรือเครื่องมือไปที่ URL ด้วยคีย์ Business เป็น bearer; ไม่ต้องใช้โฟลว์เบราว์เซอร์
// Anthropic Messages API, MCP connector
mcp_servers: [{ type: "url", url: "https://qrflow.codes/mcp", name: "qrflow", authorization_token: process.env.QRFLOW_KEY }]
สิ่งที่ผู้ช่วยสามารถทำได้
| เครื่องมือ | สิ่งที่มันทำ | ขอบเขต |
|---|---|---|
| list_code_kinds | ทุกชนิดของโค้ดพร้อมฟิลด์และแผนที่ต้องใช้ ผู้ช่วยเรียกสิ่งนี้ก่อนสร้างสิ่งที่ไม่ธรรมดา | profile |
| list_domains | โดเมนลิงก์ของคุณ ค่าเริ่มต้น และ id ของพวกมัน | domains:read |
| get_qr_image | PNG ที่ผู้ช่วยสามารถแสดงหรือบันทึก พร้อม URL SVG สำหรับพิมพ์ | codes:read |
| get_account | ใครลงชื่อเข้าใช้ แผน ขีดจำกัด | profile |
มันปลอดภัยอย่างไร
- ผู้ช่วยถือโทเค็นสำหรับบัญชี ของคุณ เท่านั้น ออกหลัง คุณ กด Allow บนหน้า QRFLOW ยกเลิกการเชื่อมต่อได้ทุกเมื่อใน Account › Connected apps
- โทเค็นถูกผูกกับ MCP server; ไม่สามารถเล่นซ้ำกับ REST API ได้
- ทุกการเขียนผ่านการตรวจสอบเดียวกันกับแดชบอร์ด: ปลายทางที่อนุญาต การตรวจสอบแผน เพดานการใช้งานที่เหมาะสม
- เครื่องมือที่ทำลายล้างอธิบายตัวเองอย่างรอบคอบ:
delete_qr_codeบอกโมเดลให้เลือกหยุดชั่วคราวเมื่อมีการพิมพ์อยู่ - เอกสาร discovery อยู่ที่
/.well-known/oauth-authorization-serverและ/.well-known/oauth-protected-resource; การลงทะเบียนเป็น RFC 7591; PKCE S256 เท่านั้น
SDK และสเปก OpenAPI
- TypeScript / JavaScript:
npm install qrflow(npm) ไม่มีการพึ่งพา ESM และ CommonJS พร้อม types ครบ; ทำงานใน Node 18+, Bun, Deno และ Workers ลอง 429s ใหม่ให้คุณและมาพร้อมverifyWebhook/parseWebhook - Python 3.9+ เฉพาะไลบรารีมาตรฐาน: qrflow.py
- OpenAPI 3.1: /api/v1/openapi.json นำเข้าใน Postman หรือ Insomnia สร้างไคลเอนต์ในภาษาใดก็ได้ หรือแนบกับ ChatGPT Action
- ไคลเอนต์ทั้งสองโยนข้อผิดพลาดแบบมีประเภท (
QRFlowErrorพร้อมstatus,code,message,retryAfter) และมาพร้อมตัวตรวจสอบ webhook ซอร์ส TypeScript ไฟล์เดียวยังอยู่ที่ /sdk/qrflow.ts หากคุณต้องการ vendor มัน
| TypeScript | Python | Calls |
|---|---|---|
| me() | me() | GET /me |
| catalog() | catalog() | GET /catalog |
| listCodes({ limit, q }) | list_codes(limit, q) | GET /codes |
| getCode(id) | get_code(id) | GET /codes/:id |
| createCode(input) | create_code(**fields) | POST /codes |
| updateCode(id, patch) | update_code(id, **patch) | PATCH /codes/:id |
| deleteCode(id) | delete_code(id) | DELETE /codes/:id |
| makeDynamic(id) | make_dynamic(id) | POST /codes/:id/dynamic |
| scans(id, { from, to, group }) | scans(id, from_, to, group) | GET /codes/:id/scans |
| bulkCreate(rows, colors) | bulk_create(rows, **colors) | POST /codes/bulk |
| domains() | domains() | GET /domains |
| listWebhooks() / createWebhook() / testWebhook(id) / deleteWebhook(id) | list_webhooks() / create_webhook() / test_webhook(id) / delete_webhook(id) | /webhooks |
| imageUrl(id, size) | image_url(id, size) | ที่อยู่รูปภาพ (ดึงด้วยคีย์) |
| verifyWebhook(raw, header, secret) | verify_webhook(raw, header, secret) | การตรวจสอบลายเซ็นสำหรับการส่ง |
เอกสารอ้างอิง endpoint
Base URL https://qrflow.codes/api/v1. เนื้อหาและคำตอบเป็น JSON วันที่เป็น ISO 8601 ใน UTC ส่งเฉพาะฟิลด์ที่มีการเปลี่ยนแปลงบน PATCH
GETprofile
แผน ฟีเจอร์แฟล็ก และขีดจำกัดที่ใช้กับบัญชีนี้ รวมถึงขอบเขตของคีย์
curl https://qrflow.codes/api/v1/me \
-H "Authorization: Bearer $QRFLOW_KEY"
{ "id": "…", "email": "ops@example.com", "plan": "business", "paid": true,
"features": { "dynamic_codes": true, "custom_domain": true, "link_names": true, "gs1": true, "api_keys": true },
"limits": { "saved_codes": 25000, "bulk_per_month": 10000, "bulk_per_request": 2000, "link_domains": 5, "requests_per_minute": 600 },
"auth": "api_key", "scopes": ["codes:read", "codes:write"] }
GETpublic
ประเภทดั้งเดิม (url, wifi, vcard, email, phone, sms, text, location) และประเภทย่อยประมาณ 50 ชนิด (Instagram, Google review, Wi-Fi, app store…) แต่ละประเภทมีฟิลด์ที่จำเป็นและแผนที่ต้องใช้ ไม่ต้องใช้คีย์
curl https://qrflow.codes/api/v1/catalog
GETcodes:read
เรียงจากใหม่ไปเก่า ?limit= สูงสุด 100, ?q= ค้นหาป้ายกำกับ
curl "https://qrflow.codes/api/v1/codes?limit=20&q=menu" \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTcodes:write
กฎเดียวกันกับปุ่มบันทึกบนเว็บไซต์: url, phone, email, sms และ location codes เป็นแบบไดนามิกบนแผนแบบชำระเงิน; Wi-Fi, vCard และ text นำเนื้อหาไปในแพตเทิร์น ใส่ id ของประเภทย่อยใน destination_data.subtype เพื่อสร้าง เช่น โค้ด Google review ใช้ domain_id เพื่อเลือกโดเมนลิงก์ของคุณที่โค้ดจะพิมพ์ด้วย (GET /domains แสดงรายการ)
curl -X POST https://qrflow.codes/api/v1/codes \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "url", "destination_data": { "url": "https://example.com/menu" }, "label": "Table tents", "frame_style": "caption-below", "frame_caption": "Scan for menu" }'
{ "code": { "id": "…", "label": "Table tents", "kind": "url", "dynamic": true, "short_code": "x7k2p9a",
"short_url": "https://go.example.com/x7k2p9a", "scans": 0, "image_url": "https://qrflow.codes/api/v1/codes/…/image.svg", … } }
GETcodes:read
โค้ดพร้อมจำนวนสแกน ลิงก์สั้น และที่อยู่รูปภาพ
curl https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
PATCHcodes:write
ฟิลด์ใดก็ได้จาก: destination_data (เฉพาะโค้ดแบบไดนามิก การพิมพ์ยังใช้ได้), label, paused, expires_at (ISO หรือ null), slug (ชื่อลิงก์บนโดเมนของคุณ), domain_id (โดเมนลิงก์ที่โค้ดนี้พิมพ์ด้วย; null = ค่าเริ่มต้นของบัญชี), fg_color, bg_color, frame_style, frame_caption, frame_caption2 ส่งเฉพาะฟิลด์ที่คุณต้องการเปลี่ยน
curl -X PATCH https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "destination_data": { "url": "https://example.com/menu-fall" }, "slug": "menu" }'
DELETEcodes:write
ลบทิ้งถาวร รวมถึงประวัติการสแกน ลิงก์ที่พิมพ์ของโค้ดแบบไดนามิกจะหยุดทำงาน ควรใช้ paused: true หากยังมีการพิมพ์อยู่
curl -X DELETE https://qrflow.codes/api/v1/codes/$ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
POSTcodes:write
แพตเทิร์นที่พิมพ์เปลี่ยนไป (ตอนนี้เข้ารหัสลิงก์สั้น) ดังนั้นต้องเรนเดอร์รูปภาพใหม่หลังจากนั้น
curl -X POST https://qrflow.codes/api/v1/codes/$ID/dynamic \
-H "Authorization: Bearer $QRFLOW_KEY"
GETcodes:read
SVG พร้อมพิมพ์พร้อมกรอบและสี ?size= กำหนดความกว้างของกริดโมดูลเป็น px; ไฟล์สามารถปรับขนาดได้โดยไม่สูญเสียคุณภาพ
curl https://qrflow.codes/api/v1/codes/$ID/image.svg \
-H "Authorization: Bearer $QRFLOW_KEY" -o code.svg
GETanalytics:read
?from= และ ?to= (วันที่ ISO สูงสุด 92 วัน ค่าเริ่มต้น 30 วันล่าสุด) และ ?group= day, device, country, city, browser, os หรือ referrer ตัวเลขเดียวกันกับหน้า analytics
curl "https://qrflow.codes/api/v1/codes/$ID/scans?from=2026-09-01&to=2026-09-21&group=day" \
-H "Authorization: Bearer $QRFLOW_KEY"
{ "code_id": "…", "from": "…", "to": "…", "group": "day", "total": 412,
"rows": [ { "key": "2026-09-01", "scans": 18 }, { "key": "2026-09-02", "scans": 25 }, … ] }
POSTcodes:write
สร้าง URL codes ได้สูงสุด 2,000 โค้ดในครั้งเดียว ทั้งหมดเป็นแบบไดนามิก นับรวมกับโควต้าบัลค์รายเดือนเดียวกันกับหน้า Bulk (10,000 บนแผน Business) แถวที่ไม่ใช่ที่อยู่เว็บจะถูกส่งกลับใน rejected; ส่วนที่เหลือจะถูกสร้าง
curl -X POST https://qrflow.codes/api/v1/codes/bulk \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "rows": [ { "destination": "https://example.com/t/1", "label": "Table 1" }, { "destination": "https://example.com/t/2", "label": "Table 2" } ] }'
{ "codes": [ … ], "rejected": [], "remaining_this_month": 9998 }
GETdomains:read
โดเมนที่เชื่อมต่อของคุณ สถานะ และโดเมนที่โค้ดแบบไดนามิกพิมพ์ด้วยโดยค่าเริ่มต้น (default_base) ส่ง id ของโดเมนเป็น domain_id บนโค้ดเพื่อพิมพ์โค้ดนั้นด้วยโดเมนอื่น
curl https://qrflow.codes/api/v1/domains \
-H "Authorization: Bearer $QRFLOW_KEY"
GETwebhooks:manage
เว็บฮุคของคุณพร้อมอีเวนต์ สถานะล่าสุด และจำนวนครั้งที่ล้มเหลว
curl https://qrflow.codes/api/v1/webhooks \
-H "Authorization: Bearer $QRFLOW_KEY"
POSTwebhooks:manage
url ต้องเป็น https บนโฮสต์สาธารณะ; events คือ scan, code.created, code.updated, code.deleted ความลับสำหรับการเซ็นชื่อจะถูกส่งกลับเพียงครั้งเดียว
curl -X POST https://qrflow.codes/api/v1/webhooks \
-H "Authorization: Bearer $QRFLOW_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/hooks/qrflow", "events": ["scan", "code.updated"] }'
{ "webhook": { "id": "…", "url": "…", "events": ["scan", "code.updated"], "active": true, "secret": "whsec_…" } }
POSTwebhooks:manage
ส่ง ping ที่เซ็นชื่อทันทีและรายงานการตอบกลับ
curl -X POST https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
DELETEwebhooks:manage
หยุดการส่งทั้งหมด รวมถึงการลองใหม่ที่คิวอยู่
curl -X DELETE https://qrflow.codes/api/v1/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $QRFLOW_KEY"
204 No Content
GETpublic
ID ของกรอบและสิ่งที่แต่ละกรอบต้องใช้ (คำบรรยาย บรรทัดที่สอง) จัดกลุ่มเหมือนตัวปรับแต่ง ไม่ต้องใช้คีย์
curl https://qrflow.codes/api/v1/frames
ออบเจกต์ Code
ทุกเอนด์พอยต์ที่เกี่ยวข้องกับโค้ดจะส่งคืนโครงสร้างเดียวกัน ละเว้นฟิลด์ที่คุณไม่รู้จัก; ฟิลด์ใหม่จะถูกเพิ่มเมื่อเวลาผ่านไป
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
| id | uuid | ID ที่เสถียร ใช้ในการเรียกอื่น ๆ ทุกครั้ง |
| label | string | null | ชื่อในแดชบอร์ด สูงสุด 120 ตัวอักษร ค้นหาได้ด้วย ?q= |
| kind | string | ID ในแคตตาล็อก: url, wifi, instagram, googlereview,... kind_label คือชื่อที่มนุษย์อ่านได้ |
| type | string | การเข้ารหัส: url, text, wifi, vcard, email, phone, sms, location |
| destination_data | object | ฟิลด์ที่คุณส่ง (รวมถึง subtype สำหรับ kind) destination คือสรุปหนึ่งบรรทัด |
| dynamic | boolean | เป็นจริงเมื่อการสแกนผ่าน QRFLOW และปลายทางสามารถเปลี่ยนได้ dynamic_capable บอกว่าประเภทนี้สามารถเป็นแบบไดนามิกบนแผนแบบชำระเงินได้หรือไม่ |
| short_code | string | เจ็ดตัวอักษร ไม่เปลี่ยนแปลง |
| short_url | string | สิ่งที่พิมพ์สำหรับโค้ดแบบไดนามิก รวมโดเมนและ slug ของคุณเมื่อตั้งค่า |
| domain_id | uuid | null | โดเมนลิงก์ที่โค้ดนี้พิมพ์ด้วย; null หมายถึงค่าเริ่มต้นของบัญชี |
| fg_color, bg_color | hex | สีโมดูลและพื้นหลัง |
| has_logo | boolean | เพิ่มโลโก้ในแดชบอร์ดแล้ว; image.svg รวมโลโก้ |
| frame_style, frame_caption, frame_caption2 | string | null | ID กรอบและคำบรรยาย ตามตัวปรับแต่ง |
| scans | integer | จำนวนสแกนตลอดอายุ |
| created_at, updated_at | ISO 8601 | UTC |
| manage_url | url | หน้าโค้ดในแดชบอร์ด สำหรับลิงก์ 'Open in QRFLOW' |
| image_url | url | GET /codes/:id/image.svg ต้องใช้ส่วนหัว Authorization; ไม่ใช่ URL รูปภาพสาธารณะ |
| svg_download_url, png_download_url | url | SVG เดียวกัน (กรอบ สี โลโก้) และ PNG ธรรมดาผ่านลิงก์ที่เซ็นชื่อซึ่งใช้งานได้ 24 ชั่วโมงโดยไม่ต้องใช้ส่วนหัว: สำหรับแท็ก <img>, สคริปต์ และผู้ช่วยที่บันทึกไฟล์ download_expires_at บอกว่าเมื่อหมดอายุ; การอ่านโค้ดใด ๆ จะส่งคืนลิงก์ใหม่ |
รูปร่างอื่น: Scans (code_id, from, to, group, total, rows[key, scans]), Domain (id, host, status, active, is_default, verified_at, grace_until), Webhook (id, url, events, active, last_status, last_delivery_at, consecutive_failures, บวก secret ครั้งเดียว), Me (id, email, plan, paid, features, limits, auth, scopes) และ Error (error, message) เอกสาร OpenAPI มีทุกคุณสมบัติพร้อมชนิด
Business
เว็บฮุค
QRFLOW เรียก URL https ของคุณเมื่อมีเหตุการณ์เกิดขึ้น สร้างได้ที่ Account › Webhooks หรือด้วย POST /webhooks; คุณจะได้รับความลับสำหรับการเซ็นชื่อเพียงครั้งเดียว สูงสุด 10 ต่อบัญชี
| อีเวนต์ | เมื่อ | data |
|---|---|---|
| scan | แบบแบตช์: ทุกสองสามนาที การสแกนใหม่ทั้งหมดตั้งแต่การส่งครั้งล่าสุด สูงสุด 500 ต่อการเรียก | count, from, to, scans[] พร้อม code_id, label, short_code, slug, scanned_at, device, country, city, referrer, browser, os, language |
| code.created | ทันทีจาก API และผู้ช่วย; ภายในไม่กี่นาทีจากแดชบอร์ด คำขอแบบบัลค์ส่งหนึ่งอีเวนต์พร้อม bulk: true และ codes[] | code, source |
| code.updated | ช่วงเวลาเดียวกัน ครอบคลุมปลายทาง ป้ายกำกับ หยุดชั่วคราว วันหมดอายุ ชื่อลิงก์ โดเมน สี กรอบ และการแปลงเป็นไดนามิก | code, changed[] (ชื่อฟิลด์ที่เปลี่ยน) |
| code.deleted | ช่วงเวลาเดียวกัน | code: { id, label, short_code, slug } |
| ping | เมื่อคุณกด Test | webhook_id, message |
สิ่งที่ส่งมา
ทุกเพย์โหลดคือ { id, event, created_at, data } id มีความเสถียรข้ามการลองใหม่ของการส่งครั้งเดียว ดังนั้นคุณสามารถใช้เพื่อตัดรายการซ้ำได้
{
"id": "9b1c6d2e-…",
"event": "scan",
"created_at": "2026-09-21T18:05:00.000Z",
"data": {
"count": 2,
"from": "2026-09-21T18:00:00.000Z",
"to": "2026-09-21T18:04:12.331Z",
"scans": [
{ "code_id": "…", "label": "Table tents", "short_code": "x7k2p9a", "slug": "menu", "scanned_at": "2026-09-21T18:03:40.101Z",
"device": "mobile", "country": "US", "city": "Las Vegas", "referrer": null, "browser": "Safari", "os": "iOS", "language": "en-US" },
{ "code_id": "…", "label": "Table tents", "short_code": "x7k2p9a", "slug": "menu", "scanned_at": "2026-09-21T18:04:12.331Z",
"device": "mobile", "country": "MX", "city": "Tijuana", "referrer": null, "browser": "Chrome", "os": "Android", "language": "es-MX" }
]
}
}
{
"id": "2f0a…",
"event": "code.updated",
"created_at": "2026-09-21T18:06:00.000Z",
"data": {
"code": { "id": "…", "label": "Table tents", "kind": "url", "dynamic": true, "short_url": "https://go.example.com/menu", "scans": 412, "…": "…" },
"changed": ["destination_data"]
}
}
POST /your/endpoint HTTP/1.1
Content-Type: application/json
User-Agent: QRFLOW-Webhooks/1.0 (+https://qrflow.codes/developers)
X-QRFLOW-Event: scan
X-QRFLOW-Signature: t=1758477900,v1=5f1c…e9
ตรวจสอบลายเซ็น
X-QRFLOW-Signature: t=<unix seconds>,v1=<hex> คำนวณ HMAC-SHA256 เหนือ ${t}.${rawBody} ด้วยความลับของคุณและเปรียบเทียบกับ v1 ในเวลาคงที่; ปฏิเสธหาก t อายุเกินห้านาที ใช้ไบต์ดิบที่คุณได้รับ ห้ามใช้การเรียงลำดับวัตถุใหม่ ตัวรับที่ใช้งานได้สำหรับ Next.js และ Python อยู่ในสูตร และทั้งสอง SDK มีตัวช่วยนี้
กฎการส่ง
- ตอบกลับ 2xx ใด ๆ ภายใน 8 วินาที ทำงานหลังจากที่คุณตอบกลับ
- อย่างอื่นจะลองใหม่หลังจาก 1, 5, 15, 60, 240 และ 720 นาที
- ความล้มเหลวติดต่อกันยี่สิบครั้งจะปิดเว็บฮุคและอีเมลถึงเจ้าของบัญชี เปิดใหม่เมื่อตัวรับได้รับการแก้ไข; การลองใหม่ที่คิวจะดำเนินต่อ
- URL ต้องเป็น https บนโฮสต์สาธารณะ localhost, ช่วง IP ส่วนตัว และ qrflow.codes เองจะถูกปฏิเสธ ใช้ทันเนลระหว่างการพัฒนา
- กด Test เพื่อรับ
pingที่เซ็นชื่อและดูสถานะที่เซิร์ฟเวอร์ของคุณตอบกลับ
ข้อผิดพลาด
ทุกข้อผิดพลาดคือ { "error": "<code>", "message": "<what to do>" } พร้อมสถานะด้านล่าง ข้อความเขียนสำหรับคน; แสดงให้เห็น
| สถานะ | error | ความหมาย |
|---|
อาการ สาเหตุ วิธีแก้ไข
การแก้ไขปัญหา
401 invalid_token ในการเรียกทุกครั้ง
ทำไมส่วนหัวผิดหรือคีย์ไม่ทำงาน
วิธีแก้ไขส่ง Authorization: Bearer qrf_live_… ให้ถูกต้อง (เว้นวรรค ไม่ใช่โคลอน) ตรวจสอบว่าคีย์ไม่ได้ถูกเพิกถอนที่ Account › API keys หากคัดลอกจากแชทหรือเอกสาร ระวังจุดท้ายหรือเครื่องหมายคำพูดแบบสมาร์ท
401 บน /api/v1 ด้วยโทเค็นที่ใช้ได้บน MCP server
ทำไมโทเค็นที่สร้างสำหรับ https://qrflow.codes/mcp ผูกกับมัน
วิธีแก้ไขใช้ API key สำหรับ REST หรือรัน OAuth flow ที่สองโดยไม่มี resource= เพื่อรับโทเค็นสำหรับ REST API
402 upgrade_required เมื่อสร้างคีย์หรือเว็บฮุค
ทำไมทั้งสองเป็นฟีเจอร์ Business
วิธีแก้ไขอัปเกรดที่ /pricing หรือใช้ MCP server ซึ่งทำงานได้ทุกแผนผ่านการเข้าสู่ระบบ
402 บน POST /codes จากแอป OAuth
ทำไมแผนของผู้ใช้ไม่รวมสิ่งที่แอปขอ (โค้ดไดนามิก โดเมน)
วิธีแก้ไขอ่าน GET /me features ก่อนและปรับ: สร้างโค้ดต่อไป (จะเป็นแบบคงที่บน Free) หรือบอกผู้ใช้ว่าแผนต้องใช้อะไร
403 insufficient_scope
ทำไมขอบเขตถูกกำหนดเมื่อสร้างคีย์
วิธีแก้ไขสร้างคีย์ใหม่พร้อมขอบเขตที่ต้องการและเพิกถอนคีย์เก่า สำหรับ OAuth ขอขอบเขตในคำขอ authorize
400 not_dynamic เมื่อฉัน PATCH destination_data
ทำไมโค้ดเป็นแบบคงที่: สร้างบน Free หรือเป็นประเภท Wi-Fi/vCard/text
วิธีแก้ไขสำหรับ url/phone/email/sms/location บนแผนแบบชำระเงิน POST /codes/:id/dynamic แล้วดาวน์โหลดและพิมพ์ใหม่ (รูปภาพเปลี่ยน) Wi-Fi, vCard และ text ไม่สามารถเป็นไดนามิกได้; สร้าง url code ที่เปิดหน้าแทน
400 no_domain เมื่อฉันตั้ง slug
ทำไมชื่อลิงก์อยู่บนโดเมนของคุณ
วิธีแก้ไขเชื่อมต่อและยืนยันโดเมนที่หน้า Account ก่อน บน qrflow.codes/q พาธคือ short_code เสมอ
409 conflict บน slug
ทำไมโค้ดอื่นของคุณใช้ชื่อนั้น
วิธีแก้ไขGET /codes?q= เพื่อค้นหา หรือเลือกชื่ออื่น ชื่อเป็นต่อบัญชี ไม่ใช่ทั่วโลก
ข้อผิดพลาด CORS ในคอนโซลเบราว์เซอร์
ทำไมAPI รับเฉพาะการเรียกจากเซิร์ฟเวอร์ถึงเซิร์ฟเวอร์ (และ Canva) นี่เป็นความตั้งใจ: คีย์ในหน้าเว็บคือคีย์ที่รั่วไหล
วิธีแก้ไขย้ายการเรียกไปยัง route handler, server action, edge function หรือแบ็กเอนด์ และเรียกจากหน้านั้น
รูปภาพแสดงลายน้ำ QRFLOW
ทำไมบัญชีอยู่ในแผน Free
วิธีแก้ไขแผนแบบชำระเงินลบออก Free มีไว้สำหรับตัวสร้างของเว็บไซต์เอง
short_url ยังคงเป็น qrflow.codes/q/… หลังจากเพิ่มโดเมนแล้ว
ทำไมโดเมนยังไม่ได้รับการยืนยัน หรือ CNAME ผิด
วิธีแก้ไขตรวจสอบสถานะที่หน้า Account หรือ GET /domains (สถานะต้องเป็น verified) โค้ดที่มีอยู่จะเปลี่ยนโดยอัตโนมัติเมื่อยืนยันแล้ว
image_url ให้ 401 ในแท็ก <img>
ทำไมต้องใช้ส่วนหัว Authorization ซึ่ง <img> ไม่สามารถส่งได้
วิธีแก้ไขใช้ svg_download_url หรือ png_download_url จากออบเจกต์ Code เดียวกัน: ลิงก์ที่เซ็นชื่อซึ่งใช้งานได้ 24 ชั่วโมงโดยไม่ต้องใช้ส่วนหัว สำหรับสิ่งที่ถาวร ใช้พร็อกซี image_url ผ่านเซิร์ฟเวอร์ของคุณ (ดูสูตร Next.js) หรือเข้ารหัส short_url ด้วยตัวเอง
ฉันต้องการ PNG ไม่ใช่ SVG
ทำไมSVG มีกรอบและโลโก้; PNG เป็นโค้ดธรรมดา
วิธีแก้ไขGET /codes/:id/image.png (bearer หรือ png_download_url ที่เซ็นชื่อ) ส่งคืน PNG ขนาด 256 ถึง 2048 px สำหรับ PNG พร้อมกรอบ แปลง SVG ด้วย sharp หรือ resvg (sharp(svgBuffer).png().toBuffer())
ผู้ช่วยของฉันบอกว่าเอนด์พอยต์รูปภาพปฏิเสธและวาดโค้ดเอง
ทำไมมันดึง image_url ซึ่งต้องใช้ bearer
วิธีแก้ไขทุกโค้ดตอนนี้มี png_download_url และ svg_download_url และ get_qr_image ส่งคืน; ผู้ช่วยสามารถ curl ลิงก์เหล่านั้นได้โดยไม่ต้องเข้าสู่ระบบ โค้ดที่วาดในเครื่องซึ่งเข้ารหัส short_url เดียวกันยังทำงานและนับสแกน แต่ไม่มีกรอบและโลโก้
เว็บฮุคไม่เคยมาถึง
ทำไมกฎ URL หรือตัวรับ
วิธีแก้ไขURL ต้องเป็น https บนโฮสต์สาธารณะ (ไม่มี localhost, ไม่มี IP ส่วนตัว, ไม่ใช่ qrflow.codes) กด Test บนเว็บฮุค: ผลลัพธ์แสดงสถานะที่เซิร์ฟเวอร์ของคุณตอบกลับ อีเวนต์สแกนเป็นแบบแบตช์และอาจใช้เวลาถึงประมาณห้านาที; อีเวนต์ code.* จากแดชบอร์ดยังคิวสองสามนาที ในขณะที่การเขียนจาก API และ MCP ส่งทันที
ลายเซ็นไม่เคยตรวจสอบผ่าน
ทำไมคุณเซ็นชื่อเนื้อหาที่เรียงลำดับใหม่
FixVerify กับ raw bytes ที่คุณได้รับจริง ก่อนการ parse JSON ใน Express ใช้ express.raw({ type: 'application/json' }) บน route นั้น; ใน Next.js App Router ใช้ await req.text(); ใน Flask ใช้ request.get_data() จากนั้นคำนวณ HMAC-SHA256 ของ ${t}.${raw}\
Webhook ปิดตัวเอง
ทำไมความล้มเหลวติดต่อกัน 20 ครั้ง
แก้ไขแก้ไข receiver ก่อน แล้วตั้งค่าให้ active อีกครั้ง (Account › Webhooks หรือลบแล้วสร้างใหม่) คุณจะได้รับอีเมลเมื่อเกิดเหตุการณ์นี้ การ retry ที่ค้างอยู่จะดำเนินต่อ
การส่ง webhook ซ้ำซ้อน
ทำไมการตอบ 2xx ที่ช้า (เกิน 8 วินาที) นับเป็นความล้มเหลวและถูก retry
แก้ไขตอบกลับก่อน แล้วค่อยประมวลผลทีหลัง Dedupe ด้วย id ใน payload ซึ่งมีค่าคงที่ตลอดการ retry
429 rate_limited ระหว่างการ import
ทำไม600 คำขอต่อนาทีต่อ key
แก้ไขใช้ POST /codes/bulk (2,000 codes ในคำขอเดียว) แทนการ POST ทีละ code หรือรอตาม Retry-After seconds
ฉันลบ code แล้วโปสเตอร์ที่พิมพ์ออกมาแสดง 'Code not found'
ทำไมการลบเป็นการถาวรและทำลายลิงก์
แก้ไขไม่มีการย้อนกลับ ครั้งหน้าใช้ PATCH { paused: true }; code ที่ paused จะแสดงหน้าที่เป็นมิตรและสามารถ resume ได้
key ของฉันหยุดทำงานหลังจาก downgrade
ทำไมKeys ยังทำงานต่อ 30 วันหลังจากออกจาก Business แล้วตอบ 402
แก้ไขสมัครใหม่; ไม่มีอะไรถูกลบ และ key เดิมกลับมาทำงานได้
มีอะไรที่ไม่อยู่ในรายการ? hello@qrflow.codes พร้อมคำขอที่แน่นอนและ JSON error ที่คุณได้รับ บัญชี Business ได้รับลำดับความสำคัญ
ขีดจำกัดและการใช้งานที่เป็นธรรม
| ขีดจำกัด | |
|---|---|
| คำขอต่อนาที ต่อ key | 600. 429 พร้อม Retry-After เมื่อเกิน |
| Keys ต่อบัญชี | 10 |
| Webhooks ต่อบัญชี | 10 |
| Codes ที่บันทึก (การใช้งานที่เป็นธรรม) | 1,000 Premium, 25,000 Business; API หยุดที่สองเท่าของจำนวนนั้น |
| Bulk | 500/เดือน (500 ต่อคำขอ) Premium; 10,000/เดือน (2,000 ต่อคำขอ) Business |
| โดเมนลิงก์ | 1 Premium, 5 Business |
| การสแกน | ไม่จำกัด อีเมลเช็คอินที่ 100,000 สแกนต่อ code ต่อเดือนบน Premium, 1,000,000 บน Business; ไม่มีการจำกัดความเร็ว |
| หน้าต่าง analytics การสแกน | 92 วันต่อคำขอ |
| ขนาดหน้าของรายการ | 100 (?limit=) |
| Label / captions / slug | 120 / 60 / 40 ตัวอักษร |
| Webhook timeout และ retries | 8 วินาที; retries หลัง 1, 5, 15, 60, 240 และ 720 นาที; ปิดหลังความล้มเหลวติดต่อกัน 20 ครั้ง |
| หลังจากออกจาก Business | Keys และ webhooks ยังทำงาน 30 วัน แล้วตอบ 402 ไม่มีอะไรถูกลบ |
การใช้งานที่เป็นธรรมคือสิ่งที่แผนคิดราคาไว้ ไม่มีการจำกัดความเร็วที่จำนวนนั้น; API หยุดที่สองเท่าและมีคนส่งอีเมลถึงคุณก่อน ปริมาณที่สูงขึ้น: hello@qrflow.codes
ความปลอดภัย สำหรับคุณและคนที่สแกน
QRFLOW ปกป้องบัญชีของคุณอย่างไร
- Keys แสดงครั้งเดียวและเก็บเป็น SHA-256 hashes ไม่มีใครที่ QRFLOW อ่าน key กลับได้; ถ้าคุณทำหาย ให้สร้างใหม่
- ทุกคำขอถูกจำกัดขอบเขตตามบัญชีที่ key เป็นเจ้าของ code id จากบัญชีอื่นคือ 404 ไม่มีการรั่วไหล
- Scopes ถูกกำหนดคงที่ต่อ key ดังนั้น key สำหรับ reporting dashboard ไม่สามารถสร้างหรือลบ codes ได้
- 600 คำขอต่อนาทีต่อ key; เกินนั้นคือ 429 ที่ชัดเจน ไม่ใช่การชะลอสำหรับทุกคน
- ปลายทางถูก allow-list: http, https, mailto, tel, sms, geo และรายการสั้นของ app schemes (whatsapp, tg, signal, spotify, app stores) javascript:, data: และ file: ถูกปฏิเสธตอนสร้าง ดังนั้น integration ที่ถูกบุกรุกไม่สามารถเปลี่ยน codes ของคุณเป็นการโจมตีได้
- Webhook URLs ต้องเป็น https บนโฮสต์สาธารณะ; QRFLOW ไม่เรียกเครือข่ายส่วนตัวหรือตัวเอง ทุกการส่งมีการลงนามและทุก payload มี id ที่คงที่
- OAuth clients ลงทะเบียนด้วย PKCE S256 และ tokens ผูกกับเซิร์ฟเวอร์ที่ออกให้; token สำหรับ MCP server ไม่สามารถ replay บน REST API ได้
- ใครก็ได้สามารถเพิกถอน key หรือตัดการเชื่อมต่อแอปบนหน้า Account; ผลทันที
สิ่งที่ควรทำฝั่งคุณ
- ตัวแปรสภาพแวดล้อม ไม่ใช่ซอร์สโค้ด ถ้า key ไปอยู่ใน git history ให้เพิกถอนมัน
- เฉพาะฝั่งเซิร์ฟเวอร์ API ปฏิเสธ browser origins แต่ endpoint ของคุณที่ครอบมันก็ต้องมีการยืนยันตัวตนด้วย ไม่งั้นใครก็สร้าง codes ในบิลคุณได้
- ให้แต่ละ integration มี key ของตัวเองพร้อม scopes ที่ต้องการ ตั้งชื่อตาม integration การเพิกถอนหนึ่งอันจะกระทบเพียงสิ่งเดียว
- ตรวจสอบ webhook signatures และปฏิเสธ timestamps ที่เก่ากว่าห้านาที
- ถ้าข้อมูลผู้ใช้ของคุณไปอยู่ใน labels หรือ destinations จำไว้ว่า QRFLOW เก็บมัน; เก็บข้อมูลส่วนบุคคลออกจาก labels เท่าที่ทำได้
การสแกนบันทึกอะไร และไม่บันทึกอะไร
- แต่ละ redirect เก็บประเภทอุปกรณ์ ประเทศ เมือง referrer เบราว์เซอร์ ระบบปฏิบัติการและภาษา ซึ่งได้จากคำขอ และ one-way hash ของ code + วัน + IP + user agent เพื่อให้เจ้าของนับผู้เยี่ยมชมที่ไม่ซ้ำได้ hash ไม่สามารถแปลงกลับเป็นที่อยู่ได้
- ไม่มีการตั้ง cookies บนคนที่สแกน และ IP address เองไม่ได้เก็บกับการสแกน บอทที่รู้จักและ link-preview crawlers ถูกข้าม
- การลบ code ลบการสแกนของมัน การลบบัญชีลบทุกอย่าง
- ข้อความเต็ม: https://qrflow.codes/privacy และ https://qrflow.codes/terms.
เวอร์ชันและความเสถียร
API มีเวอร์ชันใน path: /api/v1 ภายใน v1 เราเพิ่ม fields, endpoints, kinds และ events; เราไม่ลบหรือเปลี่ยนชื่ออะไร และ unknown fields ใน responses ควรถูกละเว้นโดยโค้ดของคุณ
ถ้าการเปลี่ยนแปลงต้องทำลาย v1 มันจะออกเป็น /api/v2 และ v1 ยังทำงานต่อไปอย่างน้อยสิบสองเดือน เจ้าของ keys จะได้รับอีเมลเกี่ยวกับ deprecations ล่วงหน้า 90 วัน
MCP server ปฏิบัติตามกฎเดียวกันสำหรับ tools: arguments ถูกเพิ่มเท่านั้น และทุก tool คงชื่อของมัน
เอกสาร OpenAPI ที่ /api/v1/openapi.json และ Markdown ที่ /llms-full.txt ถูกสร้างจากโค้ดที่ให้บริการ API ดังนั้นมันอธิบายสิ่งที่ใช้งานอยู่ในปัจจุบัน
คำถามที่นักพัฒนาถาม
ฉันต้องจ่ายเพื่อใช้ QRFLOW API หรือไม่?
API keys มาพร้อมแผน Business, $29 ต่อเดือน รายเดือน MCP server (Claude, ChatGPT, Cursor, Claude Code) และ OAuth สำหรับแอปของคุณเองทำงานบนทุกแผนผ่านการเข้าสู่ระบบ และสิ่งที่พวกเขาสร้างได้เป็นไปตามแผน GET /catalog, GET /frames และ /preview.svg ไม่ต้องใช้ key เลย
ฉันสามารถสร้าง QR codes ฟรีผ่าน API ได้หรือไม่?
ไม่ได้ด้วย key สำหรับภาพ static ธรรมดา ตัวสร้างฟรีที่ qrflow.codes หรือไลบรารี QR โอเพนซอร์สใดๆ ก็เพียงพอ API มีไว้สำหรับ dynamic codes, โดเมนของคุณเอง, analytics, bulk และ webhooks ซึ่งเป็นสิ่งที่บัญชีที่ชำระเงินมี
ฉันสามารถเรียก API จากเบราว์เซอร์ได้หรือไม่?
ไม่ได้ มันปฏิเสธ browser origins เพื่อให้ key ไม่ไปอยู่ในหน้าเว็บ เรียกจาก route handler, server action, edge function หรือ backend แล้วเรียกจากหน้าของคุณ
ฉันได้รูปแบบภาพอะไรบ้าง?
SVG พร้อมสีของคุณ, frame, captions และโลโก้ (GET /codes/:id/image.svg, 256 ถึง 4096 px โดยประมาณ) และ PNG ธรรมดา (GET /codes/:id/image.png, 256 ถึง 2048 px) ทั้งคู่รับ bearer หรือ signed svg_download_url / png_download_url ที่ทุก Code object มี ซึ่งทำงาน 24 ชั่วโมงโดยไม่ต้อง header เครื่องมือ MCP get_qr_image คืน PNG แบบ inline พร้อมทั้งสองลิงก์
ฉันสามารถเปลี่ยน QR code หลังจากพิมพ์แล้วได้หรือไม่?
ได้ ถ้าเป็น dynamic (url, phone, email, sms, location บนแผนที่ชำระเงิน) PATCH /codes/:id ด้วย destination_data ใหม่; ภาพไม่เปลี่ยน การสแกนครั้งต่อไปไปที่ใหม่ Wi-Fi, vCard และ text codes มีเนื้อหาในภาพและไม่สามารถเปลี่ยนได้
ความแตกต่างระหว่าง short_url และ destination คืออะไร?
short_url คือลิงก์ในภาพ (go.example.com/menu) destination คือที่ที่ลิงก์นั้น redirect ไป (https://example.com/menu-fall) คุณพิมพ์ short_url ครั้งเดียวและเปลี่ยน destination ได้บ่อยเท่าที่ต้องการ
Codes ใช้โดเมนของฉันเองได้หรือไม่?
ได้ Premium เชื่อม 1 โดเมน, Business 5; คุณเพิ่ม CNAME และยืนยันบนหน้า Account Business เลือกโดเมนต่อ code ด้วย domain_id ชื่อลิงก์ (slug) สร้าง path ที่อ่านง่ายบนนั้น
การสแกนบันทึกอะไรเกี่ยวกับคนที่สแกน?
ประเภทอุปกรณ์ ประเทศ เมือง referrer เบราว์เซอร์ ระบบปฏิบัติการและภาษา จากคำขอ บวก daily hash ทางเดียวสำหรับการนับผู้เยี่ยมชมที่ไม่ซ้ำ ไม่มี cookies และ IP address ไม่ถูกเก็บ เพียงพอสำหรับกราฟ ไม่เพียงพอที่จะระบุตัวใคร รายละเอียด: https://qrflow.codes/privacy#scans
มีแพ็คเกจ npm หรือ PyPI หรือไม่?
npm: npm install qrflow\ (https://www.npmjs.com/package/qrflow), ไม่มีการพึ่งพา, ESM และ CommonJS, TypeScript types ครบ, ทำงานบน Node 18+, Bun, Deno และ Workers; มันครอบทุก endpoint, retry 429s, และรวม verifyWebhook/parseWebhook Python: ไคลเอนต์ไฟล์เดียวที่ https://qrflow.codes/sdk/qrflow.py (เฉพาะ standard library) พร้อม verify_webhook; แพ็คเกจ PyPI จะตามมา
มันทำงานกับ Claude, ChatGPT, Cursor และ Claude Code หรือไม่?
ได้ QRFLOW เป็น MCP server ที่ https://qrflow.codes/mcp. เพิ่มเป็น connector ลงชื่อเข้าครั้งเดียว แล้วถามเป็นภาษาธรรมดา Eleven tools ครอบการสร้าง แก้ไข หยุดชั่วคราว ตั้งชื่อ bulk analytics ภาพและโดเมน
ผู้ใช้ของฉันสามารถเชื่อมบัญชี QRFLOW กับแอปของฉันได้หรือไม่?
ได้ ด้วย OAuth 2.0 ลงทะเบียน client ที่ /api/oauth/register (ไม่ต้องมีบัญชี) ส่งผู้ใช้ไปที่ /oauth/authorize ด้วย PKCE และเรียก API ด้วย token ของพวกเขา Codes อยู่ในบัญชีของพวกเขาภายใต้แผนของพวกเขา
ฉันจะทดสอบ webhooks บน localhost ได้อย่างไร?
เปิดเผย dev server ของคุณด้วย tunnel (cloudflared หรือ ngrok) และใช้ที่อยู่ https เป็น webhook URL จากนั้นกด Test ที่ Account › Webhooks เพื่อรับ signed ping Webhook URLs ต้องเป็น https สาธารณะ; localhost และที่อยู่ส่วนตัวถูกปฏิเสธ
จะเกิดอะไรขึ้นกับ integration ของฉันถ้าฉันยกเลิก Business?
Keys และ webhooks ยังทำงาน 30 วัน แล้วตอบ 402 Codes, scans และโดเมนยังอยู่ในบัญชี การสมัครใหม่เปิดทุกอย่างกลับมาด้วย keys เดิม
ฉันจะสร้าง Google review, Instagram, Wi-Fi หรือ PDF code ผ่าน API ได้อย่างไร?
GET /catalog แสดงทุก kind พร้อม fields จากนั้น POST /codes ด้วย type และ fields ของ kind นั้น เพิ่ม subtype สำหรับ kinds: { type: 'url', destination_data: { subtype: 'googlereview', placeId: 'ChIJ…' } }, { type: 'wifi', destination_data: { ssid, password, encryption: 'WPA' } }, { type: 'url', destination_data: { subtype: 'instagram', handle: 'acme' } }
API อัปโหลดโลโก้ลงบน code ได้หรือไม่?
ยังไม่ได้ เพิ่มโลโก้ใน dashboard; image.svg รวมมันและ has_logo บอกว่ามีอยู่ สี frames และ captions ตั้งได้ผ่าน API ทั้งหมด
API เสถียรหรือไม่?
v1 เพิ่มเท่านั้น; ไม่เคยลบหรือเปลี่ยนชื่อ การเปลี่ยนแปลงที่ทำลายจะออกเป็น v2 โดย v1 ยังคงอยู่ อย่างน้อยสิบสองเดือนและแจ้งล่วงหน้า 90 วันทางอีเมล
สำหรับ agents, tools และผู้ช่วยที่อ่านสิ่งนี้
Machine-readable
ทุกอย่างในหน้านี้มีรูปแบบที่ซอฟต์แวร์สามารถดึงได้ ทั้งหมดถูกสร้างจากโค้ดที่ให้บริการ API ดังนั้นมันไม่ล้าสมัย
| URL | มันคืออะไร | |
|---|---|---|
| llms-full.txt | https://qrflow.codes/llms-full.txt | เอกสารอ้างอิงทั้งหมดนี้ในรูปแบบ Markdown: แนวคิด, ทุก endpoint, ทุก MCP tool, สูตร, การแก้ไขปัญหา, คำถามที่พบบ่อย สร้างจากแหล่งข้อมูลเดียวกับหน้านี้ |
| developers.md | https://qrflow.codes/developers.md | เอกสารเดียวกัน สำหรับเครื่องมือที่ดึงไฟล์ .md |
| llms.txt | https://qrflow.codes/llms.txt | ดัชนีเว็บไซต์สำหรับผู้ช่วย AI ชี้มาที่นี่ |
| The API in one page | https://qrflow.codes/qr-code-api | สิ่งที่ API ทำ, เมื่อใดที่ไลบรารีฝั่งไคลเอนต์เป็นคำตอบที่ดีกว่า, และค่าใช้จ่ายเท่าไร เวอร์ชันสั้นของเอกสารอ้างอิงนี้ สำหรับการตัดสินใจมากกว่าการสร้าง |
| openapi.json | https://qrflow.codes/api/v1/openapi.json | OpenAPI 3.1 นำเข้าไปยัง Postman, Insomnia, เครื่องสร้างโค้ด, หรือ ChatGPT Action |
| MCP server | https://qrflow.codes/mcp | Streamable HTTP, OAuth พร้อมการลงทะเบียนแบบไดนามิกหรือ Business key เป็น bearer |
| server.json | https://qrflow.codes/.well-known/mcp/server.json | ไฟล์ manifest ของ MCP registry |
| OAuth discovery | https://qrflow.codes/.well-known/oauth-authorization-server | เมตาดาต้าตาม RFC 8414; เอกสาร protected-resource อยู่ถัดจากไฟล์นี้ |
| npm package | https://www.npmjs.com/package/qrflow | npm install qrflow. ไคลเอนต์แบบมีชนิดข้อมูล, ไม่มีการพึ่งพา, การตรวจสอบ webhook ไคลเอนต์ Python ไฟล์เดียวที่ https://qrflow.codes/sdk/qrflow.py. |
| GitHub | https://github.com/nativecodeapps/qrflow-sdk | ไคลเอนต์, สแนปช็อต OpenAPI และตัวอย่างที่รันได้สำหรับ Next.js, Workers, Express, FastAPI และ Flask webhooks ยินดีรับ Issues และ PR |
คำถาม, ไอเดีย, โค้ดประเภทที่เราควรเพิ่ม: hello@qrflow.codes. ข้อกำหนด: /terms. ความเป็นส่วนตัว: /privacy.